首页 > 解决方案 > GGplot - 输入数据框列表

问题描述

我有一个数据框列表 df_list = (df1,df2,df3),所有相同的维度但不同的列名。我在 for 循环中调用 ggplot:

for(i in 1:3){
p = ggplot(df_list[[i]], aes(x=df_list[[i]][1], y=df_list[[i]][3], fill=df_list[[i]][2])) +
  geom_bar(stat='identity', position='dodge')
}

但是,R 不允许我这样做:我必须实际使用变量名,这意味着我不能使用循环。有什么解决办法吗?

这是示例数据:

df1<-data.frame(order=c(1:3,4:6), gender=c('f','f','f','m','m','m'), count= c(10,20,30,20,25,30))
 
 df2<-data.frame(order11=c(2:4,2:4), gender11=c('f','f','f','m','m','m'), count= c(11,21,30,21,25,30))
 
 df3<-data.frame(order22=c(1:3,4:6), gender22=c('f','f','f','m','m','m'), count= c(10,20,31,21,25,30))
 >  df1
  order gender count
1     1      f    10
2     2      f    20
3     3      f    30
4     4      m    20
5     5      m    25
6     6      m    30
> 

标签: rlistggplot2

解决方案


您的数据框中可能有不同的列名,但列的角色似乎是由它们在数据框中的索引定义的。例如,您希望 thr 数据框中的第一列在图中定义 x 值,依此类推。这意味着您可以使用names()aes_string()获得您想要的东西。

首先定义一些测试数据,因为你没有给我们任何。

library(tidyverse)

df1 <- tibble(x1=rnorm(10), y1=rnorm(10), z1=rep(c("A", "B"), each=5))
df2 <- tibble(x2=rnorm(10), y2=rnorm(10), z2=rep(c("A", "B"), each=5))
df3 <- tibble(x3=rnorm(10), y3=rnorm(10), z3=rep(c("A", "B"), each=5))
dfList <- list(df1, df2, df3)

现在解决问题

lapply(
  dfList,
  function(df) {
    names <- names(df)
    df %>% ggplot(aes_string(x=names[1], y=names[2], colour=names[3])) + geom_point()
  }
)

给予

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

我使用了geom_point()andcolour而不是geom_bar()andfill但同样的原则也适用。


推荐阅读