我使用base-R创建了很多地图,但我现在正尝试使用ggplot2执行类似的任务,因为可以轻松地在一个页面上排列多个绘图。基本上,我正在绘制已收集特定物种样本的位置,并希望符号大小反映在该位置收集的物种的总重量。创建基本地图和各种图层不是问题,但我无法按照我想要的方式获取符号大小和相关图例。
下面的可行例子证明了这个问题。当我包含' size'在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)
答案 0 :(得分:0)
首先,你不应该在aes
内引用数据框名称,它会使传奇搞砸了。所以正确的版本将是
plot3 <- ggplot(catch.data,aes(x=long,y=lat)) +
geom_point(aes(size=wt),colour="white",fill="blue",shape=21)
现在为了展示多样性,您应该使用range
的{{1}}参数,例如
scale_size_continuous
更改几次,看看哪一个适合您。请注意,存在一个常见的可视化陷阱,即将数字表示为区域(谷歌,例如“为什么饼图不好”)。
编辑:回答下面的评论,您可以通过以下方式引入固定缩放:
plot3 + scale_size_continuous(range = range(catch.data$wt) / 5)
。
答案 1 :(得分:0)
aes()中的任何值都映射到数据中的变量,而在aes()之外指定的值则不是这种情况
请参阅Difference between passing options in aes() and outside of it in ggplot2