R语言使用dplyr调用外部变量绘图报ggplot美学映射错误如何解决
问题根因
- 你在全局定义的
k向量长度为7,dplyr按gender分组运算时,每个分组会返回7条FreqRisk计算结果,最终dfsex1共有14行数据,但**dfsex1数据框中没有存储对应的k值列** - ggplot绘图时,
aes(x = k)会调用全局环境下长度为7的k向量,和14行的数据集长度不匹配,因此触发 aesthetic 长度不一致的报错
修复后的完整代码
library(dplyr) library(ggplot2) k = c(0,0.5,1,1.5,2,2.5,3) dfsex1 <- df %>% group_by(gender) %>% # 将k值作为列存入结果,每个分组对应全部k值,最终14行数据每行都有对应k reframe(k = k, FreqRisk = mean(Freq) + k * sd(Freq)) ggplot(dfsex1, aes(x = k, y = FreqRisk, group = as.factor(gender), color = as.factor(gender))) + geom_line(size = 0.5) + scale_x_continuous(limits = c(0,3), breaks = k) + scale_y_continuous(limits = c(0,3), breaks = k) + scale_color_manual(name = "Gender", labels = c("F", "M"), values = c("red", "blue")) + ggtitle("2012-2015") + labs(x = "k", y = "Riskmeasure") + theme_bw() + theme(plot.title = element_text(hjust = 0.5))
关键修改说明
- 把原来的
summarise换成reframe,该函数专门用于分组后返回多条结果,同时把k作为列写入最终的dfsex1数据集,保证每行数据都有对应的k值,和全局k向量的对应关系完全匹配 - 删掉了
geom_line中冗余的aes(size = gender)参数,避免和外层指定的size=0.5冲突 - 把x轴y轴的breaks直接调用已经定义的
k向量,减少重复代码
内容的提问来源于stack exchange,提问作者romario udo
相关产品推荐
相关产品推荐

