ggplot2绘制纬度与Neogloboquadrina_pachyderma丰度直方图报错及数据合并需求
ggplot2绘制纬度与Neogloboquadrina_pachyderma丰度直方图报错及数据合并需求
嘿,我来帮你搞定这个ggplot的问题!先给你拆解下报错原因,再一步步解决你的需求:
一、报错原因解析
你遇到的stat_bin() must only have an x or y aesthetic错误,本质是用错了图层:geom_histogram()是用来统计**单一轴上各区间的样本频数**的,它只需要一个x或者y美学映射就行,但你同时传了x=Latitude和y=Neogloboquadrina_pachyderma...35`,这就违反了它的设计逻辑,所以报错了。
另外先提个小细节:你的Neogloboquadrina_pachyderma...35列是字符型(从数据集里的引号能看出来),得先转成数值型才能做统计计算:
daten_neu$Neogloboquadrina_pachyderma...35 <- as.numeric(daten_neu$Neogloboquadrina_pachyderma...35)
二、解决报错+实现“纬度-丰度”可视化需求
你想要的是展示不同纬度下该物种的丰度,结合你提到的“多个点同纬度需要合并”的需求,给你两种方案:
方案1:先合并同纬度数据,再画柱状图(最直观)
先按纬度分组(可以是精确纬度,也可以是5度区间),计算每组的总丰度,再绘图:
library(dplyr) library(ggplot2) # 按5度纬度区间合并数据,计算总丰度 daten_summary <- daten_neu %>% # 把纬度分成每5度一组的区间 mutate(Latitude_bin = cut(Latitude, breaks = seq(-90, 90, by = 5), include.lowest = TRUE)) %>% # 按区间分组,汇总总丰度 group_by(Latitude_bin) %>% summarise(total_abundance = sum(Neogloboquadrina_pachyderma...35, na.rm = TRUE)) %>% ungroup() # 绘制柱状图 ggplot(daten_summary, aes(x = Latitude_bin, y = total_abundance)) + geom_col(fill = "lightblue", color = "black", alpha = 0.7) + labs(title = "Abundance of Neogloboquadrina Pachyderma vs Latitude", x = "Latitude (5° bins)", y = "Total Abundance") + theme_minimal() + # 旋转x轴标签避免重叠 theme(axis.text.x = element_text(angle = 45, hjust = 1))
如果你想按精确纬度值合并(不是区间),把上面的mutate去掉,直接按Latitude分组:
daten_summary_exact <- daten_neu %>% group_by(Latitude) %>% summarise(total_abundance = sum(Neogloboquadrina_pachyderma...35, na.rm = TRUE)) %>% ungroup() ggplot(daten_summary_exact, aes(x = Latitude, y = total_abundance)) + geom_col(width = 0.8, fill = "lightblue", color = "black", alpha = 0.7) + labs(title = "Total Abundance of Neogloboquadrina Pachyderma by Exact Latitude", x = "Latitude", y = "Total Abundance") + theme_minimal()
方案2:用直方图的加权逻辑实现(适合保留区间统计)
如果你坚持想用直方图的形式,可以用weight参数把丰度作为权重,这样直方图的高度就代表该纬度区间的总丰度:
ggplot(daten_neu, aes(x = Latitude, weight = Neogloboquadrina_pachyderma...35)) + geom_histogram(binwidth = 5, fill = "lightblue", color = "black", alpha = 0.7) + labs(title = "Total Abundance of Neogloboquadrina Pachyderma by Latitude", x = "Latitude", y = "Total Abundance") + theme_minimal()
三、为什么这个方案能解决你的问题?
不管是先汇总数据再绘图,还是用加权直方图,都解决了两个核心问题:
- 避免了
geom_histogram同时接收x和y的冲突,符合图层的设计逻辑 - 自动合并了同纬度/同纬度区间的多个数据点,把它们的丰度加总后展示,完美匹配你提到的“合并相同纬度点”的需求
备注:内容来源于stack exchange,提问作者Weiss
相关产品推荐
相关产品推荐

