如何用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
相关产品推荐
相关产品推荐

