R语言使用scatter.smooth绘制12种目标鱼类丰度与深度散点图问题
代码错误原因及修正方案
你原来的代码存在3个核心问题:
- 括号语法错误:
with()的右括号位置错误,把scatter.smooth()的自定义参数丢到了with()作用域之外,导致参数不生效 - 坐标轴变量顺序颠倒:要展示丰度随深度的变化规律,应该将深度作为x轴,转换后的丰度作为y轴,你原来的写法刚好写反了
- 图形参数传递错误:
scatter.smooth()函数的自定义线条、点样式参数需要传入lpars列表,不能直接在函数顶层传递
基础问题解答
- 12个目标物种筛选逻辑:你原来用
subset(ReefFish, commonname == species.to.use[i])的筛选逻辑是完全正确的,只要你的ReefFish数据集存在commonname列,且列内的物种名称和species.to.use里的写法完全一致(大小写、空格、标点符号完全匹配)就可以正常过滤掉其他非目标物种。 - 计数数据平方根转换:直接用
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
相关产品推荐
相关产品推荐

