如何用R的ggplot按基因型分面绘制多Y轴变量对比图
问题描述
我是R语言新手,但有Matlab使用经验。希望针对动物模型的基因型(Control与Cre-)进行分面,在同一张图中对比Glom.Area、Glom.Tuft和Mesangial.Area这三个面积测量值的差异。以下是当前代码、数据集,期望效果为分面散点对比图(每个子图对应一个面积指标,x轴为基因型,y轴为面积值)。
当前代码
# Setup library(tidyverse) library(ggbeeswarm) library(readxl) # work space setwd("C:/Users/k_nic/OneDrive/Desktop") # Read in csv file t1 <- read.csv("sample.csv", header = TRUE) # plot for one varible ggplot(t1, aes(x = Genotype, y= Glom.Area))
数据集
Genotype Sex Glom.Area Glom.Tuft Mesangial.Area 1 Control M 6617.669 3804.877 1917.310 2 Control M 7986.696 5377.977 2761.949 3 Control M 8617.410 4443.345 2335.244 4 Control M 7785.355 4307.021 2381.512 5 Control M 9159.720 5568.449 3163.232 6 Control M 8484.327 5314.041 3238.861 7 Control M 10315.521 6105.294 3429.906 8 Control M 5517.161 3090.970 1878.288 9 Cre- M 6075.166 3438.421 2147.758 10 Cre- M 8947.698 5809.953 3744.117 11 Cre- M 6677.471 4315.344 2113.502 12 Cre- M 7616.932 4293.291 2763.791 13 Cre- M 8191.464 4778.529 2159.007 14 Cre- M 8549.339 6043.961 2922.295 15 Cre- M 11057.196 6546.740 3771.891 16 Cre- M 5911.768 3382.556 1754.674
解决方案
要做出你想要的分面对比图,核心是先把数据从宽格式转成长格式(ggplot2对长格式数据支持更友好),再结合蜂群散点、分面功能实现:
1. 转换数据格式
用pivot_longer()把三个面积指标列合并成两列:一列存指标名称,一列存对应数值,这样就能统一处理所有指标:
# 转成长格式数据 t1_long <- t1 %>% pivot_longer( cols = c(Glom.Area, Glom.Tuft, Mesangial.Area), names_to = "面积指标", values_to = "面积数值" )
2. 绘制分面图
基于转换后的数据,用geom_beeswarm()绘制不重叠的散点,搭配分面功能即可得到目标效果:
ggplot(t1_long, aes(x = Genotype, y = 面积数值, color = Genotype)) + # 蜂群散点,避免同组数据点重叠 geom_beeswarm(size = 2, alpha = 0.8) + # 可选:添加箱线图展示分布轮廓,outlier.shape=NA避免和散点重复 geom_boxplot(width = 0.3, alpha = 0.2, outlier.shape = NA) + # 按面积指标分面,ncol=1为纵向排列,改成3可横向排列 facet_wrap(~`面积指标`, ncol = 1) + # 设置坐标轴标签和标题 labs(x = "基因型", y = "面积值", title = "不同基因型的肾相关面积指标对比") + # 使用简洁主题,也可替换为其他theme样式 theme_bw() + theme( plot.title = element_text(hjust = 0.5, size = 12), strip.text = element_text(size = 10), axis.text = element_text(size = 9) )
补充说明
- 若不需要箱线图,直接删除
geom_boxplot()代码行即可; - 如需添加组间显著性标记,可安装
ggsignif包,用geom_signif()实现; - 分面排列方式可通过
facet_wrap()的ncol/nrow参数调整,比如ncol=3让三个子图横向并排。
内容的提问来源于stack exchange,提问作者5centK
相关产品推荐
相关产品推荐

