为复杂的情节构建手动图例
Posted
技术标签:
【中文标题】为复杂的情节构建手动图例【英文标题】:Construct a manual legend for a complicated plot 【发布时间】:2013-06-13 11:24:31 【问题描述】:我不知道如何为这个情节手动设置图例。我真正想要的只是右侧的简单图例,它使用三种颜色并在每种颜色旁边都有一个名称。
当前代码如下所示:
a <-c("S1","S2","S3","S4","S5","S6","S7","S8","S9") #names
b <-c(0.23,0.26,0.55,0.56,0.36,0.23,0.18,0.06,0.04) #mean t0
c <-c(0.64,0.6,0.81,1.4,0.89,0.55,0.48,0.22,0.09) #mean t1
d <-c(0.20,0.23,0.52,0.53,0.33,0.20,0.15,0.04,0.03) #SD low t0
e <-c(0.26,0.29,0.58,.59,0.39,0.26,0.21,0.08,0.05) #SD high t0
f <-c(0.67,0.63,0.86,1.44,0.93,0.59,0.51,0.25,0.10) #SD high t1
g <-c(0.61,0.57,0.78,1.36,0.85,0.53,0.45,0.19,0.08) #SD low t1
h <-c(0.41,0.34,0.26,0.84,0.53,0.32,0.30,0.16,0.05) #absolute change
data <- data.frame(a,b,c,d,e,f,g,h)
ggplot(data=data,aes(a)) +
geom_bar(stat="identity", aes(y=h),fill="#62c76b",colour="#333333")+ #green
geom_line(aes(y=b,group=1),size=1.0,colour="#f04546") + #red
geom_point(aes(y=b),size=3, colour="#f04546") + #red
geom_errorbar(aes(ymin=d, ymax=e), colour="#f04546", width=0.1, size=.8) +
geom_line(aes(y=c,group=1),size=1.0,colour="#3591d1") + #blue
geom_point(aes(y=c),size=3, colour="#3591d1") + #blue
geom_errorbar(aes(ymin=f, ymax=g), colour="#3591d1", width=0.1, size=.8) +
ylab("Symptom severity") + xlab("PHQ-9 symptoms") +
ylim(0,1.6) +
theme_bw() +
theme(axis.title.x = element_text(size = 15, vjust=-.2)) +
theme(axis.title.y = element_text(size = 15, vjust=0.3))
【问题讨论】:
非常有帮助 - 如果没有文档和教程,我从哪里获得代码? 【参考方案1】:如果您正在努力更改linetypes
,以下答案应该会有所帮助。 (这是Andy W对解决方案的补充。)
我们将尝试扩展学习模式:
cols <- c("LINE1"="#f04546","LINE2"="#3591d1","BAR"="#62c76b")
line_types <- c("LINE1"=1,"LINE2"=3)
ggplot(data=data,aes(x=a)) +
geom_bar(stat="identity", aes(y=h,fill = "BAR"))+ #green
geom_line(aes(y=b,group=1, colour="LINE1", linetype="LINE1"),size=0.5) + #red
geom_point(aes(y=b, colour="LINE1", fill="LINE1"),size=2) + #red
geom_line(aes(y=c,group=1,colour="LINE2", linetype="LINE2"),size=0.5) + #blue
geom_point(aes(y=c,colour="LINE2", fill="LINE2"),size=2) + #blue
scale_colour_manual(name="Error Bars",values=cols,
guide = guide_legend(override.aes=aes(fill=NA))) +
scale_linetype_manual(values=line_types)+
scale_fill_manual(name="Bar",values=cols, guide="none") +
ylab("Symptom severity") + xlab("PHQ-9 symptoms") +
ylim(0,1.6) +
theme_bw() +
theme(axis.title.x = element_text(size = 15, vjust=-.2)) +
theme(axis.title.y = element_text(size = 15, vjust=0.3))
但是,我们得到的是以下结果:
问题是linetype
没有合并到主图例中。
请注意,我们没有给方法scale_linetype_manual
命名。
这里的诀窍是给它命名与您用于命名scale_colour_manual
的名称相同。
更具体地说,如果我们将相应的行更改为以下内容,我们将获得所需的结果:
scale_linetype_manual(name="Error Bars",values=line_types)
现在,用同样的想法很容易改变线条的大小。
请注意,geom_bar
不再具有颜色属性。 (我没有尝试解决这个问题。)另外,添加带有颜色属性的geom_errorbar
会破坏结果。如果有人能想出一个更好的解决方案来解决这两个问题,那就太好了。
【讨论】:
【参考方案2】:您需要将属性映射到美学(aes 语句中的颜色)以生成图例。
cols <- c("LINE1"="#f04546","LINE2"="#3591d1","BAR"="#62c76b")
ggplot(data=data,aes(x=a)) +
geom_bar(stat="identity", aes(y=h, fill = "BAR"),colour="#333333")+ #green
geom_line(aes(y=b,group=1, colour="LINE1"),size=1.0) + #red
geom_point(aes(y=b, colour="LINE1"),size=3) + #red
geom_errorbar(aes(ymin=d, ymax=e, colour="LINE1"), width=0.1, size=.8) +
geom_line(aes(y=c,group=1,colour="LINE2"),size=1.0) + #blue
geom_point(aes(y=c,colour="LINE2"),size=3) + #blue
geom_errorbar(aes(ymin=f, ymax=g,colour="LINE2"), width=0.1, size=.8) +
scale_colour_manual(name="Error Bars",values=cols) + scale_fill_manual(name="Bar",values=cols) +
ylab("Symptom severity") + xlab("PHQ-9 symptoms") +
ylim(0,1.6) +
theme_bw() +
theme(axis.title.x = element_text(size = 15, vjust=-.2)) +
theme(axis.title.y = element_text(size = 15, vjust=0.3))
我了解 Roland 的来源,但由于这只是 3 个属性,而且叠加条和误差条会产生复杂性,因此将数据保留为宽格式可能是合理的。 using geom_pointrange 可以稍微降低它的复杂性。
要更改原始误差线图例的背景颜色,请将+ theme(legend.key = element_rect(fill = "white",colour = "white"))
添加到绘图规范中。要合并不同的图例,您通常需要对所有元素进行一致的映射,但它目前正在为我生成黑色背景的工件。我以为guide = guide_legend(fill = NULL,colour = NULL)
会将图例的背景设置为空,但事实并非如此。也许值得另一个问题。
ggplot(data=data,aes(x=a)) +
geom_bar(stat="identity", aes(y=h,fill = "BAR", colour="BAR"))+ #green
geom_line(aes(y=b,group=1, colour="LINE1"),size=1.0) + #red
geom_point(aes(y=b, colour="LINE1", fill="LINE1"),size=3) + #red
geom_errorbar(aes(ymin=d, ymax=e, colour="LINE1"), width=0.1, size=.8) +
geom_line(aes(y=c,group=1,colour="LINE2"),size=1.0) + #blue
geom_point(aes(y=c,colour="LINE2", fill="LINE2"),size=3) + #blue
geom_errorbar(aes(ymin=f, ymax=g,colour="LINE2"), width=0.1, size=.8) +
scale_colour_manual(name="Error Bars",values=cols, guide = guide_legend(fill = NULL,colour = NULL)) +
scale_fill_manual(name="Bar",values=cols, guide="none") +
ylab("Symptom severity") + xlab("PHQ-9 symptoms") +
ylim(0,1.6) +
theme_bw() +
theme(axis.title.x = element_text(size = 15, vjust=-.2)) +
theme(axis.title.y = element_text(size = 15, vjust=0.3))
要去除图例中的黑色背景,您需要使用override.aes
参数到guide_legend
。这样做的目的是让您指定可能未正确分配的图例的特定方面。
ggplot(data=data,aes(x=a)) +
geom_bar(stat="identity", aes(y=h,fill = "BAR", colour="BAR"))+ #green
geom_line(aes(y=b,group=1, colour="LINE1"),size=1.0) + #red
geom_point(aes(y=b, colour="LINE1", fill="LINE1"),size=3) + #red
geom_errorbar(aes(ymin=d, ymax=e, colour="LINE1"), width=0.1, size=.8) +
geom_line(aes(y=c,group=1,colour="LINE2"),size=1.0) + #blue
geom_point(aes(y=c,colour="LINE2", fill="LINE2"),size=3) + #blue
geom_errorbar(aes(ymin=f, ymax=g,colour="LINE2"), width=0.1, size=.8) +
scale_colour_manual(name="Error Bars",values=cols,
guide = guide_legend(override.aes=aes(fill=NA))) +
scale_fill_manual(name="Bar",values=cols, guide="none") +
ylab("Symptom severity") + xlab("PHQ-9 symptoms") +
ylim(0,1.6) +
theme_bw() +
theme(axis.title.x = element_text(size = 15, vjust=-.2)) +
theme(axis.title.y = element_text(size = 15, vjust=0.3))
【讨论】:
安迪,非常感谢。 (1) 有没有办法将 2 行与 1 条图例“合并”? (2) 有没有办法手动更改图例?例如。 LINE1 和 LINE2 周围的灰色边框的颜色?我在 ggplot2 文档(我的所有代码都来自)中没有找到任何内容。 @Torvon,要合并图例,您通常需要为每个几何图形提供一致的映射。我将更新一个示例,但这会产生一个奇怪的伪影(可能是因为线条没有内部填充)。可能值得另一个问题,看看它是否可以根据您的喜好进行修改。我会说虽然我不认为不同的传说是一个好主意。有两个传说 IMO 非常简单。 这非常有用,但我遇到的唯一问题是我的图例与您的第一个示例不同(误差线、Line1、Line2、Bar、Bar) ,而是出现“错误栏,栏,第 1 行,第 2 行,栏”...知道我可以传递给scale_color_manual
的哪些参数来调整它吗?
可能值得创建一个可重现的示例并提出一个新问题@dre。如果没有那个可重复的例子,真的很难提供帮助。以上是关于为复杂的情节构建手动图例的主要内容,如果未能解决你的问题,请参考以下文章