如何在ggplot中从单个数据框添加多个图层?
嗨,别担心,新手碰到这种ggplot图层映射的问题太正常啦!先来说说你原来的代码为啥跑不起来——你在第二个geom_jitter里写了y=c,这里的c没有被包裹在aes()里,ggplot会把它当成R的内置函数c()而不是你数据框里的列名,所以自然会报错啦!
当然不是必须拆分两个数据框才能实现,这里给你两种更方便的解决方案:
方案1:在每个图层单独指定映射
修正你原来的代码,把第二个图层的y变量放进aes()里就可以正常运行了:
library(ggplot2) # 全局指定x轴,每个图层单独指定y轴 ggplot(df, aes(x = visit)) + geom_jitter(aes(y = b), color = "blue") + geom_jitter(aes(y = c), color = "red")
这里我们把x轴的映射放在全局的ggplot()函数里,两个图层各自在aes()中声明对应的y轴变量,ggplot就会自动从df里读取对应的列数据了。
方案2:转换为长格式数据(推荐)
ggplot最适配**整洁数据(tidy data)**结构,也就是每一行对应一个独立的观测值。我们可以用tidyr包的pivot_longer()把当前的宽格式数据转成长格式,这样只需要一个图层就能完成绘图:
library(ggplot2) library(tidyr) # 将b、c列转换为键值对形式的长格式 df_long <- df %>% pivot_longer(cols = c(b, c), names_to = "variable", values_to = "value") # 一次绘图即可区分两个变量 ggplot(df_long, aes(x = visit, y = value, color = variable)) + geom_jitter() + # 自定义颜色匹配你的需求 scale_color_manual(values = c("b" = "blue", "c" = "red"))
这种方法的优势特别明显:如果以后你要添加更多类似的变量(比如d、e列),只需要修改pivot_longer的cols参数,不用重复添加图层,代码更简洁易维护,还能自动生成清晰的图例。
内容的提问来源于stack exchange,提问作者user9629272
相关产品推荐
相关产品推荐

