R:对ggplot中的变量名称重新排序

时间:2019-03-20 18:31:46

标签: r ggplot2 visualization

对于以“文本+数字”形式书写的变量名(例如,Day1,Day2,...),是否可以在使用ggplot时对其进行排序?

$(OBJDIR)/%.o :
    $(CC) -c -o $@ $< $(CPPFLAGS) 

上面的代码生成下图,但是,dog1后跟dog10而不是dog2。可以将其从小到大排序吗?

2 个答案:

答案 0 :(得分:2)

这是仅使用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(v0.2.1)于2019-03-20创建

答案 1 :(得分:0)

这是使用gtools对值进行排序的解决方案。

library(gtools)
library(tidyverse)

dt %>% 
  mutate(name = factor(as.character(dt$name), 
                       levels = mixedsort(as.character(dt$name)))) %>% 
  ggplot(aes(x = name, y = age))+
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  geom_line() +
  geom_point()

Plot