【问题标题】:Order of legend entries in ggplot2 barplots with coord_flip()ggplot2 条形图中的图例条目顺序与 coord_flip()
【发布时间】:2011-09-04 13:15:26
【问题描述】:

我正在努力在我用 R 中的 ggplot2 制作的图表中正确排序变量。

假设我有一个数据框,例如:

set.seed(1234)
my_df<- data.frame(matrix(0,8,4))
names(my_df) <- c("year", "variable", "value", "vartype")
my_df$year <- rep(2006:2007)
my_df$variable <- c(rep("VX",2),rep("VB",2),rep("VZ",2),rep("VD",2))
my_df$value <- runif(8, 5,10) 
my_df$vartype<- c(rep("TA",4), rep("TB",4))

生成下表:

  year variable    value vartype
1 2006       VX 5.568517      TA
2 2007       VX 8.111497      TA
3 2006       VB 8.046374      TA
4 2007       VB 8.116897      TA
5 2006       VZ 9.304577      TB
6 2007       VZ 8.201553      TB
7 2006       VD 5.047479      TB
8 2007       VD 6.162753      TB

共有四个变量(VX、VB、VZ 和 VD),属于两组变量类型(TA 和 TB)。

我想将值绘制为 y 轴上的水平条,首先按变量组垂直排序,然后按变量名称,按年份分面,x 轴上的值和填充颜色对应变量组。 (即在这个简化的例子中,顺序应该是,从上到下,VB,VX,VD,VZ)

1) 我的第一次尝试是尝试以下方法:

ggplot(my_df,        
    aes(x=variable, y=value, fill=vartype, order=vartype)) +
       # adding or removing the aesthetic "order=vartype" doesn't change anything
     geom_bar() + 
     facet_grid(. ~ year) + 
     coord_flip()

但是,变量按字母倒序排列,而不是按 vartypeorder=vartype 美学被忽略。

2) 在回答了我昨天发布的一个类似问题后,我根据Order Bars in ggplot2 bar graph 的帖子尝试了以下操作:

my_df$variable <- factor(
  my_df$variable, 
  levels=rev(sort(unique(my_df$variable))), 
  ordered=TRUE
)

这种方法确实在图中按字母垂直顺序获取变量,但忽略了变量应该首先按变量组排序的事实(顶部是 TA 变量,下面是 TB 变量)。

3) 下面给出与2(上面)相同的:

my_df$vartype <- factor(
  my_df$vartype, 
  levels=sort(unique(my_df$vartype)), 
  ordered=TRUE
)

...与第一种方法具有相同的问题(按字母倒序列出的变量,忽略组)

4) 另一种方法,基于对 Order Bars in ggplot2 bar graph 的原始答案,也提供与上述 2 相同的平台

my_df <- within(my_df, 
                vartype <- factor(vartype, 
                levels=names(sort(table(vartype),
                decreasing=TRUE)))
                ) 

我感到困惑的是,尽管有多种方法,但审美 order=vartype 被忽略了。不过,它似乎可以解决一个不相关的问题:http://learnr.wordpress.com/2010/03/23/ggplot2-changing-the-default-order-of-legend-labels-and-stacking-of-data/

希望问题清楚,欢迎提出任何建议。

马特奥

我昨天发布了一个类似的问题,但不幸的是,我在描述问题并提供可重现的示例时犯了几个错误。 从那以后,我听取了一些建议,彻底搜索了 stakoverflow 以寻找类似的问题,并据我所知应用了每个建议的解决方案组合,但无济于事。 我再次发布问题,希望能够解决我的问题,并希望对其他人有所帮助。

【问题讨论】:

  • 它不是 stackoverflow.com/q/5208679/602276 的副本。请仔细阅读问题。
  • 确实是同一个问题。您需要按照您希望它们在图中的顺序来指定因子的水平。链接的答案告诉你如何做到这一点。
  • +1 用于学习提供可重现的代码。
  • 更一般地说,我相信在订购变量​​时存在与 coord_flip() 相关的问题。在我的原始数据框中(不是上面显示的那个),图例中的组顺序是正确的,并且与数据框的顺序相对应,但是变量的垂直顺序是颠倒的。 (虽然情节在概念上有所不同,但问题与learnr.files.wordpress.com/2010/03/… 类似)。据我所知,这超出了数据帧的顺序问题,而是与 ggplot2 中的顺序反转有关的问题,可能与 coord_flip 有关。

标签: r ggplot2


【解决方案1】:

这与 ggplot 几乎没有关系,而是一个关于生成变量排序以用于重新排序因子水平的问题。这是您的数据,使用各种功能实现更好的效果:

set.seed(1234)
df2 <- data.frame(year = rep(2006:2007), 
                  variable = rep(c("VX","VB","VZ","VD"), each = 2),
                  value = runif(8, 5,10),
                  vartype = rep(c("TA","TB"), each = 4))

注意这种方式variablevartype 是因素。如果它们不是因素,ggplot() 将强制它们,然后你会得到字母顺序。我已经说过了,毫无疑问会再说一遍; 首先 您开始绘制/进行数据分析之前,将您的数据转换为正确的格式。

您需要以下顺序:

> with(df2, order(vartype, variable))
[1] 3 4 1 2 7 8 5 6

您应该注意到,我们首先通过vartype 获得排序,然后才通过variable vartype 的级别。如果我们使用它来重新排序variable 的级别,我们会得到:

> with(df2, reorder(variable, order(vartype, variable)))
[1] VX VX VB VB VZ VZ VD VD
attr(,"scores")
 VB  VD  VX  VZ 
1.5 5.5 3.5 7.5 
Levels: VB VX VD VZ

(忽略attr(,"scores") 位并专注于级别)。这有正确的顺序,但ggplot() 会将它们从下到上绘制,而您想要从上到下。我对ggplot() 不够熟悉,不知道这是否可以控制,因此我们还需要在对order() 的调用中使用decreasing = TRUE 来反转排序。

把这一切放在一起,我们有:

## reorder `variable` on `variable` within `vartype`
df3 <- transform(df2, variable = reorder(variable, order(vartype, variable,
                                                         decreasing = TRUE)))

与您的绘图代码一起使用时:

ggplot(df3, aes(x=variable, y=value, fill=vartype)) +
       geom_bar() + 
       facet_grid(. ~ year) + 
       coord_flip()

产生这个:

【讨论】:

  • 感谢您的解决方案!有用。但是,经过彻底的搜索,我还发现,我最初的问题是使用 coord_flip() 时常见的一个特殊情况。
  • @MatteoS 你现在明白为什么人们觉得这是另一个重复了吗?答案是一样的——按照你想要的顺序重新排列因子的水平。这里的问题是如何得出该排序。所有的 ggplot 代码都是多余的和分散注意力的。它确实有助于将问题归结为基本水平,并准确地告诉我们您想要什么。 Andrie 的回答几乎是正确的,直到您碰巧在 cmets 中提到您不想手动输入订单。
  • 现在我明白了,但 ggplot2 是这里的问题。使用coord_flip(),轴被翻转,原本排序为L-> R的变量再排序为B-> T,而图例不匹配。
  • @MatteoS 问一下,但鉴于按您想要的顺序获取因子水平的一般解决方案,我认为没有必要这样做。
  • @MatteoS scale_fill_discrete(guide = guide_legend(reverse=TRUE)) 相当于 top.down=TRUE 反转图例中的顺序。
猜你喜欢
  • 2020-08-24
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多