我已经使用 base-R 创建了很多 map ,但我现在正尝试使用 ggplot2 执行类似的任务,因为可以在单个页面上轻松排列多个图。基本上,我正在绘制收集特定感兴趣物种样本的位置,并希望符号大小反射(reflect)在该位置收集的物种的总重量。创建 basemap 和各种图层不是问题,但我无法按照我想要的方式获取符号大小和相关联的图例。
下面的可行示例演示了该问题。当我在 aes 之外包含“大小”时,符号大小似乎被适本地缩放(plot1)。但是当我在 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)
最佳答案
首先,您不应该在 aes
中引用数据框名称,它会将图例弄乱。所以正确的版本将是
plot3 <- ggplot(catch.data,aes(x=long,y=lat)) +
geom_point(aes(size=wt),colour="white",fill="blue",shape=21)
现在为了展示多样性,您应该使用
range
的 scale_size_continuous
参数,例如plot3 + scale_size_continuous(range = range(catch.data$wt) / 5)
多换几次,看看哪一个适合你。请注意,存在将数字表示为区域的常见可视化陷阱(谷歌例如“为什么饼图不好”)。
编辑:回答下面的评论,您可以通过例如引入固定比例
scale_size_continuous(limits = c(1, 200), range = c(1, 20))
。
关于r - ggplot2:当 'size' 包含内部和外部 aes 语句时,为什么符号大小不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45802571/