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

时间:2016-08-04 17:18:48

标签: r ggplot2 geom-hline

我编写了下面的例子来说明我的问题。

我想为每个geom_hline I绘图创建自己的自定义图例和颜色方案。我可以通过使用这个答案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中的向量拾取的名称。我发现这很麻烦且效率低下。

这是按预期工作但我有两个问题:

  1. 为什么aes_string(yintercept = colname, colour = colname_colour)有效,aes_string(yintercept = colname, colour = colname)没有。

  2. 必须有一种更有效的方法来实现我的输出,我缺少什么?

  3. 示例代码的输出: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 个答案:

答案 0 :(得分:0)

我无法想象我会在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" ))

enter image description here