删除图例ggplot 2.2


249

我正在尝试保留一层(平滑)的图例,并删除另一层(点)的图例。我曾尝试用guides(colour = FALSE)和关闭这些传说geom_point(aes(color = vs), show.legend = FALSE)

编辑:由于此问题及其答案很普遍,因此似乎出现了一个可重现的示例:

library(ggplot2)
ggplot(data = mtcars, aes(x = mpg, y = disp, group = gear)) +
geom_point(aes(color = vs)) +
geom_point(aes(shape = factor(cyl))) +
geom_line(aes(linetype = factor(gear))) +
geom_smooth(aes(fill = factor(gear), color = gear)) + 
theme_bw() 

在此处输入图片说明


5
一个最小的可重现示例将简单得多。在冗长的代码行中,似乎有很多不必要的代码(对于当前的问题),并且由于当前编写的代码,它们是完全不可复制的。
mnel

Answers:


443

来自r cookbook,其中bp是您的ggplot:

删除图例以获取特定的美感(填充):

bp + guides(fill=FALSE)

指定比例时也可以完成此操作:

bp + scale_fill_discrete(guide=FALSE)

这将删除所有图例:

bp + theme(legend.position="none")

25
回复@Alex的评论:请注意,这theme_bw()可能会干扰使用进行的任何定义theme()。使用时theme_bw(),请确保在更改任何其他主题选项之前将其添加到绘图中。
fabern

1
但是当我做这样的事情时bp + theme(legend.position="none") + theme_classic(),传说又回来了。那么如何删除呢?
loveR

3
@loveR将theme_classic放在第一位:bp + theme_classic() + theme(legend.position="none")
假设

1
这对我的情节没有影响。我成功使用了@Tjebo的方法。
James Hirschorn

80

可能还有另一种解决方案:
您的代码是:

geom_point(aes(..., show.legend = FALSE))

您可以在调用指定show.legend参数:aes

geom_point(aes(...), show.legend = FALSE)

然后相应的图例应该消失


3
这是一个非常好的方法。也更加直观。
patL

2
当我使用geom_text注释彩色线条时,这是一种从图例中删除字母的解决方案。没有scale_label命令(这guide(label = FALSE)也没有道理),也没有任何作用。谢谢!
Melissa Key)

45

由于问题和user3490026的答案是搜索排行榜的热门话题,因此,我提出了一个可重复的示例,并简要说明了到目前为止提出的建议,并提供了明确解决OP的问题的解决方案。

这样ggplot2做的一件事可能是引起混淆的是,当某些图例与同一个变量关联时,它将自动混合。例如,factor(gear)出现两次,一次为linetype,一次为fill,产生一个合并的图例。相比之下,gear由于没有与相同,因此具有自己的图例条目factor(gear)。到目前为止提供的解决方案通常效果很好。但有时,您可能需要覆盖指南。请参阅底部的最后一个示例。

# reproducible example:
library(ggplot2)
p <- ggplot(data = mtcars, aes(x = mpg, y = disp, group = gear)) +
geom_point(aes(color = vs)) +
geom_point(aes(shape = factor(cyl))) +
geom_line(aes(linetype = factor(gear))) +
geom_smooth(aes(fill = factor(gear), color = gear)) + 
theme_bw() 

在此处输入图片说明

删除所有图例:@ user3490026

p + theme(legend.position = "none")

删除所有图例:@duhaime

p + guides(fill = FALSE, color = FALSE, linetype = FALSE, shape = FALSE)

关闭传说:@Tjebo

ggplot(data = mtcars, aes(x = mpg, y = disp, group = gear)) +
geom_point(aes(color = vs), show.legend = FALSE) +
geom_point(aes(shape = factor(cyl)), show.legend = FALSE) +
geom_line(aes(linetype = factor(gear)), show.legend = FALSE) +
geom_smooth(aes(fill = factor(gear), color = gear), show.legend = FALSE) + 
theme_bw() 

删除填充以使线型可见

p + guides(fill = FALSE)

与上面一样,通过scale_fill_函数:

p + scale_fill_discrete(guide = FALSE)

现在,对OP的请求的一个可能答案

“保留一层(平滑)的图例并删除另一层(点)的图例”

临时关闭一些特设功能

p + guides(fill = guide_legend(override.aes = list(color = NA)), 
           color = FALSE, 
           shape = FALSE)  

在此处输入图片说明


2
只是注意到最后一个绘图中的蓝色填充颜色没有出现在图形上,所以不确定为什么...
PatrickT

warnings()在运行代码后键入,您将看到蓝丝带不显示的原因。
markus

@markus:谢谢!由于问题是独立的,因此我不会费心编辑示例。但是,对于se未计算时使用图例几乎没有意义。也许值得在github上解决一个问题,但我现在没有精力...
PatrickT

13

如果您的图表同时使用fillcolor美学,则可以通过以下方式删除图例:

+ guides(fill=FALSE, color=FALSE)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.