【问题标题】:Overlaying trials in separate files onto one ggplot graph将单独文件中的试验叠加到一个 ggplot 图上
【发布时间】:2019-04-22 19:18:49
【问题描述】:

我正在尝试通过多次试验(来自单独的文本文件)绘制一张图。在下面的例子中,我用“发射率”变量绘制“位置”变量,当我单独使用 ggplot 时它可以工作:

a <- read.table("trial1.txt", header = T)
library(ggplot2)
ggplot(a, aes(x = place, y = firing_rate)) + geom_point() + geom_path()

但是当我尝试创建一个 for 循环来遍历文件夹中的每个试用文件并将其绘制在同一个图表上时,我遇到了问题。这是我目前所拥有的:

 files <- list.files(pattern=".txt")
 for (i in files){
   p <- lapply(i, read.table)
   print(ggplot(p, aes(x = place, y = firing_rate)) + geom_point() + geom_path())
 }

它给了我一个“错误:data 必须是一个数据框,或者由fortify() 强制的其他对象,而不是一个列表”消息。我是 R 的新手,所以我不知道该怎么做。

提前感谢您的帮助!

【问题讨论】:

  • 您正在使用lapply 循环来读取文件,这总是返回一个列表,而 ggplot 需要一个 data.frame。你能试试p &lt;- read.table(i)吗?还是p &lt;- read.table(i, header = T)
  • @teunbrand 您的建议确实产生了输出,但并非所有来自不同试验的数据同时绘制。它只是看起来不同,但 obs 数量相同。
  • @markus 我收到了这条消息:“x[, c("place", "firing_rate")] 中的错误:维度数不正确",但这可能是因为每个试验文件都有 3 个变量,但是我只是选择只看两个(地点和射击率)。
  • "[.data.frame(read.table(x), , c("place", "firing_rate")) 中的错误:选择了未定义的列可以提供所以它确实有效?
  • 您想一次将来自不同试验的所有数据都绘制在一个图中吗?因为在这种情况下,所有列都相同,您可以通过mylist &lt;- lapply(setNames(files, files), read.table, header = T) 读取所有文件。然后,您可以将一些 ID 放在带有 mylist &lt;- lapply(names(mylist), function(i) {cbind(mylist[[i]], ID = i)}) 的特殊列中,然后您可以通过执行 mydata &lt;- do.call(rbind, mylist) 来组合 mylist 中的所有内容。但这只有在每个文件都具有相同的列结构时才有效。

标签: r for-loop ggplot2


【解决方案1】:

一般而言,避免循环是 R 中的最佳建议。由于您使用的是 ggplot,因此您可能有兴趣使用 tidyverse 中的 map_df 函数:

首先创建一个读取函数并包含文件名作为试用标签:

readDataFile = function(x){
a <- read.table(x, header = T)
a$trial = x
return(a)
}

接下来map_df

dataComplete = map_df(files, readDataFile)

这会在每个文件上运行我们的小函数并将它们全部组合到一个数据帧中(当然假设它们在格式上兼容)。

最后,您几乎可以像以前一样绘制,但可以根据试验变量进行区分:

ggplot(dataComplete, aes(x = place, y = firing_rate, color=trial, group=trial)) + geom_point() + geom_path()

【讨论】:

    猜你喜欢
    • 2021-10-21
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    相关资源
    最近更新 更多