ggplot通过R中的熔化data.frame

时间:2014-04-01 16:52:10

标签: r ggplot2 reshape2 large-data

以下是我正在使用的数据框架结构:

> str(final.c)
'data.frame':   218916 obs. of  7 variables:
 $ strain  : chr  "CX11285" "ED3048" "JU1200" "CX11315" ...
 $ row     : Factor w/ 8 levels "A","B","C","D",..: 1 1 1 1 1 1 2 2 2 2 ...
 $ col     : Factor w/ 12 levels "1","2","3","4",..: 1 3 5 7 9 11 1 3 5 7 ...
 $ variable: Factor w/ 79 levels "n","meanTOF",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ value   : num  312 697 159 381 175 110 324 198 179 375 ...
 $ L1      : int  1 1 1 1 1 1 1 1 1 1 ...
 $ set     : num  1 1 1 1 1 1 1 1 1 1 ...

以下是ggplot:

生成的直方图示例
var <- "norm.n"
plate <- c(1,5)
dat <- final.c
day <- 1
plot <- ggplot(subset(dat, variable %in% var & L1 %in% plate & set %in% day), 
               aes(value, fill = factor(L1))) + geom_histogram()

上面的图显示了这个大型融合数据的一个子集。我说它已经融化了,因为我在&#34; final.c&#34;之前的一个data.frames列表上运行了熔化。具体地说,该子集在set = 1&amp;当变量=&#34; norm.n&#34; &安培;当L1 = 1或5.这会产生两个直方图,我按颜色分割。

我想要做的是设计一个生成多个图的函数。这些情节包括: 直方图绘制&#34;板&#34; (在final.c中为L1)1至每个var的板5-30(在final.c中的变量)。这也必须按集合进行分组,其中有2个(集合1和集合2)

因此,这将产生26(板比较数)X 80(final.c中的变量数)= 2080个图。我将对变量列表进行子集化,以使图表更易于管理,但这个想法应该是相同的。

为了问题,我们可以在这个例子中调用变量v1 ... v80

感谢您提供的任何帮助,我会定期检查可能不清楚的任何内容。

编辑 ::

根据评论中的建议,我做了一个简单的for循环来生成每个板块的图(final.c中的L1)比较,它如下:

for(i in 5:10){
  var <- "norm.n"
  plate <- c(1, i)
  dat <- final.c
  day <- 1
  plot <- ggplot(subset(dat, variable %in% var & L1 %in% plate & set %in% day), 
                 aes(value, fill = factor(L1))) + geom_histogram()
  setwd("~/Dropbox/Andersen lab/LabFolders/Stefan/testplots/")
  ggsave(filename = paste(var, i, ".jpg", sep = ""), plot = plot, height=4, width=8, units="in", dpi=300)
}

这给出了6个直方图,比较了来自final.c的两个不同的L1值。我可以很容易地扩展它以进行所有板块比较(例如(i,在5:30))。

这是剩下的问题 - 如何循环通过板并同时通过变量。 &#34;变量&#34; final.c中的列是一组具有79个级别的因子。我想做的是循环这些因素,但我不知道如何。如下所示:

for(i in 5:10){
  var <- ***LOOP THROUGH VARIABLES COLUMN IN final.c***
  plate <- c(1, i)
  dat <- final.c
  day <- 1

我只是不确定有关此问题的语法。

2 个答案:

答案 0 :(得分:0)

这是我想出的正确方向@shujaa

for(j in levels(final.c$variable)){
  for(i in 5:6){
    var <- j
    plate <- c(1, i)
    dat <- final.c
    day <- 1
    plot <- ggplot(subset(dat, variable %in% var & L1 %in% plate & set %in% day), 
                   aes(value, fill = factor(L1))) + geom_histogram()
    setwd("~/Dropbox/Andersen lab/LabFolders/Stefan/testplots/")
    ggsave(filename = paste(var, j, i, ".jpg", sep = ""), plot = plot, height=4, width=8, units="in", dpi=300)
  }
}

所有仍需要合并的是第1组和第2组,但此时应该是直接的

答案 1 :(得分:0)

您需要嵌套循环。为了便于理解,我们不会使用ij,而是使用更具描述性的名称。

此外,您应该能够在循环之前设置一次工作目录。将final.c复制到dat也是不必要的。

像这样的东西

setwd("~/Dropbox/Andersen lab/LabFolders/Stefan/testplots/")

for (end_plate in 5:10) {
    for (var in unique(final.c$variable)) {
        plate <- c(1, end_plate)
        day <- 1
        plot <- ggplot(subset(final.c, variable %in% var & L1 %in% plate & set %in% day), 
                       aes(value, fill = factor(L1))) + geom_histogram()  
        ggsave(filename = paste(var, end_plate, ".jpg", sep = ""),
               plot = plot, height=4, width=8, units="in", dpi=300)
  }
}