如何使用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
相关产品推荐
相关产品推荐

