美文网首页
ggplot在循环中的一个"bug"

ggplot在循环中的一个"bug"

作者: 一只烟酒僧 | 来源:发表于2020-07-14 08:52 被阅读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()
    
}

相关文章

网友评论

      本文标题:ggplot在循环中的一个"bug"

      本文链接:https://www.haomeiwen.com/subject/eotxhktx.html