【问题标题】:Legend only shows one layer图例只显示一层
【发布时间】:2020-02-03 05:44:52
【问题描述】:

我遇到了 R ggplot2 的问题。我使用 facet 来表示我的数据的特征“齿轮”,然后对于 y 轴特征,我想使用 2 种类型的图例。但我的代码仅显示一种类型(第 1 层)数据的图例。 * 我希望 data2 使用彩色圆点,data1 使用黑色 * (shape=4)。 请帮忙。谢谢。

data1 <- subset(mtcars, carb==4)
data2 <- subset(mtcars, !carb==4)
ggplot(mapping = aes(x = mpg, y = wt, color= carb)) + 
  geom_point(data=data2, mapping = aes(x = mpg, y = wt, color= carb), size=0.2) + 
  facet_wrap(~ gear, nrow = 1) +
  labs(y='wt value', x= "mpg type") + 
  geom_point(data=data1, color = "black", shape=4, size=0.7, mapping=aes(x = mpg, y = wt, color= carb)) +
  facet_wrap(~ gear, nrow = 1) 

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    需要做一些小改动。你不能像这样使用 2 facets。 看看下面的代码。您可以使 carb 成为data2 中的一个因素,这将为您提供彩色点和图例。如果那是您正在寻找的东西,您会发现上述几点的不同之处。 PS:我把磅值放大了一点。

    library(ggplot2)
    data <- mtcars 
    data1 <- subset(data, carb==4)
    data2 <- subset(data, !carb==4)
    ggplot(mapping = aes(x = mpg, y = wt, color= carb)) + 
      geom_point(data=data2, mapping = aes(x = mpg, y = wt, color= factor(carb)), size=4) + 
      geom_point(data=data1, mapping=aes(x = mpg, y = wt), shape =4, size=8, color= 'black') +
      facet_wrap(~ gear, nrow = 1) +
      theme_bw() +
      labs(y='wt value', x= "mpg type") 
    

    reprex package (v0.3.0) 于 2020 年 2 月 3 日创建


    library(ggplot2)
    data <- mtcars 
    data1 <- subset(data, carb==4)
    data2 <- subset(data, !carb==4)
    ggplot(mapping = aes(x = mpg, y = wt, color= carb)) + 
      geom_point(data=data2, mapping = aes(x = mpg, y = wt, color= factor(carb)), size=4) + 
      geom_point(data=data1, mapping=aes(x = mpg, y = wt, shape = factor(carb)),  size=8, color= 'black') +
      scale_shape_manual(values = c(4))+
      facet_wrap(~ gear, nrow = 1) +
      labs(shape = '')+
      #scale_color_discrete(guide = FALSE)+
      theme_bw() +
      labs(y='wt value', x= "mpg type") 
    

    reprex package (v0.3.0) 于 2020 年 2 月 3 日创建

    我将形状带回 data1 的美学中,但随后 labs(shape = '') 关闭了此标题。通过添加scale_shape_manual(values = c(4)) 来定义形状。 因为我不确定,如果您想要第一个图例,我已将#scale_color_discrete(guide = FALSE) 放入代码中,但对其进行了注释。您可以删除评论并完全摆脱第一个图例。

    【讨论】:

    • 您好,Marblo,感谢您的回复。通常彩色点不会有问题,它们是默认生成的。我的问题在图例部分,另一层不会出现。我希望在当前传奇之后有“X 4”。
    • @Quan Cui,好的明白。我已经编辑了原始帖子,请参见水平线下方。
    • 我建议不要使用labs(shape = ''),因为 ggplot 实际上会在这里绘制一些东西。请改用shape = NULL。此外,您无需致电labs 两次;)
    【解决方案2】:

    仅为出现在aes 中的变量创建图例。所以你需要给它添加shape。有许多不同的方法可以为满足一个条件的变量更改颜色,并且可能最简单的方法是您所做的,以绘制不同的子集。如果你决定这样做,最好的做法是不要在主调用中使用aes,因为它可能会搞乱你的情节。

    我为您的形状使用了条件语句,并使用scale_shape 格式化该形状。我个人认为情节不必要的额外颜色差异,我可能不会这样做,但因为你已经要求它 - 我们开始吧。

    我还将 carb 转换为字符 - 您也可以将其转换为因子。因为它是一个分类变量,所以也显示它是有意义的。

    根据评论编辑

    像往常一样,有很多方法可以实现目标。下面两种不同的方式更改/删除图例的标题,只显示4 的形状和值。代码中的注释。

    选项 1:从没有 '4' 的子集中删除形状,更改图例标题,例如使用labs

    library(ggplot2)
    
    ggplot() + 
      geom_point(data = subset(mtcars, carb !=4), aes(x = mpg, y = wt, color = as.character(carb)), shape = 1) +
      geom_point(data = subset(mtcars, carb ==4), aes(x = mpg, y = wt, shape = carb  == 4), color = 'black')+
      scale_shape_manual(values = c(`TRUE` = 4, `FALSE` = 1)) +
      labs(shape = NULL, color = 'Model prediction') +
      guides(color = guide_legend(order = 1), shape = guide_legend(order = 2)) +
    ## I had to change the legend order, because the shape legend would draw on top otherwise. See link below! 
      facet_wrap(~ gear, nrow = 1)
    

    现在 - 传说有点分开,相信我,将它们拉得更近是相当棘手的。

    因此:

    选项 2 分解您的分类数据,子集您的数据,在 scale_color 函数中使用 drop = FALSE,并使用 override.aes 更改图例美学。听起来像个 hack,但仍然比试图缩短两个传奇人物之间的距离更容易、更安全。

    mtcars2 <- mtcars
    mtcars2$carb2 <- factor(mtcars$carb, levels = c(1:3,6,8,4))
    
    ggplot() + 
      geom_point(data = subset(mtcars2, carb != 4), aes(x = mpg, y = wt, color= carb2), shape = 1) +
      geom_point(data = subset(mtcars, carb == 4), aes(x = mpg, y = wt), shape = 4, color = 'black') +
      facet_wrap(~ gear, nrow = 1) +
      scale_color_discrete(drop = FALSE) +
      labs(color = 'Model prediction') +
      guides(color = guide_legend(override.aes = list(shape = c(rep(1, 5), 4),
                                                      color = c(RColorBrewer::brewer.pal(5, 'Dark2'), 'black'))))
    

    reprex package (v0.3.0) 于 2020 年 2 月 3 日创建

    一些学习的链接

    Legend order is weird

    change shapes in legend

    【讨论】:

    • 您好 Tjebo,谢谢。这种方式对我有用。但是如何更改图例部分中的文本?我想要 1)“as.character(carb)”更改为“模型预测”,2)不显示“carb==4”和“o FALSE”,对于图例的第二部分,只显示“ x 4" 。谢谢。
    • 非常感谢。
    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多