如何在ggplot中更改图例标题

512

我有以下的图表,它是用以下命令创建的:

library(ggplot2)

df <- data.frame(cond = factor(rep(c("A", "B"), each = 200)), 
                 rating = c(rnorm(200), rnorm(200, mean=.8)))

ggplot(df, aes(x=rating, fill=cond)) + 
geom_density(alpha = .3) +
xlab("NEW RATING TITLE") +
ylab("NEW DENSITY TITLE")

现在,我想将图例标题cond修改为新图例标题

所以,我刚刚在上述代码的末尾添加了以下行:

+labs(colour="NEW LEGEND TITLE")

但是它不起作用。怎样才是正确的做法?

enter image description here


209
labs(fill="xyz") 应该这样翻译: labs(fill="xyz") - baptiste
4
@User632716,它已经在下面某人的答案中了。 - baptiste
11
它不起作用。 - shenglih
7
对于那些需要使用多个geom_语句绘制图形的人,我建议参考这个回答:https://dev59.com/K2Ag5IYBdhLWcg3wZ6TY#38485985,这是唯一一个对我有用的答案。 - Waldir Leoncio
4
请注意,对于其他类型的图表(当您在aes中使用“colour”而不是“fill”时),OP问题代码已经可以工作。“Colour”已经是正确的,不是“fill”!我试了所有答案都没用,结果发现解决方案就在问题中!;) - Juan C
显示剩余2条评论
14个回答

567

这应该有效:

p <- ggplot(df, aes(x=rating, fill=cond)) + 
           geom_density(alpha=.3) + 
           xlab("NEW RATING TITLE") + 
           ylab("NEW DENSITY TITLE")
p <- p + guides(fill=guide_legend(title="New Legend Title"))
< p >(或者替代)< /p >
p + scale_fill_discrete(name = "New Legend Title")

20
另一个选择是 p$labels$fill <- "新图例标题" - Alex Holcombe
5
guides 和 scale_fill_discrete 之间的区别是什么? - Medhat
26
“p$labels$fill”对我没用。在使用“ggplot2_2.1.0”时,我使用“p$labels$colour <-“新图例标题””。 - ClementWalter
4
p$labels$fill很好,但如果你在aes中使用了多个变量(如linetypecolorshape),你需要分别对它们进行更改。 - discipulus
1
许多scale_fill_...函数可以将“名称”作为其参数之一。我在我的ggplot链中使用了以下代码:scale_fill_gradientn(colors = custom_colors, na.value = "transparent", name = "新图例标题") - AndrewGB
geom_histogram 中,我需要 + labs(colour = "新图例标题", fill = "新图例标题") - Antoni

445

我对此没有深入研究,但因为您在ggplot()中使用了fill=cond

 + labs(color='NEW LEGEND TITLE') 

可能之前没有起作用。但是如果你将color替换为fill,它就能工作了!

+ labs(fill='NEW LEGEND TITLE') 

在ggplot2_2.1.0版本中,这对我有用。


39
我认为这是最直接的答案,最多只需要一行额外的代码就可以完全满足OP的要求。 - Leo
5
应该两种属性color=和fill=都能够起作用。在我看来,这是对该问题的“正确”回答。 - Dan
4
填充颜色是否有效取决于实际映射到的“cond”(或其他情况下的组)。可以在http://www.cookbook-r.com/Graphs/Legends_(ggplot2)/找到一个很好的解释。 - user1442363
6
这是最好的答案。 - Akshay Gaur
7
注意:在 ggplot2 3.0+ 中,该解决方案不起作用:通过 p + guides(fill=guide_legend(title="New Legend Title")) 解决了这个问题。 - Sumax
显示剩余2条评论

67

因为您具有两个密度值,我想您可能希望使用 scale_fill_manual 设置自己的颜色。

如果是这样,您可以执行以下操作:

df <- data.frame(x=1:10,group=c(rep("a",5),rep("b",5)))

legend_title <- "OMG My Title"

ggplot(df, aes(x=x, fill=group)) + geom_density(alpha=.3) +   
    scale_fill_manual(legend_title,values=c("orange","red"))

在此输入图片描述


它也可以与scale_fill_gradient(legend_title)一起使用。 - Rolando Gonzales
它也可以与scale_fill_gradient(legend_title)一起使用。 - undefined

52

以上所有代码都对我无效。

这是我找到的并且有效的方法。

labs(color = "销售年份")

您还可以在标题和显示之间添加空格,只需在末尾添加\n即可。

labs(color = '销售年份\n')


5
这和这个答案有什么不同? - merv
5
没错,我试了上面的每个例子,这是唯一一个对我起作用的。谢谢! - SummerEla
鉴于原始帖子的问题,如果需要填充而不是颜色(或颜色),那么这将如何工作?考虑到提问的时间,可能与ggplot2版本有关。 - steveb
1
@merv 主要的区别在于这个实际上是有效的。 - Luís de Sousa
这篇文章主要是关于如何分组数据并基于此创建图例。如果你使用了像ggplot(data=df, aes(x=time, y=value, linetype=variable))中的linetype,那么labs(linetype = '销售年份\n')就可以满足你的需求。 - ibilgen

25

因为在你的代码中使用了ggplot(data, fill= cond)来创建直方图,所以你需要在标签部分也使用"fill"来添加图例标题,即+labs(fill="Title name")。如果你使用的是不同类型的绘图,其中代码是ggplot(data, colour= cond),那么你可以使用+labs(colour= "Title Name")。总之,lab参数必须与aes参数匹配。

我曾经使用+guides(fill=guide_legend("my awesome title"))来更改geom_bar图的图例标题,但在geom_point图上似乎没有效果。


1
..., 但对于 geom_point(),这个对我有效:guides(color=guide_legend("类型:")) - knb
1
@knb,你的方法可行:guides(color = guide_legend("得分排名:")) - bmc
1
这有什么不同于这个答案 - merv

10

还有一个非常简单的方法适用于一些简单的图表。

只需在您的图表中添加调用guide_legend()即可。

ggplot(...) + ... + guide_legend(title="my awesome title")

正如在非常好的 ggplot 文档中所示。

如果这不起作用,您可以通过调用guides更精确地设置指南参数:

ggplot(...) + ... + guides(fill=guide_legend("my awesome title"))

您还可以通过在调用 guides 时指定这些参数来变化形状/颜色/大小。


30
这对我不起作用,但是 qplot(…) + guides(color=guide_legend(title="sale year")) 可以使用。 - Arnaud A
谢谢 @ArnaudA,只有您提供的选项才能在由 dyno 轨迹推断包生成的图中起作用。 - Emile Zäkiev

6

我在使用ggplot中的facet_wrap,除了ArnaudA提供的解决方案外,没有其他建议适用于我。

qplot(…) + guides(color=guide_legend(title="sale year")) 

6

哎呀,这些解决方案都对我没用。我正在处理来自brms::conditional_effects()的输出。

我的解决方案需要:

+ labs( fill = "New Title", colour = "New Title", labels = "New Title" )


4
我唯一可行的解决方案是: p + guides(fill=guide_legend("新标题"))

如果您想保留图例标题但更改图例中每个项目/变量的标签,该怎么办?例如,如何将A更改为Alpha,B更改为Beta? - Angela Russell
1
我认为如果我理解你的问题正确,图例是从你的数据框中获取的,所以在最坏的情况下,你可以使用map函数与new一起重命名你的图例变量。 - Ayoub EL MAJJODI
你介意提供一下如何使用map函数来应用更改的脚本示例吗? https://stackoverflow.com/users/7739509/ayoub-el-majjodi - Angela Russell
还可以这样写:mutate(cond = recode(cond, "A" = "Alpha", "B" = "Beta")) %>% - Angela Russell
1
如果我们想要重命名一列中的图例,可以使用以下代码: new_names = {"A":"Alpha", "B":"Beta"} df['new_legends']= df['old_legend'].map(new_names) 这样就会生成一个新的列,然后您可以选择使用哪个图例。 - Ayoub EL MAJJODI

4

补充一下(其他选项对我都不起作用),您还可以使用ggplot的update_labels函数:

p <- ggplot(df, aes(x=rating, fill=cond)) + 
           geom_density(alpha=.3) + 
           xlab("NEW RATING TITLE") + 
           ylab("NEW DENSITY TITLE")

update_labels(p, list(colour="MY NEW LEGEND TITLE")

这也将使您能够更改 x 和 y 轴标签,使用单独的行:

update_labels(p, list(x="NEW X LABEL",y="NEW Y LABEL")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接