如何在geom_sf中按像素设置尺寸而非基于数据离散度?
问题描述
我希望两张图的红点按数据比例区分,即第二张图的点需比第一张图大1000倍:
图1
library(sf) nc <- st_read(system.file("shape/nc.shp", package = "sf")) point <- st_point(x = c(-80, 35)) dot <- st_sfc(point, crs = 4236) ( ggplot() + geom_sf(data = nc) + geom_sf(data = dot, aes(size = 5)) + theme_minimal() )

图2
( ggplot() + geom_sf(data = nc) + geom_sf(data = dot, aes(size = 5000)) + theme_minimal() )

当前设置size参数后点大小未达预期,需实现按像素设置尺寸而非基于数据离散度。
解决方案
问题核心
geom_sf()中,若在aes()内设置size,ggplot会将数值映射为相对缩放尺寸(基于数据离散度自动调整比例),而非直接对应像素大小,这就是尺寸比例未达预期的原因。
按像素控制大小的两种方法
方法1:直接在geom_sf()外定义size
将size放在aes()外部时,数值会被当作绝对尺寸使用(ggplot中1个单位约对应0.75像素,比例关系完全匹配输入值):
# 图1:设置绝对尺寸为5 ( ggplot() + geom_sf(data = nc) + geom_sf(data = dot, size = 5) + theme_minimal() ) # 图2:设置绝对尺寸为5000,是图1的1000倍 ( ggplot() + geom_sf(data = nc) + geom_sf(data = dot, size = 5000) + theme_minimal() )
方法2:使用scale_size_identity()(适配批量控制场景)
如果需要通过数据列批量定义大小,可搭配scale_size_identity()让ggplot直接使用输入的size值作为绝对尺寸:
# 创建包含尺寸数据的sf对象 dot_df <- st_sf(size_val = c(5, 5000), geometry = c(dot, dot)) ( ggplot() + geom_sf(data = nc) + geom_sf(data = dot_df, aes(size = size_val)) + scale_size_identity() + theme_minimal() )
效果说明
使用以上方法后,两张图的点大小会严格按照1:1000的比例呈现,完全符合数据比例要求。
内容的提问来源于stack exchange,提问作者pietrodito
相关产品推荐
相关产品推荐

