绘制循环中的几个分组条形图[R]

时间:2014-11-03 21:26:02

标签: r loops bar-chart

我的挑战是一次绘制几个条形图,一个不同子集的每个变量的图。我的目标是比较每个变量的区域差异。我想通过R Markdown将所有结果图打印到html文件中。

制作自动分组条形图的主要困难是您需要使用table(data$Var[i], data$Region)将这些组制成表格,但我不知道如何自动执行此操作。我非常感谢这一点。

以下是我的子集之一的示例:

# To Create this example of data:
b <- rep(matrix(c(1,2,3,2,1,3,1,1,1,1)), times=10)  
data <- matrix(b, ncol=10)
colnames(data) <- paste("Var", 1:10, sep = "")
data <- as.data.frame(data)
reg_name <- c("North", "South")
Region <- rep(reg_name, 5)
data <- cbind(data,Region)

使用beside = TRUE,我能够创建一个分组条形图(按区域分类,从数据中分配Var1):

tb <- table(data$Var1,data$Region) 
barplot(tb, main="Var1", xlab="Values", legend=rownames(tb), beside=TRUE,
        col=c("green", "darkblue", "red"))

我想循环这个过程来生成例如Var1到Var10的10个图:

for(i in 1:10){
     tb <- table(data[i], data$Region)
     barplot(tb, main = i, xlab = "Values", legend = rownames(tb), beside = TRUE, 
             col=c("green", "darkblue", "red"))
     }

R更喜欢apply系列函数,因此我尝试创建一个要应用的函数:

fct <- function(i) {
      tb <- table(data[i], data$Region)
      barplot(tb, main=i, xlab="Values", legend = rownames(tb), beside = TRUE,
             col=c("green", "darkblue", "red"))
      }
sapply(data, fct)

我尝试过其他方法,但我从未成功过。也许latticeggplot2可以提供更简单的方法。我刚开始在R,我很乐意接受任何提示和建议。谢谢!

(我在Windows上运行,使用最新的Rv3.1.2&#34; Pumpking Helmet&#34;)

1 个答案:

答案 0 :(得分:2)

鉴于您说&#34;我的目标是比较每个变量的区域差异&#34;,我不确定您是否选择了最佳绘图策略。但是,是的,你可以做你想要的事情。

以下是您使用上述代码获得的默认情节,供参考:

enter image description here

如果你想要一个包含每个变量10个图的列表,你可以执行以下操作(使用ggplot)

many_plots <-

  # for each column name in dat (except the last one)...
  lapply(names(dat)[-ncol(dat)], function(x) {

    this_dat <- dat[, c(x, 'Region')]
    names(this_dat)[1] <- 'Var'

    ggplot(this_dat, aes(x=Var, fill=factor(Var))) +
      geom_bar(binwidth=1) + facet_grid(~Region) +
      theme_classic()
  })

many_plots[[1]]的示例输出:

enter image description here

如果你想要一张图片中的所有图,你可以这样做(使用reshape和data.table)

library(data.table)
library(reshape2)
dat2 <- 
  data.table(melt(dat, id.var='Region'))[, .N, by=list(value, variable, Region)]

ggplot(dat2, aes(y=N, x=value, fill=factor(value))) +
  geom_bar(stat='identity') + facet_grid(variable~Region) +
  theme_classic()

enter image description here

......但这不是一个很好的情节。