我对R很陌生并且无法弄清楚如何做到这一点,尽管有一些相似但不完全相同的问题浮出水面。我所拥有的是几个(~10个)CSV文件,如下所示:
time, value
0, 5
100, 4
200, 8
etc.
那是他们当时记录了很长一段时间和价值观。我想使用ggplot2在R中的一个图表上绘制所有这些图,因此它看起来像这样。我一直在尝试各种融合和合并,到目前为止都没有成功(虽然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" )
答案 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