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

R语言使用scatter.smooth绘制12种目标鱼类丰度与深度散点图问题

代码错误原因及修正方案

你原来的代码存在3个核心问题:

  • 括号语法错误:with()的右括号位置错误,把scatter.smooth()的自定义参数丢到了with()作用域之外,导致参数不生效
  • 坐标轴变量顺序颠倒:要展示丰度随深度的变化规律,应该将深度作为x轴,转换后的丰度作为y轴,你原来的写法刚好写反了
  • 图形参数传递错误:scatter.smooth()函数的自定义线条、点样式参数需要传入lpars列表,不能直接在函数顶层传递

基础问题解答

  1. 12个目标物种筛选逻辑:你原来用subset(ReefFish, commonname == species.to.use[i])的筛选逻辑是完全正确的,只要你的ReefFish数据集存在commonname列,且列内的物种名称和species.to.use里的写法完全一致(大小写、空格、标点符号完全匹配)就可以正常过滤掉其他非目标物种。
  2. 计数数据平方根转换:直接用sqrt(count)即可实现转换,如果你的数据中存在计数为0的情况,可以改成sqrt(count + 1)避免0值带来的拟合异常,不会影响整体变化趋势。

修正后可运行的完整代码

# 1. 正确定义目标物种字符向量
species.to.use <- c(
  "Vanderbilt's chromis",
  "Agile chromis",
  "Brown surgeonfish",
  "Spotted surgeonfish",
  "Yellow tang",
  "Common bluestripe snapper",
  "Arc-eye hawkfish",
  "Hawaiian bicolor chromis",
  "Whitebar surgeonfish",
  "Saddle wrasse",
  "Striated wrasse",
  "Pebbled butterflyfish"
)

# 2. 设置画布布局为3行4列,调整边距避免内容挤压
par(mfrow = c(3,4), mar = c(4,4,2,1))

# 3. 循环绘制每个物种的散点平滑图
for (sp in species.to.use) {
  # 筛选当前物种的所有数据
  sp_df <- subset(ReefFish, commonname == sp)
  # 绘制散点+平滑拟合线
  scatter.smooth(
    x = sp_df$depth,
    y = sqrt(sp_df$count),
    pch = 19,
    col = "navy",
    lpars = list(col = "firebrick", lwd = 2), # 平滑线的样式参数放此处
    xlab = "深度",
    ylab = "平方根转换后丰度",
    main = sp
  )
}

额外需求&异常排查

  • 如果需要绘制平均丰度随深度的变化,先按物种、深度分组求平均值再绘图即可:
# 需先安装加载dplyr包做分组汇总
library(dplyr)
ReefFish_mean <- ReefFish %>%
  group_by(commonname, depth) %>%
  summarise(mean_count = mean(count, na.rm = TRUE), .groups = "drop")

# 循环绘图时把数据集换成ReefFish_mean,y值改为sqrt(mean_count)即可
  • 如果运行时出现拟合警告,一般是部分物种样本量过少导致,可以在scatter.smooth()中添加span = 0.8参数,调大拟合窗口减少异常。
  • 如果筛选不到目标物种数据,运行sum(ReefFish$commonname %in% species.to.use)查看匹配成功的行数,如果返回值为0,检查数据集内物种名的拼写、大小写是否和species.to.use完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:06:03