使用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
问题原因
- 图层无显示范围限制:原代码中两个图层会尝试在所有
facet_grid子图中渲染,但geom_density在Group=Gender的子图中没有Age数据,geom_col在Group=Age的子图中没有gender/n数据,导致所有子图无法正常显示。 - 柱状图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
相关产品推荐
相关产品推荐

