You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

错误原因

  1. 主图初始以NULL作为数据源,容易导致美学映射的继承混淆
  2. ggMarginal指定了完整的x和y映射,但仅需Y轴分布,多余的X轴映射会引发不必要的匹配问题
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:25:21