ggplot2:为什么符号大小在' size'包含内部与外部的aes声明?

时间:2017-08-21 17:18:47

标签: r ggplot2

我使用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)

enter image description here

2 个答案:

答案 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

enter image description here

更改几次,看看哪一个适合您。请注意,存在一个常见的可视化陷阱,即将数字表示为区域(谷歌,例如“为什么饼图不好”)。

编辑:回答下面的评论,您可以通过以下方式引入固定缩放: 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

还有文档:http://ggplot2.tidyverse.org/reference/aes.html