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

R语言按物种分组自动生成ggplot可视化的代码实现问题

渔获调查数据统计与可视化实现方案

需要修正的核心问题

如果你的现有代码无法正常运行,优先检查以下几点:

  • 汇总统计时未同时按物种、年份、季节三个维度分组,导致不同物种的统计值混淆
  • 标准误计算逻辑错误,标准误公式为 标准差/ sqrt(样本量),需注意分母是当前分组的有效样本量
  • 绘图时未按物种拆分数据集,导致多个物种的数据画在同一张图上,不符合单物种趋势图的需求
  • 缺少文件保存的非空判断逻辑,未设置合理的图片输出参数导致保存的图片清晰度不足
  • 统计计算时未添加na.rm = TRUE参数,存在缺失值时会返回NA结果

完整实现代码

# 加载依赖包,未安装的话先运行 install.packages(c("dplyr","ggplot2"))
library(dplyr)
library(ggplot2)

# 定义函数
process_catch_data <- function(dat, file_prefix = NULL) {
  # 第一步:按物种、年份、季节分组汇总统计
  catch_summary <- dat %>%
    group_by(species, year, season) %>%
    summarise(
      n = n(), # 样本量
      mean_catch = mean(catch_num, na.rm = TRUE), # 均值
      median_catch = median(catch_num, na.rm = TRUE), # 中位数
      sd_catch = sd(catch_num, na.rm = TRUE), # 标准差
      se_catch = sd_catch / sqrt(n), # 标准误
      .groups = "drop"
    )
  
  # 第二步:生成每个物种的趋势图
  unique_species <- unique(catch_summary$species)
  
  for (sp in unique_species) {
    # 筛选当前物种的汇总数据
    sp_data <- catch_summary %>% filter(species == sp)
    
    # 绘制趋势图,x轴为年份,y轴为平均渔获量,按季节分色
    p <- ggplot(sp_data, aes(x = as.factor(year), y = mean_catch, color = season, group = season)) +
      geom_line(linewidth = 1) +
      geom_point(size = 2) +
      # 添加误差棒(标准误)
      geom_errorbar(aes(ymin = mean_catch - se_catch, ymax = mean_catch + se_catch), width = 0.2) +
      labs(
        title = paste0(sp, " 渔获量季节年际变化趋势"),
        x = "年份",
        y = "平均渔获量",
        color = "季节"
      ) +
      theme_bw()
    
    # 判断是否保存文件
    if (!is.null(file_prefix)) {
      ggsave(
        filename = paste0(file_prefix, "_", gsub("/|\\\\", "", sp), ".png"),
        plot = p,
        width = 8,
        height = 6,
        dpi = 300
      )
    } else {
      # 直接输出到屏幕
      print(p)
    }
  }
  
  # 返回汇总统计结果供后续使用
  return(catch_summary)
}

使用示例

# 假设你的原始数据集名为catch_raw,列名对应为year、season、site、species、catch_num
# 情况1:不保存图片,直接输出到屏幕,同时得到汇总表
catch_stats <- process_catch_data(catch_raw)

# 情况2:所有物种的图片保存到当前工作目录,文件名前缀为"渔获趋势"
catch_stats <- process_catch_data(catch_raw, file_prefix = "渔获趋势")

注意:如果你的原始数据集列名和示例不一致,替换代码中对应的列名即可正常运行。

内容的提问来源于stack exchange,提问作者Nate

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:45:03