如何用R绘制含区间与数值列的数据框水平分面图?
解决方案
1. 数据预处理
首先需要拆分y列的数值与区间信息,再把数据转换成适合分面绘图的长格式:
# 加载所需工具包 library(tidyverse) # 导入你的数据 df <- structure(list(w = c("A", "B", "C", "D"), x = c(204L, 225L, 304L, 318L), y = c("250.600972895687", "135.212187604404", "[432,471]", "[463,479]"), z = c(43.4955443375464, 51.1172712956558, 70.8041394323353, 73.2068258760318)), row.names = 4:7, class = "data.frame") # 处理y列,拆分数值与区间 df_processed <- df %>% mutate( # 标记是否为区间格式 is_interval = str_detect(y, "\\["), # 提取非区间的单个数值 y_value = ifelse(!is_interval, as.numeric(y), NA), # 提取区间下限 y_low = ifelse(is_interval, str_extract(y, "(?<=\\[)\\d+") %>% as.numeric(), NA), # 提取区间上限 y_high = ifelse(is_interval, str_extract(y, "\\d+(?=\\])") %>% as.numeric(), NA) ) %>% # 将x、z列转为长格式,适配分面需求 pivot_longer(cols = c(x, z), names_to = "variable", values_to = "value") %>% # 补充y分面的行数据,统一结构 mutate( variable = factor(variable, levels = c("x", "y", "z")), value = ifelse(variable == "y", y_value, value) )
2. 绘制分面图
用ggplot2实现水平分面,y列分面同时展示数值点和区间条形:
ggplot() + # 绘制x、z分面的数值点 geom_point(data = df_processed %>% filter(variable != "y"), aes(x = w, y = value), size = 3) + # 绘制y分面的单个数值点(标红区分) geom_point(data = df_processed %>% filter(variable == "y", !is.na(value)), aes(x = w, y = value), size = 3, color = "red") + # 绘制y分面的区间条形 geom_linerange(data = df_processed %>% filter(variable == "y", is_interval), aes(x = w, ymin = y_low, ymax = y_high), size = 5, alpha = 0.5) + # 垂直排列分面,每个分面y轴独立缩放 facet_wrap(~variable, ncol = 1, scales = "free_y") + # 调整主题样式 theme_bw() + labs(x = "w", y = "数值")
代码说明
- 预处理阶段:通过正则表达式识别区间格式,拆分出上下限;将x、z列转为长格式,保证数据结构适配分面绘图。
- 绘图阶段:分别处理不同分面的元素,
facet_wrap实现垂直分面布局,scales="free_y"让每个分面的y轴根据数据范围自动调整。
内容的提问来源于stack exchange,提问作者Lucas Peres
相关产品推荐
相关产品推荐

