如何绘制不同类别植物生长轨迹的折线图或箱线图?
核心解决步骤
你遇到的问题核心是宽格式数据表转长格式的处理,以下是完整实现代码:
1. 数据格式转换(支持两种常用实现方式)
基于tidyverse的pivot_longer实现(更推荐)
# 加载依赖包 library(tidyverse) # 宽表转长表,假设你的原始数据框名为df df_long <- df %>% pivot_longer( cols = starts_with("第"), # 匹配所有株高测量列 names_to = "天数", values_to = "株高", names_pattern = "第(\\d+)天株高", # 提取列名中的天数字段 names_transform = list(天数 = as.numeric) # 转换为数值型适配绘图坐标轴 )
基于reshape2的melt实现(匹配你之前的操作逻辑)
library(reshape2) df_long <- melt(df, id.vars = c("植物ID", "植物类型"), # 保留不需要合并的维度列 measure.vars = c("第1天株高", "第5天株高", "第10天株高"), # 指定要合并的测量列 variable.name = "天数", value.name = "株高" ) # 提取天数数值 df_long$天数 <- as.numeric(sub("第(\\d+)天株高", "\\1", df_long$天数))
2. 绘制平均株高折线图
# 先计算分组平均株高 df_mean <- df_long %>% group_by(植物类型, 天数) %>% summarise( 平均株高 = mean(株高, na.rm = TRUE), .groups = "drop" ) # 绘图 ggplot(df_mean, aes(x = 天数, y = 平均株高, color = 植物类型, group = 植物类型)) + geom_line(linewidth = 1.2) + geom_point(size = 3) + scale_x_continuous(breaks = c(1,5,10)) + # 固定x轴刻度为实际测量时间点 labs(x = "天数", y = "株高(cm)", color = "植物类型") + theme_bw()
3. 绘制分组箱线图
分面版本(使用facet_wrap,符合你之前的实现思路)
ggplot(df_long, aes(x = factor(天数), y = 株高, fill = 植物类型)) + geom_boxplot(show.legend = FALSE) + facet_wrap(~植物类型) + labs(x = "天数", y = "株高(cm)") + theme_bw()
同画布分组版本(6个箱线连续排列)
ggplot(df_long, aes(x = interaction(factor(天数), 植物类型), y = 株高, fill = 植物类型)) + geom_boxplot() + scale_x_discrete( labels = c("1天\n向日葵", "1天\n郁金香", "5天\n向日葵", "5天\n郁金香", "10天\n向日葵", "10天\n郁金香") ) + labs(x = "测量时间/植物类型", y = "株高(cm)", fill = "植物类型") + theme_bw() + theme(axis.text.x = element_text(hjust = 0.5))
注意事项
如果你的实际数据列名和样例不一致,调整pivot_longer的匹配规则或melt的measure.vars参数即可;na.rm = TRUE参数用于忽略空值,无空值可删除。
内容的提问来源于stack exchange,提问作者user305902
相关产品推荐
相关产品推荐

