ggplot添加ggMarginal问题:单物种散点图+全物种Y轴密度分布
解决ggMarginal多数据集绘图报错问题
问题背景
需要实现:
- 绘制Setosa物种(df1)的Sepal.Length为X轴、Sepal.Width为Y轴的散点图
- 用
ggMarginal展示所有物种(df2)的Sepal.Width的Y轴密度分布,对比个体与群体表现
但原代码运行报错。
原报错代码
library(dplyr) library(ggplot2) library(ggExtra) df1 <- iris %>% filter(Species == "setosa") df2 <- iris #尝试的代码(报错): ggplot(NULL, aes(x=Sepal.Length, y=Sepal.Width))+ geom_point(data=df1, size=2)+ ggMarginal(data = df2, aes(x=Sepal.Length, y=Sepal.Width), type="density", margins = "y", size = 6)
错误原因
- 主图初始以
NULL作为数据源,容易导致美学映射的继承混淆 ggMarginal指定了完整的x和y映射,但仅需Y轴分布,多余的X轴映射会引发不必要的匹配问题ggMarginal的参数传递未聚焦于需求的Y轴变量
修正后的代码
library(dplyr) library(ggplot2) library(ggExtra) df1 <- iris %>% filter(Species == "setosa") df2 <- iris # 修正代码:主图基于df1构建,ggMarginal仅传入df2的Y轴变量 ggplot(df1, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point(size = 2) + ggMarginal( data = df2, aes(y = Sepal.Width), # 仅指定Y轴变量,匹配margins="y"的需求 type = "density", margins = "y", size = 6 )
代码说明
- 主图直接以df1为数据源,默认继承美学映射,简化代码逻辑
ggMarginal明确传入df2作为数据源,仅指定y=Sepal.Width,精准生成所有物种Sepal.Width的Y轴密度分布- 实现了Setosa个体散点图与全体物种Y轴分布的对比,符合需求
内容的提问来源于stack exchange,提问作者zmcclean
相关产品推荐
相关产品推荐

