我已经使用 base-R 创建了相当多的地图,但我现在尝试使用 ggplot2 执行类似的任务,因为可以轻松地将多个绘图排列在单个页面上。基本上,我正在绘制收集特定感兴趣物种样本的位置,并希望符号大小反映在该位置收集的物种的总重量。创建底图和各种图层并不是问题,但我无法按照我想要的方式获取符号大小和相关图例。
下面的可行示例演示了该问题。当我在 aes 之外包含“大小”时,符号大小似乎已适当缩放(图 1)。但是,当我将“大小”放入 aes 语句中(为了获得图例)时,符号大小不再正确(plot2)。看起来 ggplot2 已经重新调整了数据。这应该是一个简单的任务,所以我显然错过了一些非常基本的东西。任何帮助理解这一点的帮助将不胜感激。
library(ggplot2)
#create a very simple dataset that includes locations and total weight of samples collected from each site
catch.data<-data.frame(long=c(-50,-52.5,-52,-54,-53.8,-52),
lat=c(48,54,54,55,52,50),
wt=c(2,38,3,4,25,122))
#including 'size' outside of aes results in no legend
#but the symbol sizes are represented correctly
plot1<-ggplot(catch.data,aes(x=long,y=lat)) +
geom_point(size=catch.data$wt,colour="white",fill="blue",shape=21)
#including 'size' within aes appears necessary in order to create a legend
#but the symbol sizes are not represented correctly
plot2<-ggplot(catch.data,aes(x=long,y=lat)) +
geom_point(aes(size=catch.data$wt),colour="white",fill="blue",shape=21)
Run Code Online (Sandbox Code Playgroud)
首先,您不应该引用 中的数据框名称aes,它会弄乱图例。所以正确的版本是
plot3 <- ggplot(catch.data,aes(x=long,y=lat)) +
geom_point(aes(size=wt),colour="white",fill="blue",shape=21)
Run Code Online (Sandbox Code Playgroud)
现在,为了展示多样性,您应该尝试使用 的range参数scale_size_continuous,例如
plot3 + scale_size_continuous(range = range(catch.data$wt) / 5)
Run Code Online (Sandbox Code Playgroud)
更改几次,看看哪一个适合您。请注意,存在将数字表示为区域的常见可视化陷阱(例如“为什么饼图不好”)。
编辑:回答下面的评论,您可以通过例如引入固定缩放比例
scale_size_continuous(limits = c(1, 200), range = c(1, 20))。