一个图,多个时间序列,来自CSV文件ggplot2

时间:2016-02-11 04:01:07

标签: r ggplot2

我对R很陌生并且无法弄清楚如何做到这一点,尽管有一些相似但不完全相同的问题浮出水面。我所拥有的是几个(~10个)CSV文件,如下所示:

time, value
0, 5
100, 4
200, 8
etc.

那是他们当时记录了很长一段时间和价值观。我想使用ggplot2在R中的一个图表上绘制所有这些图,因此它看起来像这样enter image description here。我一直在尝试各种融合和合并,到目前为止都没有成功(虽然read.csv工作正常,我可以轻松地逐个绘制文件)。我无法弄清楚的一件事是,是否要将所有数据合并到ggplot2之前,或者以某种方式将所有数据单独传递给ggplot2。

我应该注意每个数据系列共享完全相同的时间点。我的意思是,如果文件1的值为100,200,300,...,1000,那么所有其他文件也是如此。 理想情况下,我希望解决方案不依赖于此,因为我可以看到未来的情况,其中时间类似地缩放但不完全相同,例如文件1有99,202,302,399,......文件2有101,201,398,400,......

非常感谢。

编辑:我可以像常规plot这样(笨拙地)这样做,这可能说明了我想要做的事情:

f1 = read.csv("file1.txt")
f2 = read.csv("file2.txt")
f3 = read.csv("file3.txt")
plot(f1$time,f1$value,type="l",col="red")
lines(f2$time, f2$value, type="l",col="blue" )
lines(f3$time, f3$value, type="l",col="green" )

3 个答案:

答案 0 :(得分:3)

我会把它分成4个任务。这也可以帮助寻找每个答案。

1. Reading a few files automatically, without harcoding the file names 
2. Merging these data.frame's , using a "left join"
3. Reshaping the data for ggplot2
4. Plotting a line graph

# Define a "base" data.frame
max_time = 600
base_df <- data.frame(time=seq(1, max_time, 1))

# Get the file names
all_files = list.files(pattern='.*csv')

# This reads the csv files, check if you need to make changes in read.csv
all_data <- lapply(all_files, read.csv)

# This joins the files, using the "base" data.frame
ls = do.call(cbind, lapply(all_data, function(y){
  df = merge(base_df, y, all.x=TRUE, by="time")
  df[,-1]
}))

# This would have the data in "wide" format
data = data.frame(time=base_df$time, ls)

# The plot
library(ggplot2)
library(reshape2)

mdf = melt(data, id.vars='time')
ggplot(mdf, aes(time, value, color=variable, group=variable)) +
  geom_line() +
  theme_bw()

答案 1 :(得分:2)

# Creating fake data
fNames <- c("file1.txt", "file2.txt", "file3.txt")

write.csv(data.frame(time=c(1, 2, 4), value=runif(3)), file=fNames[1])
write.csv(data.frame(time=c(3, 4), value=runif(2)), file=fNames[2])
write.csv(data.frame(time=c(5), value=runif(1)), file=fNames[3])

这是我的尝试,

fNames <- c("file1.txt", "file2.txt", "file3.txt")

allData <- do.call(rbind, # Read the data and combine into single data frame
               lapply(fNames,
                      function(f){
                        cbind(file=f, read.csv(f))
                      }))
require(ggplot2)
ggplot(allData)+
  geom_line(aes(x=time, y=value, colour=file)) # This way all series have a legend!

答案 2 :(得分:0)

四种方法可以做到这一点。

<强>第一

您可以将所有数据合并到一个数据框中,然后分别绘制每一行。以下是使用示例数据的代码:

library(ggplot2)
library(reshape2)
data1 <- data.frame(time=1:200, series1=rnorm(200))
data2 <- data.frame(time=1:200, series2=rnorm(200))

mergeData <- merge(data1, data2, by="time", all=TRUE)

g1 <- ggplot(mergeData, aes(time, series1)) + geom_line(aes(color="blue")) + ylab("")
g2 <- g1 + geom_line(data=mergeData, aes(x=time, y=series2, color="red")) + guides(color=FALSE)
g2

<强> SECOND

您可以融合合并的数据,然后使用单个ggplot代码进行绘图。以下是代码:

library(reshape2)
meltData <- melt(mergeData, id="time")
ggplot(meltData, aes(time, value, color=variable)) + geom_line()

<强> THIRD 这与您的编辑类似。变量名称应该相同。

library(ggplot2)
data1 <- data.frame(time=1:200, series1=rnorm(200))
data2 <- data.frame(time=1:200, series1=rnorm(200))

g1 <- ggplot(data1, aes(time, series1)) + geom_line(aes(color="blue")) + ylab("")
g2 <- g1 + geom_line(data=data2, aes(color="red")) + guides(color=FALSE)
g2

第四种方法:

这是执行任务的最通用方式,假设数量最少。此方法不假设变量名在每个数据集中都相同,但它会使您编写更多代码(代码中的错误变量名称) ,会给出错误。)

library(ggplot2)

data1 <- data.frame(id=1:200, series1=rnorm(200))
data2 <- data.frame(id=1:200, series2=rnorm(200))

g1 <- ggplot() + geom_line(data=data1, aes(x=id, y=series1, color="red")) +
       geom_line(data=data2, aes(x=id, y=series2, color="blue")) + guides(color=FALSE)
g1