ggplot2 add manual legend for two data series

痞子三分冷 提交于 2021-02-17 05:39:05

问题


I have this dataframe:

     Control    Stress days  sd_control  sd_stress
X1 0.9702100 0.9343627   X1 0.001900535 0.07035645
X2 0.9666619 0.8595523   X2 0.014946893 0.04066567
X3 0.9165654 0.7160598   X3 0.072655343 0.07025344
X4 0.9208237 0.6668044   X4 0.050870831 0.08736982
X5 0.8766547 0.7660685   X5 0.073588197 0.04868614
X6 0.9599553 0.7937444   X6 0.041559836 0.05326769
X7 0.9736297 0.8188934   X7 0.003817743 0.06272428

and based on this data I've done this plot:

With the following code:

significance <- data.frame(days=c("X2","X3","X4","X6"),value=c(1.02,1.02,1.02,1.02))
ggplot(my_data, aes(x=days,y=Control,group=1)) +
  geom_errorbar(aes(ymax = Control-sd_control, ymin = Control+sd_control),
                width=0.2, size=0.5) +
  geom_errorbar(aes(ymax = Stress-sd_stress, ymin = Stress+sd_stress),
                width=0.2, size=0.5) +
  geom_point(shape=23,color='gray45',fill='gray45',size=4) + 
  geom_line(color='gray45',size=1) +
  geom_point(data=my_data,aes(x=days,y=Stress),size=4,shape=22,fill='gray',color='gray',
             show.legend = TRUE) +
  geom_line(data = my_data, aes(x=days,y=Stress),color='gray',size=1) +
  geom_point(data=significance, aes(x=days,y=value),shape='*',size=6) +
  labs(x='\nDAT',y='RWC\n') +
  scale_y_continuous(labels = percent_format(accuracy = 1),limits = c(0.5,1.04), 
                     expand = c(0,0), breaks = seq(from=0.5,to=1,by=0.05)) +
  scale_x_discrete(expand = c(0.07, 0),labels = c(0,7,14,21,27,35,42)) +
  ggtitle('Relative Water Content\n') +
  theme(panel.border = element_rect(colour = "black", fill=NA, size=0.5),
        panel.background = element_rect(fill = 'white'),
        plot.title = element_text(hjust = 0.5,family = 'Calibri',face='bold'),
        axis.title = element_text(family = 'Calibri',face = 'bold'),
        axis.text = element_text(family = 'Calibri')
        )

I want to add a legend in the bottom-right on the plot that describres the Control and Stress Treatmentes with the same shape of the points. I've tried several approaches that I've found here as set a color vector and scale_colour_manual attributes but none of them worked. Any suggestion?


回答1:


The issue is that you use the color, fill and shape arguments.

  • To get a legend you have to map on aesthetics, i.e. inside aes().
  • After doing so ggplot will add lgends(s) automatically and you can apply scale_xxx_manual to get the desired colors, fill and shapes.
  • However, as this results in 3 legends (was not able to figure out why the merging of the legends failed) I use guides to keep only one of them and guide_legend to style the legend. Try this:
library(ggplot2)
library(scales)

ggplot(my_data, aes(x=days, group=1)) +
  geom_errorbar(aes(ymax = Control-sd_control, ymin = Control+sd_control),
                width=0.2, size=0.5) +
  geom_errorbar(aes(ymax = Stress-sd_stress, ymin = Stress+sd_stress),
                width=0.2, size=0.5) +
  geom_point(aes(y=Control, color = "Control", fill = "Control", shape = "Control"), size=4) + 
  geom_line(aes(y=Control, color = "Control"),size=1) +
  geom_point(aes(y=Stress, color = "Stress", fill = "Stress", shape = "Stress"), size=4) +
  geom_line(aes(y=Stress, color = "Stress"), size=1) +
  geom_point(data=significance, aes(y=value),shape='*',size=6) +
  scale_color_manual(values = c("Control" = 'gray45', "Stress" = 'gray') ) +
  scale_fill_manual(values = c("Control" = 'gray45', "Stress" = 'gray') ) +
  scale_shape_manual(values = c("Control" = 23, "Stress" = 22)) +
  guides(shape = FALSE, fill = FALSE, 
         color = guide_legend(override.aes = list(shape =  c("Control" = 23, "Stress" = 22),
                                                  fill = c("Control" = 'gray45', "Stress" = 'gray')))) +
  labs(x='\nDAT',y='RWC\n') +
  scale_y_continuous(labels = percent_format(accuracy = 1),limits = c(0.5,1.04), 
                     expand = c(0,0), breaks = seq(from=0.5,to=1,by=0.05)) +
  scale_x_discrete(expand = c(0.07, 0), labels = c(0,7,14,21,27,35,42)) +
  ggtitle('Relative Water Content\n') +
  theme(panel.border = element_rect(colour = "black", fill=NA, size=0.5),
        panel.background = element_rect(fill = 'white'),
        plot.title = element_text(hjust = 0.5,family = 'Calibri',face='bold'),
        axis.title = element_text(family = 'Calibri',face = 'bold'),
        axis.text = element_text(family = 'Calibri')
  )



来源:https://stackoverflow.com/questions/62688799/ggplot2-add-manual-legend-for-two-data-series

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!