R语言ggplot如何添加图例?

我用ggplot画了三个图每个图有两个曲线函数,请问如何在每个图右侧加上图例?如图所示那种。谢谢各位大神了!附代码: library("ggplot2…
关注者
9
被浏览
118,611

6 个回答

以第一个图为例进行说明

px <- ggplot()+
  geom_point(data = plotdatax, aes(x= number , y= datax, color = "red", shape = "A", linetype = "A"), size=2 ) +
  geom_line(data = plotdatax, aes(x=number,y = dataxo, color = "black", shape = "B", linetype = "B"), size = 1 ) +
  scale_color_manual(name = "group",
                     values = c('red' = 'red', "black" = 'black'), 
                     breaks = c("red", "black"),
                     labels = c('数据', '原始数据')) + 
  scale_shape_manual(name = "group",
                     values = c("A" = 16, "B" = NA), 
                     labels = c('数据', '原始数据')) + 
  scale_linetype_manual(name = "group",
                          values = c("A" = 0, "B" = 1), 
                          labels = c('数据', '原始数据'))
px + theme(legend.title=element_blank(),
           legend.position = c(0.9, 0.9))

得到的图为

虽然与题主要求相符,但其实上述代码会报warning,如下

原因是geom_point中的aes没有linetype参数;

而geom_line中的aes没有shape参数,但如果前者不对linetype进行赋值,后者不对shape进行赋值,则得到的图形会有两个图例块。

更简洁更准确的做法应该是先对这些点进行标签,然后设置每个标签的color, shape以及linetype,代码如下:

plotdatax$group = ifelse(datax == dataxo, "c2", "c1")
px <- ggplot(plotdatax, aes(color = group, shape = group, linetype = group))+
  geom_point(aes(x= number , y= datax), size=2 ) +
  geom_line(aes(x=number,y = dataxo), size = 1 ) +
  scale_color_manual(name = "group",
                     values = c("c1" = 'red', "c2" = 'black'), 
                     labels = c('数据', '原始数据')) + 
  scale_shape_manual(name = "group",
                     values = c("c1" = 16, "c2" = NA), 
                     labels = c('数据', '原始数据')) + 
  scale_linetype_manual(name = "group",
                        values = c("c1" = 0, "c2" = 1), 
                        labels = c('数据', '原始数据'))
px + theme(legend.title=element_blank(),
           legend.position = c(0.9, 0.9))

得到如下图

不过这样黑线少掉了红色点,也就是认为那些不在直线上的点才是第二类的点。如果坚持题主的意思,则完全可以重新构造数据集,代码如下

length <-length(datax)
x.matrix1 <- cbind(1:length, datax)
x.matrix2 <- cbind(1:length, dataxo)
x.matrix <- rbind(x.matrix1, x.matrix2)
colnames(x.matrix) <- c("number", "datax")
plotdatax <- as.data.frame(x.matrix)
plotdatax$group <- rep(c("c1", "c2"), each = length)
px <- ggplot(plotdatax, aes(x = number, y = datax, color = group, shape = group, linetype = group))+
  geom_point(size=2) +
  geom_line(size = 1) +
  scale_color_manual(name = "group",
                     values = c("c1" = 'red', "c2" = 'black'), 
                     labels = c('数据', '原始数据')) + 
  scale_shape_manual(name = "group",
                     values = c("c1" = 16, "c2" = NA), 
                     labels = c('数据', '原始数据')) + 
  scale_linetype_manual(name = "group",
                        values = c("c1" = 0, "c2" = 1), 
                        labels = c('数据', '原始数据'))
px + theme(legend.title=element_blank(),
           legend.position = c(0.9, 0.9))

PS: 在看到该问题时,我对ggplot中legends的使用也不是很熟,所以算是从零开始,将回答这个问题的过程(遇到的坑)记录在下面的博文中了