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

如何用ggplot实现Smoker分组的多变量分面叠加直方图

实现多变量分面的分组叠加直方图

嘿,这个需求完全可以通过tidy数据格式轻松搞定,不用写循环也不用反复筛选子集!核心就是把分组变量(Smoker/Non-smoker)和数值变量一起整理成长格式,让ggplot自动处理分面和分组映射。

步骤1:整理成长格式数据

首先我们需要把原数据转换成“长格式”,同时保留Smoker这个分组标记。这样每一行都会包含:分组信息、数值变量名、变量值,完美适配ggplot的映射逻辑:

library(tidyverse)

# 保留Smoker列和所有数值变量,转成长格式
df_long <- df %>%
  select(Smoker, where(is.numeric)) %>%  # 筛选出分组列和数值列
  pivot_longer(
    cols = -Smoker,  # 除了Smoker之外的列都转成键值对
    names_to = "key",  # 数值变量名存到key列
    values_to = "value"  # 变量值存到value列
  )

如果你习惯用旧版的gather函数,也可以替换成下面的代码,效果完全一致:

df_long <- df %>%
  select(Smoker, where(is.numeric)) %>%
  gather(key = "key", value = "value", -Smoker)

步骤2:绘制分面叠加直方图

有了整理好的长格式数据,只需要一次ggplot调用就能实现所有分面的分组对比。我们把fill映射到Smoker,再通过透明度让叠加的直方图互不遮挡:

ggplot(df_long, aes(x = value, fill = Smoker)) +
  # 叠加直方图,alpha设置透明度方便观察重叠部分
  geom_histogram(alpha = 0.6, position = "identity", bins = 30) +
  # 按数值变量分面,每个分面用自由刻度
  facet_wrap(~key, scales = "free") +
  # 自定义标签让图表更清晰
  labs(
    title = "数值变量分布对比:吸烟者 vs 非吸烟者",
    x = "变量值",
    y = "频数",
    fill = "吸烟状态"
  ) +
  theme_bw()

小技巧调整

  • 如果不想叠加而是想要并排直方图,只需要把position = "identity"改成position = "dodge"即可。
  • 可以通过调整bins参数或者binwidth来优化直方图的粒度,让分布展示更清晰。

这种方法的优势就是完全利用tidyverse的“数据驱动”逻辑,不用手动处理每个变量,一次整理就能覆盖所有数值变量的对比需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:27:41