如何用R的ggplot2绘制含子分类的分组散点图与箱线图
在ggplot2中绘制带子分类的分组散点图
没问题,我来帮你搞定这个需求!ggplot2对长格式数据更友好,所以我们先把你的宽格式数据转换成适合绘图的长格式,再一步步实现带子分类的分组散点图,还能加上均值线段来匹配你想要的样式。
步骤1:数据格式转换
首先我们需要把宽格式数据转成长格式,同时提取出主分组(比如BL_CA、CA_BL、BL6、CA)和每个分组内的重复编号(1/2/3),还要保留你的Category子分类信息。我们用tidyverse工具包来完成这个操作:
# 加载所需工具包 library(tidyverse) # 假设你的原始数据框名为df,先把行名转为单独的列(如果你的数据第一列是样本名的话) df <- df %>% rownames_to_column(var = "Sample") # 转换为长格式,提取主分组和重复项 df_long <- df %>% pivot_longer( cols = -c(Sample, Category), # 排除样本名和子分类列,其他列转为长格式 names_to = "Group", values_to = "Value" ) %>% mutate( # 从列名中提取主分组(比如从BL_CA_1中提取BL_CA) Main_Group = str_extract(Group, "^[A-Z0-9_]+(?=_\\d)"), # 提取每个主分组内的重复编号(1/2/3) Sub_Repeat = str_extract(Group, "\\d+$") )
步骤2:绘制带子分类的分组散点图
现在我们可以用ggplot2来绘图了,核心是把Main_Group作为x轴,Value作为y轴,用color映射你的子分类Category,再通过位置调整让同一分组内的子分类点不重叠,同时加上均值线段:
ggplot(df_long, aes(x = Main_Group, y = Value, color = Category)) + # 绘制散点:用position_jitterdodge让子分类分开,重复点轻微抖动避免重叠 geom_point( position = position_jitterdodge( jitter.width = 0.2, # 点的抖动宽度 dodge.width = 0.6 # 子分类之间的分隔宽度 ), alpha = 0.7, # 点的透明度,避免重叠时太杂乱 size = 2 ) + # 绘制每个子分类的均值线段,清晰展示中心趋势 stat_summary( fun = mean, geom = "crossbar", position = position_dodge(width = 0.6), # 和散点的dodge宽度匹配 width = 0.5, color = "black", linewidth = 0.5, fill = NA ) + # 调整标签和主题 labs( x = "主分组", y = "数值", color = "子分类" ) + theme_bw() + theme( axis.text.x = element_text(angle = 45, hjust = 1), # x轴标签倾斜,避免重叠 legend.position = "top" )
代码解释
position_jitterdodge:这个参数是关键,它同时实现了两个效果——让同一主分组内不同子分类的点左右分开(dodge),让每个子分类内的重复点轻微上下抖动(jitter),完美解决点重叠的问题。stat_summary:用来计算并绘制每个子分类的均值横线,让读者能快速看到每个组内子分类的中心值,和你提供的示例图样式一致。- 主题调整:
theme_bw()提供清爽的白色背景,倾斜x轴标签避免长分组名重叠。
这样你就能得到和示例图类似的、带子分类的分组散点图啦!
内容的提问来源于stack exchange,提问作者Siddharth
相关产品推荐
相关产品推荐

