You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何绘制:用线条连接个体鸟类的基线与应激诱导皮质酮水平?

问题描述

我从未在编程类网站发过帖,希望能把问题说清楚。我想绘制椋鸟在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:30:41