如何在ggplot2中修复这个奇怪的传奇行为?

时间:2013-12-25 01:18:37

标签: r ggplot2

上一个问题的解决方案可以正常工作(How can I make a legend in ggplot2 with one point entry and one line entry?),除非您更改图例的标签。

这就是我的意思。一些数据:

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

这很好用:

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

但这不是(图表为空):

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

(唯一不同的是将data字改为spreads)。请注意,我可以将data更改为abc并且工作正常。有线索吗?谢谢!

2 个答案:

答案 0 :(得分:2)

其中一个作品而另一个作品之所以没有,是因为当values是一个未被修饰的向量时,它们“将按顺序(通常是按字母顺序)与比例限制匹配”({{3 }})。您更改了哪个顺序是按字母顺序排列的。

这样可行:

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

将您的值放回原始顺序,但命名向量也有效(并且似乎更安全/更清晰):

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

答案 1 :(得分:0)

我不知道为什么不起作用。但是,如果您只想在标签中使用Spread,则以下解决方案可以正常工作

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