【问题标题】:哪些因素会影响 ggplot 图例的排序方式
【发布时间】:2022-01-14 08:16:47
【问题描述】:

我正在 R 中创建一个散点图,用户可以在其中添加或删除显示固定参考值的水平线。在此过程中,我注意到更改参考线的名称会重新排列图例,因此水平线有时会出现在散布图例元素之前,有时会出现在之后。

比较:

下面是一个可复制的例子


YEAR = as.integer(rep(2010:2020,5))
SERIES_NAME = rep(LETTERS[1:5], each = 11)
OBS_VALUE = runif(n = 55, min = -5, max = 20)
EA = ifelse(SERIES_NAME=='A', 'Option 1', 'Option 2')

df <- data.frame(YEAR=YEAR,
            SERIES_NAME=SERIES_NAME,
            OBS_VALUE=OBS_VALUE,
            EA=EA) 

注释掉两条线中的一条或另一条,以生成一个图形,在其中命名图例上的水平线。

aaaaaaa <- "RGCUZYMSFP"  # appears above
aaaaaaa <- "IZTCYUXGBO"  # appears below

然后生成图表:


df %>% 
  select(YEAR,SERIES_NAME, OBS_VALUE, EA) %>%
  ggplot() + 
  ggplot2::geom_point(
    ggplot2::aes(
      x = YEAR,
      y = OBS_VALUE,
      col = EA),
    size = 2) +
  ggplot2::guides(
    color = ggplot2::guide_legend(nrow = 2, 
                                  byrow = TRUE))+ 
  scale_linetype_manual(values = 2) +
  scale_x_continuous(breaks = seq(2010,2020,5))+
  geom_hline(aes(yintercept = EAMean,
                 linetype = aaaaaaa),
             size = 1, color = "black")  

我还注意到更改变量的名称会更改输出。如果我将变量的名称从 aaaaaaaa(字母 a 的 8 倍)更改为 aaaaaaa(字母 a 的 7 倍)并相应地更新水平线的代码,则图例会重新排序

有没有一种方法可以让我更加一致地控制我的图例项目的去向?

【问题讨论】:

  • 您可以通过 scale_xxx_yyy(..., guide = guide_legend(order = 1)) 设置图例的顺序,以使图例出现在顶部, ... = 2 用于第二个等等在。根据文档,ggplot2 将由... a secret algorithm 选择(参见?guide_legend)。 (:

标签: r ggplot2 legend


【解决方案1】:

正如@stefan 正确指出的那样,它取决于“秘密算法”。虽然如果没有设置“顺序”,算法的结果是不可预测的,但我们可以逆向工程。

guide_legend() 方法的these lines 中,我们看到构造了一个“哈希”,它对于指南的标题、标签、方向和名称是(相对)唯一的。这里的不可预测性在于散列可以为相对相似(但不相同)的输入创建大不相同的散列。

稍后,在guides_merge() 内部函数中,我们可以看到指南(或指南定义)在其哈希上进行了拆分。由于哈希对相同的输入产生相同的结果,这会指示 ggplot2 由于共享的标题、标签、方向和名称,这些指南是否“可合并”。

'order' 参数的作用是,'order' 被粘贴在哈希前面,因此在字典顺序中,order = 0 的指南位于 order = 1 的前面。没有设置顺序参数的指南将99 作为顺序。因为拆分返回的结果是根据拆分级别排序的,所以这有效地按顺序对输出进行排序,然后是哈希。

【讨论】:

  • 好的,那么在实践中,在上面的示例中,我如何确保虚线始终位于底部?
  • 我想你可以使用scale_linetype_manual(values = 2, guide = guide_legend(order = 999))
  • 确实如此!谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 2011-05-11
相关资源
最近更新 更多