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

如何让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功能来实现:

  1. 先安装并加载ggh4x包:
install.packages("ggh4x")
library(ggh4x)
  1. 编写完整代码,为每个分面单独配置次坐标轴:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:49:51