为了账号安全,请及时绑定邮箱和手机立即绑定

为复杂的图构建手动图例

/ 猿问

为复杂的图构建手动图例

慕用2447696 2019-10-08 09:54:12

我无法弄清楚如何为该图手动设置图例。我真正想要的只是一个简单的图例,该图例使用三种颜色并在每种颜色旁边都有一个名称。


http://img.mukewang.com/5d9bec570001d50305510475.jpg

当前代码如下:


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))


查看完整描述

2 回答

?
哔哔one

您需要将属性映射到美学(es语句中的颜色)以生成图例。


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))

//img4.mukewang.com/5d9bec650001a54f06720671.jpg

我知道Roland的来源,但是由于这仅是3个属性,并且由于条形图和错误条形的叠加而产生了复杂性,因此按原样将数据保留为宽格式可能是合理的。使用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))

//img4.mukewang.com/5d9bec7200011da306720671.jpg

要消除图例中的黑色背景,您需要在中使用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))

//img3.mukewang.com/5d9bec7d0001392106720672.jpg

查看完整回答
反对 回复 2019-10-08
?
慕田峪9158850

如果您正在努力进行更改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))

但是,我们得到以下结果: 

//img3.mukewang.com/5d9bec8a000160de06000380.jpg

问题在于linetype不会在主图例中合并。注意,我们没有给该方法起任何名字scale_linetype_manual。在这里起作用的技巧是给它命名与您使用的命名相同的名称scale_colour_manual。更具体地说,如果将相应的行更改为以下内容,则将获得所需的结果:


scale_linetype_manual(name="Error Bars",values=line_types)

//img4.mukewang.com/5d9beca2000149c106000380.jpg

现在,使用相同的想法很容易更改行的大小。

请注意,geom_bar不再具有color属性。(我没有尝试解决此问题。)此外,添加geom_errorbarcolor属性会破坏结果。如果有人能提出一个更好的解决方案,同时解决这两个问题,那就太好了。


查看完整回答
反对 回复 2019-10-08

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信