如何在ggplot2中使用一个点条目和一个行条目创建图例?

时间:2012-03-28 21:20:19

标签: r ggplot2

我在ggplot2中制作一个图表,该图表由一组数据点绘制成点,其中由拟合模型预测的线重叠。图表的一般概念看起来像这样:

names <- c(1,1,1,2,2,2,3,3,3)
xvals <- c(1:9)
yvals <- c(1,2,3,10,11,12,15,16,17)
pvals <- c(1.1,2.1,3.1,11,12,13,14,15,16)
ex_data <- data.frame(names,xvals,yvals,pvals)
ex_data$names <- factor(ex_data$names)

graph <- ggplot(data=ex_data, aes(x=xvals, y=yvals, color=names))
print(graph + geom_point() + geom_line(aes(x=xvals, y=pvals)))

如您所见,线条和点都由分类变量(在本例中为“名称”)着色。我希望图例包含两个条目:一个标有“数据”的点和一个标记为“Fitted”的一行(表示点是真实数据且线条合适)。但是,我似乎无法让这个工作。 (真棒)指南here非常适合格式化,但不处理实际条目,而我尝试了here技术无济于事,即

print(graph + scale_colour_manual("", values=c("green", "blue", "red")) 
+ scale_shape_manual("", values=c(19,NA,NA)) 
+ scale_linetype_manual("",values=c(0,1,1))) 

主要的麻烦在于,在我的实际数据中,“名称”有> 200个不同的类别,而我只想要上面在图例中提到的2个条目。使用我的实际数据执行此操作只会产生一个无意义的图例,该图例会在页面上运行,因为图例正试图成为颜色的关键(我有太多的颜色)。

我很感激任何帮助!

2 个答案:

答案 0 :(得分:4)

我认为这很接近你想要的东西:

ggplot(ex_data, aes(x=xvals, group=names)) + 
  geom_point(aes(y=yvals, shape='data', linetype='data')) + 
  geom_line(aes(y=pvals, shape='fitted', linetype='fitted')) + 
  scale_shape_manual('', values=c(19, NA)) + 
  scale_linetype_manual('', values=c(0, 1))

这个想法是你为线条和点指定了两个美学(linetypeshape),即使对于一个有linetype的点没有任何意义美感。然后使用手动缩放比例手动将这些“无意义”美学映射到“空”值(在这种情况下为NA0)。

答案 1 :(得分:1)

这已经得到了答案,但根据反馈,我得到了另一个问题(How can I fix this strange behavior of legend in ggplot2?),这个调整可能对其他人有帮助,可能会让你头疼(抱歉不能作为对前一个答案的评论) ):

ggplot(ex_data, aes(x=xvals, group=names)) + 
  geom_point(aes(y=yvals, shape='data', linetype='data')) + 
  geom_line(aes(y=pvals, shape='fitted', linetype='fitted')) + 
  scale_shape_manual('', values=c('data'=19, 'fitted'=NA)) + 
  scale_linetype_manual('', values=c('data'=0, 'fitted'=1))