【问题标题】:ggplot through a melted data.frame in Rggplot通过R中融化的data.frame
【发布时间】:2014-05-12 14:14:27
【问题描述】:

这是我正在使用的数据框结构:

> 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()

上面的图查看了这个大的熔化 data.frame 的一个子集(我说它被熔化了,因为我在“final.c”之前在一个 data.frames 列表上运行了熔化)。具体来说,子集是当 set = 1 & when variable = "norm.n" & 当 L1 = 1 或 5 时。这会生成两个直方图,我将它们按颜色分开。

我想做的是设计一个生成多个图的函数。这些地块将包括: 为每个 var(final.c 中的变量)绘制“板块”(final.c 中的 L1)1 到板块 5-30 的直方图。这也必须按集合分组,其中有 2 个(集合 1 和集合 2)

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

为了这个问题,我们只调用这个例子中的变量,v1...v80

感谢所有帮助,我会定期检查是否有任何不清楚的地方。

编辑 ::

按照 cmets 中的建议,我做了一个简单的 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 值。我可以轻松扩展它以进行所有板块比较(例如 for(i in 5:30))。

这是剩下的问题 - 如何循环遍历板块并同时遍历变量。 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

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

【问题讨论】:

  • 你到底卡在哪里了?您是否尝试过将其包装在 for 循环中以通过您想要绘制的板组?试着把你的问题分解成碎片,一次一个地解决。
  • @shujaa ,我已对问题进行了编辑以解决您的问题。我认为这让我卡在哪里更清楚。谢谢。

标签: r ggplot2 reshape2 large-data


【解决方案1】:

这是我想出的,感谢@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 组,但此时应该直截了当

【讨论】:

    【解决方案2】:

    您需要嵌套循环。为了便于理解,我们将使用更具描述性的名称,而不是使用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)
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-01
      • 2021-02-15
      • 2023-04-03
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      相关资源
      最近更新 更多