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

如何使用R语言lattice包跳过绘图中的空面板

解决Lattice包绘制箱线图时跳过空面板的问题

嗨,我来帮你搞定这个lattice箱线图空面板的问题~

你的数据里,disease_type="2"且days_after_application="24-48"的分组下,severity全是NA,所以lattice会生成一个没有任何数据的空面板。要跳过这类空面板,核心思路是提前过滤掉那些没有有效数据的分组,下面给你两种实用的解决方案:

方案一:用Base R动态过滤(无需额外包)

这种方式不用装额外的包,直接用base R的函数就能自动识别并移除所有全NA的分组:

set.seed(1)
df1 <- data.frame(
  treatment = c(rep("A",16),rep("B",16),rep("C",16)), 
  disease_type = c(rep("1",8),rep("2",8)), 
  days_after_application = rep(c(rep("10-24",4),rep("24-48",4)),6), 
  severity = rnorm(48, mean = 80, sd = 5)
)
df1[(df1$disease_type == "2" & df1$days_after_application == "24-48"),"severity"] <- NA

# 1. 创建分组标识,把两个面板变量合并成一个组
df1$group <- paste(df1$days_after_application, df1$disease_type, sep = "-")
# 2. 计算每个分组里非NA的severity数量
df1$valid_count <- ave(!is.na(df1$severity), df1$group, FUN = sum)
# 3. 只保留有效数据量>0的行
df_filtered <- df1[df1$valid_count > 0, ]

library(lattice)
# 用过滤后的数据绘图,空面板就消失啦
figure1 <- bwplot(treatment~severity|days_after_application+disease_type, 
                  data = df_filtered,
                  xlab = "病害严重程度",
                  ylab = "处理方式",
                  main = "不同处理下的病害严重程度箱线图")
print(figure1)

方案二:用dplyr简洁过滤(代码更清爽)

如果你习惯用tidyverse系列的包,dplyr的分组过滤会更直观:

library(dplyr)
set.seed(1)
df1 <- data.frame(
  treatment = c(rep("A",16),rep("B",16),rep("C",16)), 
  disease_type = c(rep("1",8),rep("2",8)), 
  days_after_application = rep(c(rep("10-24",4),rep("24-48",4)),6), 
  severity = rnorm(48, mean = 80, sd = 5)
)
df1[(df1$disease_type == "2" & df1$days_after_application == "24-48"),"severity"] <- NA

# 按面板变量分组,过滤掉全NA的组
df_filtered <- df1 %>%
  group_by(days_after_application, disease_type) %>%
  filter(sum(!is.na(severity)) > 0) %>%
  ungroup()

# 绘制箱线图
figure1 <- bwplot(treatment~severity|days_after_application+disease_type, 
                  data = df_filtered,
                  xlab = "病害严重程度",
                  ylab = "处理方式",
                  main = "不同处理下的病害严重程度箱线图")
print(figure1)

补充:硬编码排除特定分组(适合临时场景)

如果你明确知道只有某一个分组是空的,也可以直接在绘图函数里用subset参数排除它,不过这种方式不够通用,适合临时快速处理:

library(lattice)
figure1 <- bwplot(treatment~severity|days_after_application+disease_type, 
                  data = df1,
                  subset = !(disease_type == "2" & days_after_application == "24-48"),
                  xlab = "病害严重程度",
                  ylab = "处理方式",
                  main = "不同处理下的病害严重程度箱线图")
print(figure1)

推荐优先用前两种动态过滤的方式,不管以后新增多少全NA的分组,代码都能自动处理,不用手动修改~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:11:01