如何用R绘制带须线、含实验室值与MPV的非箱线图?
实现思路
1. 数据预处理:转成长格式
首先得把宽格式数据(一列实验室值、一列MPV值)转成长格式,新增一个类别变量(比如type)区分两种数值,这样才能在ggplot里统一映射样式。
示例代码:
library(tidyr) # 假设原数据框df包含lab_value(实验室值)和mpv_value(MPV)列 df_long <- df %>% pivot_longer( cols = c(lab_value, mpv_value), names_to = "type", values_to = "result", names_transform = list(type = ~ifelse(.x == "lab_value", "实验室值", "MPV")) )
2. 核心散点图层构建
用geom_point()通过shape参数区分实心/空心点,搭配颜色映射实现需求:
- 实验室值:用实心圆点(shape=19),指定彩色
- MPV:用空心圆点(shape=21),填充白色保证空心效果
基础代码框架:
library(ggplot2) ggplot(df_long, aes(x = type, y = result)) + # 绘制实心实验室值点 geom_point( data = subset(df_long, type == "实验室值"), shape = 19, color = "#2ca02c", size = 3 ) + # 绘制空心MPV点 geom_point( data = subset(df_long, type == "MPV"), shape = 21, color = "#2ca02c", fill = "white", size = 3 ) + # 美化标签与主题 labs(x = "数值类型", y = "检测结果", title = "实验室值与MPV对比") + theme_minimal()
3. 进阶优化(按需选择)
配对样本连线
如果是每个样本对应一组实验室值和MPV,用geom_line()连接同一样本的两个点,更直观展示差异:
# 假设数据包含sample_id(样本标识)列 ggplot(df_long, aes(x = type, y = result, group = sample_id)) + geom_line(color = "gray", alpha = 0.5) + # 灰色半透明连接线 geom_point(data = subset(df_long, type == "实验室值"), shape = 19, color = "#2ca02c", size = 3) + geom_point(data = subset(df_long, type == "MPV"), shape = 21, color = "#2ca02c", fill = "white", size = 3) + labs(x = "数值类型", y = "检测结果", title = "配对样本:实验室值与MPV对比") + theme_minimal()
叠加分布背景
如果需要展示整体分布,可在散点下方叠加箱线图/小提琴图,用alpha调整透明度避免遮挡:
ggplot(df_long, aes(x = type, y = result)) + geom_boxplot(width = 0.3, alpha = 0.2) + # 半透明箱线图 geom_point(data = subset(df_long, type == "实验室值"), shape = 19, color = "#2ca02c", size = 3, position = position_jitter(width = 0.1)) + geom_point(data = subset(df_long, type == "MPV"), shape = 21, color = "#2ca02c", fill = "white", size = 3, position = position_jitter(width = 0.1)) + labs(x = "数值类型", y = "检测结果", title = "实验室值与MPV分布对比") + theme_minimal()
关键注意点
- 长格式数据是ggplot灵活映射的基础,务必先完成格式转换
- ggplot形状参数:shape=19为实心圆,shape=21为可填充的空心圆,可根据喜好替换其他形状
- 配对数据必须指定
group=样本标识,否则连接线会混乱
内容的提问来源于stack exchange,提问作者SharonP
相关产品推荐
相关产品推荐

