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

如何用ggplot在同一张图中绘制密度图与直方图并自定义颜色

实现思路与代码示例

仅使用常规ggplot函数完全可以实现该需求,核心逻辑是为不同几何图层单独指定对应的数据子集,无需依赖额外扩展包。

关键实现步骤

  • 图层拆分:geom_density()仅传入var1 == 'x'的子集绘制密度图,geom_histogram()仅传入var1 == 'y'的子集绘制直方图
  • 轴对齐优化:如果需要让直方图和密度图的y轴刻度统一(都使用密度值),可以给直方图的aes添加y = after_stat(density)参数,避免计数和密度单位不匹配的问题
  • 自定义颜色:可以直接在图层参数中设置fill值指定颜色,也可以通过映射+手动刻度的方式保留图例

可运行代码示例

library(ggplot2)
set.seed(1)
# 生成测试数据
Dat = rbind(
  data.frame(var1 = 'x', var2 = rnorm(1000)), 
  data.frame(var1 = 'y', var2 = rnorm(200, -10, 5))
)

ggplot() +
  # 绘制var1=x的密度图,透明度0.4
  geom_density(
    data = Dat[Dat$var1 == 'x', ],
    aes(x = var2, fill = "x组密度"),
    alpha = 0.4
  ) +
  # 绘制var1=y的直方图,透明度0.4,y轴用密度值和密度图对齐
  geom_histogram(
    data = Dat[Dat$var1 == 'y', ],
    aes(x = var2, y = after_stat(density), fill = "y组直方图"),
    alpha = 0.4,
    bins = 15 # 可自行调整直方图柱数
  ) +
  # 自定义两组图形的颜色
  scale_fill_manual(
    name = "分组",
    values = c("x组密度" = "#1f77b4", "y组直方图" = "#ff7f0e")
  )

如果不需要显示图例,直接把fill参数放到aes外面,写死为色值即可,无需额外配置scale_fill_manual。

内容的提问来源于stack exchange,提问作者Brian Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:15:04