代码之家  ›  专栏  ›  技术社区  ›  a_todd12

修复使用带有ggplot的ifelse颜色填充时的图例

  •  0
  • a_todd12  · 技术社区  · 4 月前

    使用下面的代码和数据,我试图制作一个分面图,并为“低”和“中”级别的方法画一条垂直线。

    我还有一个指标,用于衡量水平之间的差异是否具有统计学意义,当它们具有统计学意义时,我想将线条着色如下(请注意,在下面的例子中没有一条是显著的),否则它们只会被着色为黑色。

    我已经走完了大部分的路,但现在我已经完全转过身来,尤其是那些传奇人物。这就是传说目前的样子,因为-ifelse和融入的意义。

    enter image description here

    但是,如果你删除geom_vline()的-ifelse方面,得到的图例看起来像这样,这就是我想要的:

    enter image description here

    test %>%
      ggplot(aes(x = time, fill = level, color = level)) +
      geom_histogram(aes(y = after_stat(density * nrow(d))),
                     binwidth = 10,
                     position = "identity",
                     alpha = 0.25) +
      geom_vline(aes(xintercept = mean_bylevel, 
                     color = ifelse(sig == "Sig", 
                                    level, "Not")),
                 show.legend = FALSE) +
      facet_wrap(~condition_new) +
      scale_fill_manual(values = c("Low" = "palegreen", 
                                   "Middle" = "lightpink")) +
      scale_color_manual(values = c("Low" = "forestgreen", 
                                    "Middle" = "hotpink3", 
                                    "Not" = "black"))
    
    test <- structure(list(time = c(30, 70, 20, 80, 30, 50, 50, 50, 60, 60, 
    30, 50, 30, 80, 60, 70, 60, 80, 80, 60, 70, 70, 20, 60, 60, 50, 
    30, 50, 80, 60, 40, 80, 30, 60, 50, 70, 40, 20, 30, 40, 80, 30, 
    70, 70, 60, 20, 40, 30, 80, 60, 70, 70, 40, 60, 40, 30, 20, 70, 
    60, 70, 80, 70, 40, 30, 50, 80, 20, 60, 20, 50, 30, 60, 20, 30, 
    70, 20, 60, 40, 70, 70, 70, 40, 40, 80, 60, 50, 60, 30, 60, 70, 
    30, 30, 20, 60, 80, 40, 60, 40, 20, 80), level = c("Low", "Low", 
    "Middle", "Low", "Low", "Middle", "Middle", "Middle", "Low", 
    "Low", "Middle", "Middle", "Middle", "Low", "Middle", "Low", 
    "Middle", "Middle", "Low", "Middle", "Low", "Low", "Low", "Middle", 
    "Middle", "Low", "Middle", "Middle", "Low", "Middle", "Low", 
    "Low", "Low", "Middle", "Middle", "Low", "Low", "Low", "Middle", 
    "Middle", "Middle", "Low", "Middle", "Low", "Low", "Middle", 
    "Middle", "Low", "Low", "Middle", "Low", "Middle", "Middle", 
    "Low", "Low", "Middle", "Middle", "Low", "Middle", "Low", "Middle", 
    "Low", "Low", "Middle", "Middle", "Low", "Low", "Middle", "Low", 
    "Middle", "Middle", "Low", "Low", "Middle", "Middle", "Middle", 
    "Low", "Middle", "Low", "Low", "Low", "Middle", "Middle", "Low", 
    "Low", "Low", "Middle", "Middle", "Low", "Middle", "Low", "Middle", 
    "Low", "Middle", "Low", "Middle", "Middle", "Low", "Low", "Low"
    ), mean_bylevel = c(50, 49.5, 51.2, 50.4, 50, 50.1, 49.4, 51, 
    50, 49.5, 49.4, 50.1, 51, 50, 51.2, 50.4, 51.2, 50.1, 50.4, 49.4, 
    50, 50, 49.5, 51, 51.2, 50.4, 49.4, 51, 49.5, 50.1, 50, 50, 50, 
    49.4, 50.1, 50.4, 49.5, 50, 51.2, 51, 50.1, 50, 51, 50.4, 50, 
    51.2, 49.4, 49.5, 50.4, 51.2, 50, 50.1, 49.4, 49.5, 50, 51, 51.2, 
    50.4, 50.1, 50, 51, 49.5, 50, 49.4, 51.2, 50, 49.5, 49.4, 50, 
    51, 50.1, 50.4, 50.4, 50.1, 49.4, 51.2, 50, 51, 49.5, 50, 50, 
    51.2, 49.4, 49.5, 50.4, 50, 50.1, 51, 50.4, 51.2, 50, 51, 49.5, 
    49.4, 50, 50.1, 49.4, 50, 49.5, 50.4), sig = c("Not", "Not", 
    "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", 
    "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", 
    "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", 
    "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", 
    "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", 
    "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", 
    "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", 
    "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", 
    "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", 
    "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not", 
    "Not", "Not", "Not", "Not", "Not", "Not", "Not", "Not"), condition_new = c("D", 
    "C", "A", "B", "A", "D", "C", "B", "D", "C", "C", "D", "B", "A", 
    "A", "B", "A", "D", "B", "C", "A", "D", "C", "B", "A", "B", "C", 
    "B", "C", "D", "A", "D", "D", "C", "D", "B", "C", "A", "A", "B", 
    "D", "D", "B", "B", "A", "A", "C", "C", "B", "A", "D", "D", "C", 
    "C", "A", "B", "A", "B", "D", "D", "B", "C", "A", "C", "A", "A", 
    "C", "C", "D", "B", "D", "B", "B", "D", "C", "A", "A", "B", "C", 
    "D", "A", "A", "C", "C", "B", "D", "D", "B", "B", "A", "D", "B", 
    "C", "C", "A", "D", "C", "D", "C", "B")), row.names = c(NA, -100L
    ), class = c("tbl_df", "tbl", "data.frame"))
    
    2 回复  |  直到 4 月前
        1
  •  1
  •   stefan    4 月前

    实现预期结果的一个选择是设置 breaks= 为了使色阶仅包括所需的类别:

    library(ggplot2)
    
    test |>
      ggplot(aes(x = time, fill = level, color = level)) +
      geom_histogram(aes(y = after_stat(density * nrow(test))),
        binwidth = 10,
        position = "identity",
        alpha = 0.25
      ) +
      geom_vline(
        aes(
          xintercept = mean_bylevel,
          color = ifelse(sig == "Sig", level, "Not")
        ),
        show.legend = FALSE
      ) +
      facet_wrap(~condition_new) +
      scale_fill_manual(values = c(
        "Low" = "palegreen",
        "Middle" = "lightpink"
      )) +
      scale_color_manual(
        values = c(
          "Low" = "forestgreen",
          "Middle" = "hotpink3",
          "Not" = "black"
        ),
        breaks = c("Low", "Middle")
      )
    

    enter image description here

        2
  •  1
  •   Tim G    4 月前

    谢谢!你可以这样做(注:我用 50 而不是 nrow(d) 因为我没有d)。指定:

    guides(color = guide_legend(title = "Level"),
             fill = guide_legend(title = "Level"))
    

    out

    代码

    library(ggplot2)    
    
    test %>%
      ggplot(aes(x = time, fill = level, color = level)) +
      geom_histogram(aes(y = after_stat(density * 50)),
                     binwidth = 10,
                     position = "identity",
                     alpha = 0.25) +
      geom_vline(aes(xintercept = mean_bylevel, 
                     color = ifelse(sig == "Sig", 
                                    level, "Not")),
                 show.legend = FALSE) +
      facet_wrap(~condition_new) +
      scale_fill_manual(values = c("Low" = "palegreen", 
                                   "Middle" = "lightpink")) +
      scale_color_manual(values = c("Low" = "forestgreen", 
                                    "Middle" = "hotpink3")) +
      guides(color = guide_legend(title = "Level"),
             fill = guide_legend(title = "Level"))