如何绘制:用线条连接个体鸟类的基线与应激诱导皮质酮水平?
问题描述
我从未在编程类网站发过帖,希望能把问题说清楚。我想绘制椋鸟在30分钟内皮质酮(corticosterone)从基线水平到应激诱导(SI)水平的变化图——捕获鸟类后先采集基线血样(对应数据列Base.cort),30分钟后采集第二次血样(对应数据列SI.cort)。我需要把每只鸟的基线和应激诱导数据点用线条连接起来,但谷歌搜索了2小时还是没解决。
我目前用的代码是:
创建变量列表
x <- list('Base CORT' = df_adults$Base.cort, 'SI CORT' = df_adults$SI.cort) x
绘制带状图
stripchart(x, main = 'Individual Changes in CORT', xlab = 'CORT Sample', col = c('#9A8822', '#F5CDB4'), pch = 16, method = 'jitter', vertical = TRUE)
我尝试过用分组变量但没效果,请问怎么按BirdID连接每个个体的两个数据点?我的数据框结构是:每行对应一只鸟,包含BirdID、Base.cort、SI.cort等列。
解决方案
stripchart本身不支持直接按个体连线的功能,推荐用更灵活的ggplot2包来实现,或者用基础绘图手动循环绘制,两种方法如下:
方法一:使用ggplot2(推荐)
1. 安装并加载所需包
如果还没安装ggplot2和tidyr,先执行:
install.packages(c("ggplot2", "tidyr")) library(ggplot2) library(tidyr)
2. 转换数据格式
把宽格式数据转成ggplot更易处理的长格式,保留BirdID作为分组依据:
df_long <- pivot_longer(df_adults, cols = c(Base.cort, SI.cort), # 要转换的列 names_to = "Sample_Type", # 新列:样本类型 values_to = "CORT_Level") # 新列:皮质酮数值 # 把样本类型的显示文本改成更直观的名称 df_long$Sample_Type <- factor(df_long$Sample_Type, levels = c("Base.cort", "SI.cort"), labels = c("Base CORT", "SI CORT"))
3. 绘制带连线的散点图
用geom_line按BirdID连线,geom_point绘制数据点:
ggplot(df_long, aes(x = Sample_Type, y = CORT_Level, group = BirdID)) + geom_line(color = "gray", alpha = 0.6) + # 灰色半透明连线,避免遮挡点 geom_point(aes(color = Sample_Type), size = 3, pch = 16) + scale_color_manual(values = c("#9A8822", "#F5CDB4")) + # 自定义点的颜色 labs(title = "Individual Changes in CORT", x = "CORT Sample", y = "CORT Level") + theme_bw() # 简洁的主题风格
方法二:使用基础绘图
如果不想用ggplot,也可以手动循环每个个体绘制连线和点:
# 定义x轴位置:基线对应1,应激诱导对应2 x_pos <- c(1, 2) # 初始化空白绘图区域 plot(NULL, xlim = c(0.8, 2.2), # 给x轴留一点边距 ylim = range(c(df_adults$Base.cort, df_adults$SI.cort)), # y轴范围覆盖所有数据 xlab = "CORT Sample", ylab = "CORT Level", main = "Individual Changes in CORT", xaxt = "n") # 先不绘制x轴刻度 # 添加自定义x轴刻度 axis(1, at = x_pos, labels = c("Base CORT", "SI CORT")) # 循环每只鸟,绘制连线和数据点 for(i in 1:nrow(df_adults)){ # 绘制个体的连线 lines(x_pos, c(df_adults$Base.cort[i], df_adults$SI.cort[i]), col = "gray") # 绘制基线数据点 points(1, df_adults$Base.cort[i], col = "#9A8822", pch = 16, cex = 1.2) # 绘制应激诱导数据点 points(2, df_adults$SI.cort[i], col = "#F5CDB4", pch = 16, cex = 1.2) }
内容的提问来源于stack exchange,提问作者Rachel
相关产品推荐
相关产品推荐

