通过y轴值对ggplot的每个方面中的因子进行排序

ohn*_*lus 3 r ggplot2

让我们说,在R中,我有一个数据框字母,数字和动物,我想以图形方式检查这三者之间的关系.我可以做点什么.

library(dplyr)
library(ggplot2)
library(gridExtra)

set.seed(33)
my_df <- data.frame(
letters = c(letters[1:10], letters[6:15], letters[11:20]),
animals = c(rep('sheep', 10), rep('cow', 10), rep('horse', 10)),
numbers = rnorm(1:30)
    )

ggplot(my_df, aes(x = letters, y = numbers)) + geom_point() +
   facet_wrap(~animals, ncol = 1, scales = 'free_x')
Run Code Online (Sandbox Code Playgroud)

我会得到一些看起来像的东西.未分类的信件

但是,我希望x轴的顺序取决于y轴的顺序.根据这个例子,这很容易做到没有方面.我甚至可以为每只动物制作一个有序的图形,然后用grid.arrange将它们绑定在一起,如本例所示

my_df_shp <- my_df %>% filter(animals == 'sheep')
my_df_cow <- my_df %>% filter(animals == 'cow')
my_df_horse <- my_df %>% filter(animals == 'horse')

my_df_shp1 <- my_df_shp %>% mutate(letters = reorder(letters, numbers))
my_df_cow1 <- my_df_cow %>% mutate(letters = reorder(letters, numbers))
my_df_horse1 <- my_df_horse %>% mutate(letters = reorder(letters, numbers))

p_shp <- ggplot(my_df_shp1, aes(x = letters, y = numbers)) + geom_point()
p_cow <- ggplot(my_df_cow1, aes(x = letters, y = numbers)) + geom_point()
p_horse <- ggplot(my_df_horse1, aes(x = letters, y = numbers)) + geom_point()

grid.arrange(p_shp, p_cow, p_horse, ncol = 1)
Run Code Online (Sandbox Code Playgroud)

有序的动物图

我不是特别喜欢这个解决方案,因为它不容易推广到有很多方面的情况.

我宁愿做一些像ggplot(my_df,aes(x = y_ordered_by_facet(字母,by =数字),y =数字))+ geom_point()+ facet_wrap(〜animals,ncol = 1,scales ='free_x')

其中y_ordered是一些巧妙地命令字母因子与数字顺序相同的函数.

接近这一点,但似乎不起作用的东西是

ggplot(my_df, aes(x = reorder(letters, numbers), y = numbers)) +
     geom_point() + facet_wrap(~animals, ncol = 1, scales = 'free_x')
Run Code Online (Sandbox Code Playgroud)

这不太有效,因为订单最终生效,而不是在小平面包装之后生效,因此每个小组的标签排列不正确. 几乎订购了

任何聪明的想法?

MrF*_*ick 9

我发现dplyr group_by()在处理每个组中不同的因子级别时效果不佳.因此,一种解决方法是考虑为每个动物字母组合创建一个独特的新因子并对其进行排序.首先,我们使用动物+字母创建交互变量,并确定动物的每个字母的正确顺序

new_order <- my_df %>% 
  group_by(animals) %>% 
  do(data_frame(al=levels(reorder(interaction(.$animals, .$letters, drop=TRUE), .$numbers)))) %>% 
  pull(al)
Run Code Online (Sandbox Code Playgroud)

现在我们在要绘制的数据中创建交互变量,使用这个新的排序,最后更改标签,使它们看起来就像是字母了

my_df %>% 
  mutate(al=factor(interaction(animals, letters), levels=new_order)) %>%
  ggplot(aes(x = al, y = numbers)) +
    geom_point() + facet_wrap(~animals, ncol = 1, scales = 'free_x') +
    scale_x_discrete(breaks= new_order, labels=gsub("^.*\\.", "", new_order))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述