如何基于大型哺乳动物数据集绘制地理范围大小直方图(编程新手)
哺乳动物地理范围大小直方图绘制问题
作为编程新手,我尝试为哺乳动物的地理范围大小绘制直方图,现有包含地理范围大小及不同哺乳动物名称的数据列,已编写如下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
相关产品推荐
相关产品推荐

