r - 如何修复 ggplot2 中图例的这种奇怪行为?

标签 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 并且它工作正常。有什么线索吗?谢谢!

最佳答案

其中一个有效而另一个无效的原因是,当 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/

相关文章:

使用新数据重用 HoltWinters 模型

r - Y轴随R中geom_density中的带宽而变化

r - ggplot : Grouped, 可变宽度的相邻条

r - 有效地将数据从 data.table 转换为矩阵(速度和内存)

r - 在 R 中生成 UUID 向量的更快方法

r - 如何阻止ggrepel标签在R/ggplot2中的gganimate帧之间移动?

r - 如何在使用 ggplot2 制作的单个图中组合填充(列)和颜色(点和线)图例?

r - 如何增加 R 中 ggplot2 箱线图之间的间距?

r - R 中具有限制的组合数

r - 如何翻译字符串中的所有字符