使用循环在构面中创建多个 geom_hline 对象时,如何有效地创建手动图例?

Posted

技术标签:

【中文标题】使用循环在构面中创建多个 geom_hline 对象时,如何有效地创建手动图例?【英文标题】:How can I efficiently create a manual legend when using a loop to create multiple geom_hline objects in a facet? 【发布时间】:2016-12-10 22:50:06 【问题描述】:

我编写了以下示例来说明我的问题。

我想为我绘制的每个 geom_hline 创建自己的自定义图例和配色方案。我可以通过使用这个答案Construct a manual legend for a complicated plot来实现这一点。

但是,我正在创建一个函数,该函数将使用循环在绘图上创建任意数量的水平线。这意味着我需要动态地将变量提供给 aes_string 函数。然而, aes_string(yintercept = colname, colour = colname) 不起作用。因为我会收到以下错误'geom_hline Error: Discrete value supplied to continuous scale'

这导致我创建了以下解决方案,该解决方案涉及为我希望绘制的每一行创建一个额外的列,其中包含一个可以被 scale_colour_manual 中的向量拾取的名称。我觉得这既麻烦又低效。

这按预期工作,但我有 2 个问题:

    为什么aes_string(yintercept = colname, colour = colname_colour) 有效而aes_string(yintercept = colname, colour = colname) 无效。

    必须有更有效的方法来实现我得到的输出,我缺少什么?

示例代码的输出:http://imgur.com/a/dvzAM

mean_wt <- data.frame(cyl = c(4, 6, 8)
, wt = c(2.28, 3.11, 4.00)
, wt2 = c(3.28, 4.11, 5.00)
, wt_col = c("a", "a", "a")
, wt_col2 = c("b", "b", "b"))

hline_listA <- list()
for(i in 2:3)
  colname <- mean_wt[,i]
  colname_colour <- mean_wt[,i+2]
  grob <- geom_hline(data =mean_wt
, aes_string(yintercept = colname, colour = colname_colour) )
  hline_listA[[i-1]] <- grob

ggplot() +
  geom_point(data = mtcars, aes(mpg, wt)) +
  hline_listA +
  facet_wrap(~ cyl, scales = "free", nrow = 1) +
  scale_colour_manual(name = "legend", values = c( 
    "a" = "seagreen1"  
    , "b" = "darkorange" ))

【问题讨论】:

【参考方案1】:

我无法想象我会使用循环在 ggplot 中做任何事情的情况。实现您想要的通常方法是以 ggplot 可以使用的方式调整数据框。这是一个更短的解决方案,只需调用一次geom_line

library(ggplot2)
mean_wt <- data.frame(cyl = c(4, 6, 8), 
                      wt = c(2.28, 3.11, 4.00, 3.28, 4.11, 5.00),
                      wt_col = c("a", "a", "a", "b", "b", "b"))

ggplot() +
  geom_point(data = mtcars, aes(mpg, wt)) +
  geom_hline(data = mean_wt,aes(yintercept = wt, color = wt_col)) +
  facet_wrap(~ cyl, scales = "free", nrow = 1) +
  scale_colour_manual(name = "legend", 
                      values = c("a" = "seagreen1",
                                 "b" = "darkorange" ))

【讨论】:

您好,谢谢!我对 R 很陌生,并且在尝试创建它时感觉我缺少一个基本概念,而我缺少的是一个“长”数据框。我假设这在尝试手动将 alpha 值分配给不同的填充时也会起作用,即使用原始数据框中的 scale_fill_alpha 和第四列。就像那一分钱掉了哈哈需要重写一堆毫无意义的循环。谢谢!

以上是关于使用循环在构面中创建多个 geom_hline 对象时,如何有效地创建手动图例?的主要内容,如果未能解决你的问题,请参考以下文章

使用循环在 ggplot 中创建具有不同 Y 轴值的多个图

在循环中在 Highcharts 中创建多个系列

如何使用多个 for 循环在 php 中创建 sql 语句

在 for 循环中使用 udf 在 Pyspark 中创建多个列

循环在图表控件中创建多个系列

For 循环无法在 Adob​​e Animate CC 中创建多个矩形