【问题标题】:Sorting facets in ggplot using facet_grid使用 facet_grid 对 ggplot 中的构面进行排序
【发布时间】:2022-01-10 01:54:36
【问题描述】:

我已经搜索过,试图找到解决这个问题的方法。我找到了一些答案,但是当我应用它们时,它们并没有按我的预期工作(或者我可能只是做错了什么)。基本上,我有一个数据集,我正在尝试使用 facet_grid 绘制。我的问题是双重的:

  1. 我希望根据数值对网格进行排序
  2. 我有一个分组变量,我也希望按数值排序(降序),但我希望能够为组分配一个升序计数(即,最高组获得 1,第二高获得 2,等),这样我就可以先选择最高的组,然后选择第二高的组,等等。我有很多组,这些组附带的值和名称是随机的,所以我不想手动分配这些值。

这是我正在尝试做的一个示例:

df <- data.frame(grp.name = c("T","F","P","T","F","P","T","F","P","T","F","P"),
                 grp.num   = c(0.9954,0.8754,0.5006,0.9954,0.8754,0.5006,0.9954,0.8754,0.5006,0.9954,0.8754,0.5006),   
                 ind.name  = c("L","N","M","C","A","B","I","H","G","D","F","E"),   
                 amount = c(48.41234, 48.12343, 46.83546, 25.9454, 26.01568, 24.946454, 21.1, 21.4545, 20.1, 20.8, 21.5644, 16.5) )


df <- df[order(-df$grp.num,-df$amount),]

t <-  ggplot(data=subset(df,grp.name=="T"), aes(grp.name, amount, fill=grp.name, group=grp.name, shape=grp.name, facets=grp.name)) +
  geom_col(width=0.5, position = position_dodge(width=0.6)) + 
  facet_grid(grp.name + paste0("Number: ",grp.num)  ~ ind.name + paste0("Number: ",amount),switch = "y") 
t

在这种情况下,我只对组 T 进行子集化的原因是因为我想绘制出 10 个最高的组,然后使用 grid.arrange 将它们堆叠在另一个图中。我希望能够在不知道名称的情况下仅对组 1、2、3 等进行子集化,因为这些名称再次发生变化。

这是我得到的。不是按amount 对构面进行排序,而是按ind.name 按字母顺序对它们进行排序。我首先想要“L”组,因为它的数量最多,然后是“C”,然后是“I”,然后是“D”。同样,我不想手动执行此操作,因为这些值会发生变化,并且我要在许多组上重做这些图。

【问题讨论】:

    标签: r sorting ggplot2 facet-grid


    【解决方案1】:

    有时,在传递给 ggplot 函数之前进行数据准备会更简单。

    分面顺序适用于因子,因此将ind.name 转换为由amount 排序的因子。根据因子顺序创建grp_nr

    根据 OP 的 cmets 和新数据集进行了修订。

    library(ggplot2)
    library(forcats)
    library(dplyr)
    
    df %>%
      mutate(ind.name = fct_rev(fct_reorder(ind.name, amount)),
             amount = round(amount, 3),
             grp.num_lev = as.integer(fct_rev(factor(grp.num))),
             grp.num = round(grp.num, 3))%>%
      filter(grp.num_lev==1) %>%
      ggplot(aes(grp.name, amount, fill=grp.name, group=grp.name, shape=grp.name)) +   
      geom_col(width=0.5, position = position_dodge(width=0.6)) +   
      facet_grid(grp.name + paste0("Number: ", grp.num)  ~ ind.name + paste0("Number: ", amount), switch = "y")
    

    reprex package (v2.0.1) 于 2021-12-03 创建

    数据

    df <- data.frame(grp.name   = c("T","F","P","T","F","P","T","F","P","T","F","P"),
                     grp.num   = c(0.9954,0.8754,0.5006,0.9954,0.8754,0.5006,0.9954,0.8754,0.5006,0.9954,0.8754,0.5006),   
                     ind.name  = c("L","N","M","C","A","B","I","H","G","D","F","E"),   
                     amount = c(48.41234, 48.12343, 46.83546, 25.9454, 26.01568, 24.946454, 21.1, 21.4545, 20.1, 20.8, 21.5644, 16.5) )
    
    

    【讨论】:

    • 谢谢!这有效,但只解决了我的第一个问题。如何创建一个变量,将“1”分配给具有最高 grp.num 的组,将“2”分配给具有第二高 grp.num 的组等?
    • 所以,现在我有 T、F 和 P 组。T 的 grp.num 的值最高,所以我想要一个新的变量来分配 1。这样,我不会使用filter(grp.name=="T") 进行子集化,而是使用filter(grp=="1") 之类的东西进行子集化。这样做的原因是因为每次迭代的组值都会发生变化。我不想每次都查找哪个组最高。我只想选择最高的组和第二高的组和第三高的组等。这样有意义吗?
    • 谢谢!这不是我想要的,但这段代码肯定有帮助。所以,我想这就是我想要的:df %&gt;% mutate(ind.name = fct_rev(fct_reorder(ind.name, amount)), grp.num = fct_rev(factor(grp.num)), grp.num_lev = as.integer(factor(grp.num)))%&gt;% filter(grp.num_lev==1) %&gt;% ggplot(aes(grp.name, amount, fill=grp.name, group=grp.name, shape=grp.name)) + geom_col(width=0.5, position = position_dodge(width=0.6)) + facet_grid(grp.name + paste0("Number: ", grp.num) ~ ind.name + paste0("Number: ", amount), switch = "y")
    • 这更简单,我想它可以让你不必计算出 T、P 或 grp.name 中的哪一个是最高值。我已经更新了答案。
    • 其实,开枪。这行不通。在我的实际数据集中,amount 的值有很多小数位,我需要将它们四舍五入到小数点后 3 位。我有facet_grid(grp.name + paste0("Number: ", round(grp.num,3)) ~ ind.name + paste0("Number: ", round(amount,3)),但因为我们已将这些变量转化为因子,round() 将不起作用。
    【解决方案2】:

    这个怎么样:

    t <-  ggplot(data=subset(df,grp.name=="T"), aes(grp.name, amount, fill=grp.name, group=grp.name, shape=grp.name)) +
      geom_col(width=0.5, position = position_dodge(width=0.6)) + 
      facet_grid(grp.name + paste0("Number: ",grp.num)  ~ reorder(ind.name, -amount, mean) + paste0("Number: ",amount),switch = "y") 
    t
    
    

    【讨论】:

    • 成功了!!但只解决了我的第一个问题。如何创建一个变量,将“1”分配给具有最高 grp.num 的组,将“2”分配给具有第二高 grp.num 的组,等等?
    猜你喜欢
    • 1970-01-01
    • 2022-12-04
    • 2021-07-15
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2020-06-28
    相关资源
    最近更新 更多