对于以“text + number”形式编写的变量名(例如Day1,Day2,...),是否可以在使用ggplot时对其进行排序?
library(ggplot2)
dogname = paste0('dog', 1:20)
dt = as.data.frame(cbind(dogname, seq(1,10.5,0.5)))
colnames(dt) = c('name', 'age')
ggplot(dt, aes(x=name, y=age))+
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
geom_line() +
geom_point()
上面的代码生成下面的图表,但是dog1后跟dog10而不是dog2。是否有可能将它从小到大排序?
这是使用tidyverse
包的一种方式。我们可以用str_extract
从名称中获取数字,因为我想你会按顺序给出这些名称,而不是按顺序从头创建它们。然后,我们可以使用fct_reorder
通过将数字排序为数字而不是字符串来对名称进行排序。你可以看到dt$name
现在是一个正确顺序的水平因素。
library(tidyverse)
dt <- tibble(
name = str_c("dog", 1:20),
age = seq(1,10.5,0.5)
) %>%
mutate(
order = str_extract(name, "\\d+") %>% as.integer,
name = fct_reorder(name, order)
)
dt$name
#> [1] dog1 dog2 dog3 dog4 dog5 dog6 dog7 dog8 dog9 dog10 dog11
#> [12] dog12 dog13 dog14 dog15 dog16 dog17 dog18 dog19 dog20
#> 20 Levels: dog1 dog2 dog3 dog4 dog5 dog6 dog7 dog8 dog9 dog10 ... dog20
ggplot(dt, aes(x=name, y=age))+
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
geom_line() +
geom_point()
#> geom_path: Each group consists of only one observation. Do you need to
#> adjust the group aesthetic?
由reprex package创建于2019-03-20(v0.2.1)