ggplot在循环中的一个"bug"

2020-07-14  本文已影响0人  一只烟酒僧

在使用for循环操作ggplot时,mapping中切忌使用x[[i]]$y这种格式的引用,如:

iris[150,]<-c(1,1,1,1,"setosa")
table(iris$Species)
#此时Species是不相等的
#setosa versicolor  virginica 
#       51         50         49 
iris1<-split(iris,iris$Species)
p<-list()
for (i in 1:3) {p[[i]]<-ggplot(iris1[[i]],aes(x=Sepal.Length,y=Sepal.Width,color=iris1[[i]]$Species))+geom_point()
    
}
#此时并不会报错,但是如果你查看p中的每个图的时候会报错
p[[1]]
#Error: Aesthetics must be either length 1 or the same as the data (51): colour
#Run `rlang::last_error()` to see where the error occurred
原因是:
#> p[[1]]$mapping
#Aesthetic mapping: 
#* `x`      -> `Sepal.Length`
#* `y`      -> `Sepal.Width`
#* `colour` -> `iris1[[i]]$Species`
#就是说它在绘制图形的时候仍然会使用iris1[[i]]$Species作为mapping,由于i已经变化了,所以就会导致做出的图的color与图的data不相符的情况,因此在使用ggplot作图时,尽量使用原data.frame中的变量名,不要引用!

正确方法为:

for (i in 1:3) {p[[i]]<-ggplot(iris1[[i]],aes(x=Sepal.Length,y=Sepal.Width,color=Species))+geom_point()
    
}
上一篇下一篇

猜你喜欢

热点阅读