如何在R的symbols函数中统一地图圆圈缩放以实现跨时段可比
解决symbols函数地图圆圈缩放一致性问题
要让不同时段地图的圆圈半径对应相同数值,核心是统一所有绘图的缩放基准——用所有时段数据的全局最大值来定标,而不是每个时段自己的最大值。
问题根源
你当前的代码中,symbols会自动用当前数据集(比如2010年)的number最大值来缩放圆圈,导致2010年的最大值对应0.25英寸直径,2011年的最大值也对应0.25英寸直径。如果两年的最大值不同,相同数值的圆圈大小就会不一样,失去可比性。
解决方案
方案1:保持默认的「面积与数值成正比」(推荐,和你原代码逻辑一致)
先计算所有时段number的全局最大值,然后将每个时段的数值按比例缩放到「0-全局最大值」的范围,再传给symbols,这样所有绘图的缩放基准统一。
# 1. 计算所有年份数据的全局最大值 max_global <- max(data2010$number, data2011$number) # 2. 绘制2010年地图 plot(my_map) # 将数值按全局最大值比例缩放,传给circles参数 symbols(data2010$Lon, data2010$Lat, circles = data2010$number / max_global, inches = 0.25, add = T) # 3. 绘制2011年地图 plot(my_map) symbols(data2011$Lon, data2011$Lat, circles = data2011$number / max_global, inches = 0.25, add = T)
方案2:让「半径与数值成正比」
如果你希望圆圈半径直接和number数值成正比(而非面积),可以手动计算每个点的直径,用inches参数直接控制大小:
# 1. 计算全局最大值和设定最大圆圈直径(和原代码一致设为0.25英寸) max_global <- max(data2010$number, data2011$number) max_diameter <- 0.25 # 2. 2010年地图 plot(my_map) # 计算每个点的直径:(当前数值/全局最大值)*最大直径 diameters_2010 <- (data2010$number / max_global) * max_diameter # circles设为1,用inches参数控制实际大小 symbols(data2010$Lon, data2010$Lat, circles = rep(1, nrow(data2010)), inches = diameters_2010, add = T) # 3. 2011年地图 plot(my_map) diameters_2011 <- (data2011$number / max_global) * max_diameter symbols(data2011$Lon, data2011$Lat, circles = rep(1, nrow(data2011)), inches = diameters_2011, add = T)
效果验证
两种方案都能让相同number数值在不同年份的地图上对应完全一样大小的圆圈,保证了跨时段的可比性。你可以根据自己对圆圈大小的逻辑需求选择其中一种。
内容的提问来源于stack exchange,提问作者Eleni Servou
相关产品推荐
相关产品推荐

