从 ggplot2 中的图例类别中删除 stat_summary 符号

Posted

技术标签:

【中文标题】从 ggplot2 中的图例类别中删除 stat_summary 符号【英文标题】:Removing stat_summary symbols from legend categories in ggplot2 【发布时间】:2020-06-24 18:42:51 【问题描述】:

我有以下代码创建了两个小提琴图:

ggplot(both,aes(x=levelsname,y=loginc,fill=levelsname))+
geom_violin() +
  stat_summary(fun.y = mean,
               aes(shape="Mean"),
               colour='black',
               geom="point",
               size=3)+
    scale_shape_manual("Summary Statistics", values=c("Mean"="+"))+  
  scale_fill_manual(values=c('gray70','orange','red'))+
  scale_x_discrete(name="Site Category")+
  scale_y_continuous(name = "Log(Incidence/100,000")+
  guides(fill=guide_legend(title = "Site Category"))+
  facet_grid(~ANA)+
  theme_classic()+
  theme(axis.text.x=element_blank())

除了图例之外,这些图的一切都是正确的。我正在尝试从站点类别下的图例中删除黑色圆圈,并将它们替换为 + 符号。我还想在站点类别图例项下方移动 + 和表示图例符号,使其看起来像一个图例。

【问题讨论】:

show.legend = FALSE 添加到统计调用中 可能是骗子。 Remove legend ggplot 2.2 @camille 添加 show.legend=FALSE 会删除站点类别图例中的圆圈,但也会删除图例中的平均值。 哦,知道了。您可以将override.aes 用于特定的图例类型,在本例中为填充图例。似乎this 的帖子应该涵盖您,this 也可能有所帮助 @Tjebo 他们不想删除任何整个图例,这就是该帖子的内容 【参考方案1】:

您不应该在aes 调用中使用shape="Mean"。这不是美学映射!将它放在aes 中会使ggplot 认为您正在设置shape 以映射到始终采用值"mean" 的字符变量。于是就有了奇怪的传说。

您可以在stat_summary 调用中使用shape="+" 作为参数来获得您想要的效果。您可能还必须删除scale_shape_manual("Summary Statistics", values=c("Mean"="+")) 行,因为不再有形状比例。

要回答您问题的最后一部分,如果您想为您的图例设置一个单独的“平均值”行,您可以向映射到 @987654334 的变量添加一个额外的“平均值”级别@审美(然后手动将其填充设置为透明)。见下文:

d <- data.frame(x=factor(c(1,2)), y=rnorm(100))

ggplot(d, aes(x,y, group=x, fill=x)) + 
   geom_violin() + 
   stat_summary(shape="+", fun="mean", aes(fill="Mean"), geom="point", size=3) +
   scale_fill_manual(values=c("blue", "red", "#00000000"), limits=c(1,2,"Mean"))

编辑:我找到了一种方法来摆脱图例的 Mean 行中 + 周围的框,但这是一个可怕的 hack。您需要两个stat_summary 层,一个将color 设置为透明并带有美学映射(这样图例框是透明的,但这会使图例“+”也透明),然后第二个直接用color="black" 替换图例中的“+”而不是方框中的“+”。

ggplot(d, aes(x,y, group=x, fill=x, color=x)) + 
   geom_violin() + 
   stat_summary(shape="+", fun="mean", aes(fill="Mean",color="Mean"), geom="point", size=3)+
   stat_summary(shape="+", fun="mean",color="black", geom="point", size=3) +
   theme_classic() + 
   scale_fill_manual(values=c("lightblue", "red", "#00000000"), limits=c(1,2,"Mean"))+  
   scale_color_manual(values=c("black", "black", "#00000000"), limits=c(1,2,"Mean"))

【讨论】:

这似乎可行,我遇到的唯一问题是我的图例自动按字母顺序排序,导致“平均值”被放在我的图例的中心并丢弃色标。跨度> @coconn41 抱歉,我没有想到这一点。您必须在scale_fill_manual 层中设置订单级别。我会更新我的答案.. @coconn41 我已经编辑过了,如果 Mean 不是按字母顺序排列的最后一个,那么您需要在每个比例的 limits() 选项中设置级别的顺序。

以上是关于从 ggplot2 中的图例类别中删除 stat_summary 符号的主要内容,如果未能解决你的问题,请参考以下文章

如何在ggplot2的图例中斜体化一个类别

ggplot2 remove legend 删除注释

R语言ggplot2可视化:去除可视化结果中的NA图例删除缺失值图例

r 从ggplot2图中删除图例

当有多个 [重复] 时删除 ggplot2 中的额外图例

避免使用 facet_wrap 从 ggplot 进行情节转换中的图例重复