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

如何绘制不同类别植物生长轨迹的折线图或箱线图?

核心解决步骤

你遇到的问题核心是宽格式数据表转长格式的处理,以下是完整实现代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:27:00