上一个问题的解决方案工作正常( 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
并且它工作正常。有什么线索吗?谢谢!
最佳答案
其中一个有效而另一个无效的原因是,当 values
是未命名向量时,它们“将按顺序(通常按字母顺序)与比例限制进行匹配”( http://docs.ggplot2.org/0.9.3.1/scale_manual.html)。您更改了字母顺序。
所以这有效:
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))
关于r - 如何修复 ggplot2 中图例的这种奇怪行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20768286/