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

如何在ggplot2的facet_grid密度图中为x≥2阈值区域着色

问题:双因子分面密度图突出阈值以上区域

我需要在双因子分面的密度图中,为x≥2的区域添加红色填充。已知单分面因子的实现方法,但不知道如何处理mode.f和task.f两个分面因子的情况,请问用ggplot_build时怎么指定这两个因子的水平,或者有没有其他方法?

数据集示例(共750行)

mode.f task.f      mgds
1        1      A 1.1413636
2        1      A 0.9105000
3        2      A 1.0320000
4        2      A 1.1811429
14       1      C 1.4646000
15       1      C 1.7505000
16       2      C 1.3968000
17       1      D 1.0668333
18       1      D 1.0084000
19       1      D 1.1622500
20       2      D 1.3452500
21       2      D 1.0132000
22       3      C 0.6960000
23       3      C 0.9180000
24       3      D 1.0128000
25       3      D 0.6670000
26       2      E 2.9190000
27       2      E 1.3755000
28       2      E 1.4080000
29       1      E 1.3878000
30       1      E 1.4816667

单分面因子的可行代码

mp <- ggplot(df,aes(x=mgds))+
  geom_density(color=NA,fill="gray30",alpha=.4)+
  facet_wrap(~mode.f)+
  theme_bw()+
  theme(strip.background = 
        element_rect(fill="gray95",color="gray60"),
        strip.text = element_text(colour="black",size=10),
        panel.border = element_rect(color="gray60"))+
  labs(x="MGD (s)",y="Density")

to_fill <- data_frame(
  x = ggplot_build(mp)$data[[1]]$x,
  y = ggplot_build(mp)$data[[1]]$y,
  mode.f = factor(ggplot_build(mp)$data[[1]]$PANEL, levels = 
  c(1,2,3), labels = c("1","2","3")))

mp + geom_area(data = to_fill[to_fill$x >= 2, ], 
               aes(x=x, y=y), fill = "red")

目标双因子分面代码

ggplot(df,aes(x=mgds))+
  geom_density(color=NA,fill="gray30",alpha=.4)+
  facet_grid(mode.f~task.f)+
  theme_bw()+
  theme(strip.background = element_rect(fill="gray95",color="gray60"),
        strip.text = element_text(colour="black",size=10),
        panel.border = element_rect(color="gray60"))+
  geom_vline(xintercept=2,linetype="longdash",color="gray50")+
  labs(x="Measure",y="Density")

解决方案

针对双因子分面场景,核心是从ggplot_build的布局信息中提取每个面板对应的mode.f和task.f水平,建立面板与双因子的映射关系,具体步骤如下:

步骤1:构建基础绘图对象

# 先创建基础的双因子分面密度图
mp <- ggplot(df,aes(x=mgds))+
  geom_density(color=NA,fill="gray30",alpha=.4)+
  facet_grid(mode.f~task.f)+
  theme_bw()+
  theme(strip.background = element_rect(fill="gray95",color="gray60"),
        strip.text = element_text(colour="black",size=10),
        panel.border = element_rect(color="gray60"))+
  geom_vline(xintercept=2,linetype="longdash",color="gray50")+
  labs(x="Measure",y="Density")

步骤2:提取面板与双因子的映射关系

从ggplot_build的布局数据中,直接获取每个面板对应的两个因子水平,避免手动指定:

# 获取绘图的构建数据
build_info <- ggplot_build(mp)

# 提取面板与mode.f、task.f的映射
panel_map <- build_info$layout$layout_df %>%
  select(PANEL, mode.f, task.f)

# 整理需要填充的数据:关联双因子,筛选x≥2的区域
to_fill <- build_info$data[[1]] %>%
  left_join(panel_map, by = "PANEL") %>%
  filter(x >= 2)

步骤3:添加红色填充区域

将筛选后的填充数据添加到基础图中:

# 为x≥2区域添加红色填充
mp + geom_area(data = to_fill, aes(x=x, y=y), fill = "red", alpha = 0.4)

替代方案(兼容旧版tidyverse)

如果你的dplyr版本较低,也可以用如下方式提取映射:

panel_map <- data.frame(
  PANEL = 1:nrow(build_info$layout$panel_params),
  mode.f = sapply(build_info$layout$panel_params, function(p) p$facet$rows[[1]]),
  task.f = sapply(build_info$layout$panel_params, function(p) p$facet$cols[[1]])
)

to_fill <- build_info$data[[1]] %>%
  left_join(panel_map, by = "PANEL") %>%
  filter(x >= 2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 04:27:13