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

如何基于大型哺乳动物数据集绘制地理范围大小直方图(编程新手)

哺乳动物地理范围大小直方图绘制问题

作为编程新手,我尝试为哺乳动物的地理范围大小绘制直方图,现有包含地理范围大小及不同哺乳动物名称的数据列,已编写如下R代码:

我的代码

hist1 = hist(x = dat1$Range_Area_km2, 
             breaks = 100, 
             col = "blue", 
             border = "green", 
             main = "Geographic Range Size of Mammals", # add a title
             xlab = "Km2", # change axis labels
             ylab = "Frequency", 
             xlim = c(0, 65000000), # change the axis limits
             ylim = c(0, 200)) 

期望得到所有哺乳动物地理范围大小的直方图,数据集结构如下:

数据集结构

structure(list(rownames = 1:20, MSW05_Binomial = c("Melomys_rubicola", 
"Peromyscus_dickeyi", "Mogera_uchidai", "Pteropus_pelewensis", 
"Mysateles_garridoi", "Neotoma_anthonyi", "Microtus_breweri", 
"Hypsugo_lophurus", "Neotoma_martinensis", "Pteropus_howensis", 
"Crocidura_dhofarensis", "Mesocapromys_angelcabrerai", "Ochotona_gaoligongensis", 
"Myotis_abei", "Rhynchomys_isarogensis", "Calomyscus_tsolovi", 
"Monodelphis_unistriata", "Geocapromys_ingrahami", "Hesperoptenus_gaskelli", 
"Neotoma_bunkeri"), MSW05_Order = c("Rodentia", "Rodentia", "Soricomorpha", 
"Chiroptera", "Rodentia", "Rodentia", "Rodentia", "Chiroptera", 
"Rodentia", "Chiroptera", "Soricomorpha", "Rodentia", "Lagomorpha", 
"Chiroptera", "Rodentia", "Rodentia", "Didelphimorphia", "Rodentia", 
"Chiroptera", "Rodentia"), MSW05_Family = c("Muridae", "Cricetidae", 
"Talpidae", "Pteropodidae", "Capromyidae", "Cricetidae", "Cricetidae", 
"Vespertilionidae", "Cricetidae", "Pteropodidae", "Soricidae", 
"Capromyidae", "Ochotonidae", "Vespertilionidae", "Muridae", 
"Calomyscidae", "Didelphidae", "Capromyidae", "Vespertilionidae", 
"Cricetidae"), AdultBodyMass_g = c(100, 28.6, NA, NA, NA, 195.4, 
NA, NA, 240.16, 232.92, NA, NA, NA, NA, 122.29, NA, 55.3, 733.52, 
NA, 375), LitterSize = c(NA, NA, NA, NA, NA, NA, 4.5, NA, NA, 
0.98, NA, NA, NA, NA, NA, NA, NA, 1.04, NA, NA), Range_Area_km2 = c(0.000187, 
0.00725, 0.03, 0.06, 0.49, 0.66, 1.85, 2.7, 2.8, 3.16, 3.52, 
3.55, 4.89, 5.11, 5.28, 6.78, 6.86, 8.36, 8.89, 9.15), Precip_Mean_mm = c(NA, 
NA, NA, NA, NA, NA, NA, 290, NA, NA, 7, 111, 195, 52, 331, 18, 
107, NA, 237, NA), Temp_Mean_degC = c(NA, NA, NA, NA, NA, NA, 
NA, 24.6, NA, NA, 21.1, 24.6, 11.3, -0.9, 25.2, 17.1, 17.9, NA, 
20.6, NA), ActivityCycle = c(NA, 1L, 2L, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, 2L, NA, 1L, 1L, NA, NA), DietBreadth = c(NA, 
NA, 1L, NA, 3L, NA, 1L, NA, NA, NA, NA, 3L, NA, NA, 1L, NA, 1L, 
2L, NA, NA), HabitatBreadth = c(NA, NA, 1L, NA, 1L, NA, 2L, 1L, 
NA, 1L, NA, 1L, 1L, 1L, NA, NA, 1L, 2L, 1L, NA), Terrestriality = c(NA, 
NA, 1L, NA, 2L, NA, 1L, 2L, NA, 2L, NA, 2L, 1L, 2L, NA, NA, 1L, 
2L, 2L, NA), TrophicLevel = c(NA, NA, 3L, NA, 2L, NA, 1L, NA, 
NA, NA, NA, 2L, NA, NA, 3L, NA, 3L, 1L, NA, NA)), row.names = c(NA, 
20L), class = "data.frame")

问题分析与改进方案

  • 你的数据集里Range_Area_km2的数值范围是0.000187到9.15,但代码里设置了xlim = c(0, 65000000),这会导致所有数据都集中在x轴最左侧,直方图几乎无法展示分布特征。
  • 可以根据实际数据范围调整x轴限制,或者对数据做对数变换(地理范围大小通常呈对数正态分布,变换后分布更清晰)。

方案1:适配数据范围的直方图

# 先查看数据的统计范围
summary(dat1$Range_Area_km2)

# 绘制适配数据的直方图
hist1 = hist(x = dat1$Range_Area_km2, 
             breaks = 10,  # 数据范围小,减少分组数更合理
             col = "blue", 
             border = "green", 
             main = "哺乳动物地理范围大小直方图", 
             xlab = "面积(平方公里)", 
             ylab = "频数", 
             xlim = c(0, max(dat1$Range_Area_km2) + 1))  # 基于数据最大值设置x轴上限

方案2:对数变换后的直方图

# 对地理范围做对数变换(数据无0值,直接处理)
log_range = log10(dat1$Range_Area_km2)

hist2 = hist(x = log_range, 
             breaks = 10, 
             col = "blue", 
             border = "green", 
             main = "哺乳动物地理范围大小(对数变换)直方图", 
             xlab = "log10(面积,平方公里)", 
             ylab = "频数")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:36:20