在for循环中使用ggplot生成多个图时出错

sigwle7e  于 2023-05-11  发布在  其他
关注(0)|答案(2)|浏览(113)

我在R中有一个dataframe(tibble),我试图使用ggplot的dataframe的多个列来生成散点图和密度图。我尝试使用for循环来打印每一列的代码,但每次我都得到以下错误。
不知道如何为<tbl_df/tbl/data.frame>类型的对象自动选取比例。默认为连续。data[[var]][scale_index[[i]]]中的错误:不能将列的子集设置在末尾之后。位置2、3、4、...、999和1000不存在。只有一列。
我尝试了下面的代码,但是每次我试图使用for循环将y值作为data[,i]传递时都会得到这个错误。

set.seed(1000)
data<- data_frame(x=1:1000, y1=rnorm(1000), y2=rnorm(1000), y3=rnorm(1000))
> data
# A tibble: 1,000 × 4
       x     y1      y2     y3
   <int>  <dbl>   <dbl>  <dbl>
 1     1 -1.37  -2.33    1.79 
 2     2  0.163  0.853  -1.04 
 3     3 -0.113 -0.557  -0.292
 4     4  0.860 -1.38   -1.79 
 5     5  0.129 -0.0861  0.514
 6     6  0.193 -0.378   1.69 
 7     7  0.390 -0.610  -0.698
 8     8 -2.23  -0.362   0.136
 9     9  1.03  -0.299   0.728
10    10  1.20  -0.0263 -1.16 
# ℹ 990 more rows
for (i in 2:ncol(data)){
     print(ggplot(data, aes(x=x, y= data[ ,i]))+geom_point())
     Sys.sleep(2)
 }

有人知道怎么解决这个问题吗?为什么我会得到这个特定的错误?

k97glaaz

k97glaaz1#

一个字节的每一列本身就是一个字节。这不是ggplot()期望的x和y值:它需要aes()中的列名。
绘制数据的更好方法是将其转换为长格式,其中一列用于y变量名称,另一列用于其值。此外,您的示例代码将用最新的图覆盖每个图。您可能希望将每个图保存到一个文件中,或者考虑使用面来显示所有3个y变量。
就像这样:

library(ggplot2)
library(tidyr)

data %>% 
  pivot_longer(-x) %>% 
  ggplot(aes(x, value)) + 
  geom_point() + 
  facet_wrap(~name) +
  theme_bw()

结果:

2nbm6dog

2nbm6dog2#

渲染ggplot()时需要列的名称。
您可以在for循环中使用列名。

library(dplyr)
library(ggplot2)

set.seed(1000)
data<- tibble(x=1:1000, y1=rnorm(1000), y2=rnorm(1000), y3=rnorm(1000))

for (i in names(data)[2:4]){
  print(
    ggplot(data, aes(x=x, y= .data[[i]]))+
    # ggplot(data, aes(x=x, y= get(i)))+ # OR using get()
          geom_point()
    )
  Sys.sleep(2)
}

创建于2023-05-11带有reprex v2.0.2

相关问题