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

ggplot2中结合直方图与均值散点图添加双X轴的报错修复求助

问题修复方案

报错根因

调用geom_point()时未单独指定数据源,默认继承了ggplot初始传入的3374行的原始数据集df1,但传入的x、y映射是仅9行的汇总数据集df2的数据,长度不匹配触发报错。

修正后完整代码

# 加载依赖包
library(ggplot2)

# 生成测试数据集
Island_List <- c("KIN", "PAL", "TAB", "KIR", "MAL", "STA", "MIL", "VOS", "FLI")
Size_List <- c(5,10,15,20,25,30,35)
Fish_Mean_Age <- c(6.488024,7.325288,10.184943,12.843898,6.137257,4.814145,4.421930,3.138250,1.987950)
Lower95 <- c(6.065302,6.868382,9.748409,11.964554,5.717515,4.312715,3.819582,2.294968,1.298495)
Upper95 <- c(6.910745,7.782194,10.621477,13.723241,6.556999,5.315575,5.024278,3.981531,2.677405)

Island <- sample(Island_List, 3374, replace = TRUE)
Size <- sample(Size_List, 3374, replace = TRUE)

df1 <- data.frame(Island, Size)
df2 <- data.frame(Island = Island_List, Fish_Mean_Age, Lower95, Upper95) # 统一岛屿列名,方便分面匹配

# 绘图代码
ggplot(df1, aes(x = Size)) +
  geom_histogram(aes(fill = Island), bins = 25, show.legend = FALSE) +
  # 叠加平均年龄点,单独指定df2为数据源
  geom_point(data = df2, aes(x = Fish_Mean_Age * 2, y = 120), color = "white", size = 2) +
  # 叠加95%置信区间横向误差条
  geom_errorbarh(data = df2, aes(xmin = Lower95 * 2, xmax = Upper95 * 2, y = 120), color = "white", height = 5) +
  # 设置双X轴:底部为体长,顶部为转换后的年龄
  scale_x_continuous(name = "Size(体长)", sec.axis = sec_axis(~ ./2, name = "Age (yr)(年龄/年)")) +
  ylab("计数") +
  coord_flip() +
  facet_wrap(~ Island, ncol = 10) +
  theme_dark() +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())

关键调整说明

  • 统一df1和df2的岛屿列名为Island,保证分面后每个岛屿的面板只会显示对应岛屿的平均年龄数据
  • 给geom_point和geom_errorbarh单独指定data = df2,避免继承原始长表的映射规则
  • 修正双轴标注逻辑,符合你要求的「体长轴对侧显示年龄轴」的需求
  • 新增横向误差条展示95%置信区间,颜色设为白色适配深色主题,你可以根据需求调整点和误差条的位置、样式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 14:03:03