上一个问题的解决方案可以正常工作(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
并且工作正常。有线索吗?谢谢!
答案 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))