如何让ggplot2分面图的每个分面次坐标轴仅显示对应均值
分面密度图中次坐标轴仅显示对应分面均值的解决方案
我习惯用次坐标轴展示分布均值这类汇总统计量,但用ggplot2绘制分面密度图时,次坐标轴会显示所有分面的均值,想让每个分面的次坐标轴只显示对应分面的均值。
原代码示例:
library(dplyr) library(ggplot2) means_by_cyl <- mtcars |> summarise(mean_wt = mean(wt) |> round(1), .by=cyl) mtcars |> ggplot(aes(x = wt)) + geom_density() + facet_grid(. ~ cyl, labeller = label_both) + scale_x_continuous( sec.axis = dup_axis( breaks = means_by_cyl$mean_wt, name = "Means" ) )
当前问题:所有分面的次坐标轴都会显示全部3个分组的均值,不符合每个分面只展示自身均值的需求。
解决方案:借助ggh4x包实现分面级坐标轴自定义
ggplot2原生不支持为每个分面单独设置坐标轴,需要用ggh4x扩展包的facetted_pos_scales功能来实现:
- 先安装并加载
ggh4x包:
install.packages("ggh4x") library(ggh4x)
- 编写完整代码,为每个分面单独配置次坐标轴:
library(dplyr) library(ggplot2) library(ggh4x) # 计算各分组均值 means_by_cyl <- mtcars |> summarise(mean_wt = mean(wt) |> round(1), .by=cyl) mtcars |> ggplot(aes(x = wt)) + geom_density() + facet_grid(. ~ cyl, labeller = label_both) + # 为每个分面单独设置x轴(含次坐标轴) facetted_pos_scales( x = list( cyl == 4 ~ scale_x_continuous( sec.axis = dup_axis(breaks = means_by_cyl$mean_wt[means_by_cyl$cyl == 4], name = "Means") ), cyl == 6 ~ scale_x_continuous( sec.axis = dup_axis(breaks = means_by_cyl$mean_wt[means_by_cyl$cyl == 6], name = "Means") ), cyl == 8 ~ scale_x_continuous( sec.axis = dup_axis(breaks = means_by_cyl$mean_wt[means_by_cyl$cyl == 8], name = "Means") ) ) )
效果说明
修改后每个分面的次坐标轴只会显示对应cyl分组的wt均值,不会再出现其他分组的均值标记,完全匹配分面内的数据汇总需求。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

