如何在R中匹配气泡饼图地图的图例气泡大小
解决方案:scatterpie气泡饼图图例问题修复
问题1:图例气泡尺寸与地图上的饼图大小不匹配
scatterpie的r参数控制气泡半径,而ggplot默认的size图例是按半径线性映射,但我们需要气泡面积对应host_sum数值(面积感知更符合视觉直觉),这直接导致中间尺寸的图例气泡和实际饼图大小偏差。
解决方法:用scale_size_area()替代默认的size映射,手动构建面积正比的标尺,指定匹配的breaks和labels:
# 示例:假设host_sum的关键取值为2、4、6 scale_size_area( breaks = c(2, 4, 6), labels = c("2", "4", "6"), name = "Host Sum", max_size = 10 # 根据图表布局调整最大气泡半径 )
注意:scatterpie的r参数要和host_sum做对应缩放,比如r = host_sum/10(分母需和scale_size_area()的max_size匹配,确保最大数值对应的气泡半径等于max_size)。
问题2:移除自动生成的host_sum图例
直接在geom_scatterpie()中添加show.legend = FALSE关闭自动图例,再用上述手动构建的scale_size_area()生成正确的大小图例。
完整代码框架示例:
library(ggplot2) library(scatterpie) library(sf) # 假设sites_data是包含经纬度、host_sum及三类数据的sf对象 # gabon_map是加蓬及周边的底图sf数据 ggplot() + geom_sf(data = gabon_map) + geom_scatterpie( data = sites_data, aes(x = lon, y = lat, r = host_sum/10), # 缩放比例和max_size对应 cols = c("type1", "type2", "type3"), # 替换为你的三类数据列名 show.legend = FALSE # 关闭自动生成的host_sum图例 ) + # 饼图类别图例(按需保留) scale_fill_manual( name = "Data Type", values = c("type1"="#FF5733", "type2"="#33FF57", "type3"="#3357FF") ) + # 正确的大小图例 scale_size_area( breaks = c(2, 4, 6), labels = c("2", "4", "6"), name = "Host Sum", max_size = 10 ) + theme_minimal()
额外提示
- 若host_sum是连续值,可通过
breaks指定需要显示的刻度,确保图例气泡面积和实际饼图严格对应。 - 调整
r = host_sum/xx的分母时,要保证最大host_sum对应的r值等于scale_size_area()的max_size,这样图例和实际显示的大小完全匹配。
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

