在使用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()
}
网友评论