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

使用ggplot绘制含密度图和柱状图的facet_grid遇空图问题求助

ggplot facet_grid绘制密度图+柱状图空图问题解决

问题重现

尝试用ggplot的facet_grid组合绘制Age的密度图和Gender的柱状图,但运行后得到空图,原代码如下:

ggplot() +
  facet_grid(Loc~Group, scales="free_y", space = "free_y") +
  geom_density(data = Age, aes(x=Age)) +
  geom_col(data = Gender,aes(x=Loc ,y=n, fill=gender))

Age数据集前6行结构:

> as.data.frame(head(Age))
                    Loc Age Group
1               Breast  57   Age
2                 Lung  60   Age
3                 Skin  66   Age
4                 Lung  69   Age
5                 Lung  54   Age
6               Uterus  48   Age

Gender数据集前6行结构:

> as.data.frame(head(Gender))
                  Loc gender  n  Group
1                 Anus female 18 Gender
2                 Anus   male 12 Gender
3                Vulva female 12 Gender
4               Vagina female  2 Gender
5              Stomach female 20 Gender
6              Stomach   male 62 Gender

问题原因

  1. 图层无显示范围限制:原代码中两个图层会尝试在所有facet_grid子图中渲染,但geom_density在Group=Gender的子图中没有Age数据,geom_col在Group=Age的子图中没有gender/n数据,导致所有子图无法正常显示。
  2. 柱状图x轴映射错误:原代码中geom_col的x轴设为Loc,但每个facet已经按Loc分组,单个子图中Loc值唯一,柱状图无法正常展示性别分布。

修正方案

调整图层的显示范围,同时修正柱状图的x轴映射:

ggplot() +
  facet_grid(Loc ~ Group, scales = "free_y", space = "free_y") +
  # 仅在Group为"Age"的子图中绘制对应Loc的年龄密度图
  geom_density(data = Age, aes(x = Age), subset = .(Group == "Age")) +
  # 仅在Group为"Gender"的子图中绘制对应Loc的性别数量柱状图
  geom_col(data = Gender, aes(x = gender, y = n, fill = gender), 
           subset = .(Group == "Gender"), position = "dodge")

额外说明

  • 添加position = "dodge"可以让男女柱状图并排显示,避免重叠。
  • 如果某个Loc仅存在于其中一个数据集,对应的子图会为空,属于正常现象(无对应数据可绘制)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:57:39