我有50个带有这种结构的.csv文件:
value1,value2,...
一个长行,每个值用逗号分隔。
具体来说,它们是浮点数,每个csv都有不同数量的值。
0.0023593,0.0062565,0.00723753,0.0023353,0.0052353,0.0024353,...
我必须在相同的图表中绘制每个数据文件,以查找此值的趋势,并可能使用平均图表。
我怎样才能以简单的方式做到这一点? Matlab是首选,但R是好的
我知道我可以像[在Matlab中]那样做:
>> arr1 = csvread('file1.csv');
>> plot(arr1)
和
>> arr2 = csvread('file2.csv');
>> plot(arr2)
......但我正在寻找程序方式。
感谢您的回答,我做了一个简单的黑客攻击,最终找到了正确的解决方案,但这是一个黑客攻击。我刚用python来复制命令然后我把它们全部运行了......
@Crowley你的解决方案可能是正确的但不幸的是有一些语法问题。
@njc谢谢你的努力!但这不是我需要的,也许我的结果可以帮助你开发R代码,那么我一定会把你的答案提升为正确的答案。
结果如下:
用这个"愚蠢的" script
答案 0 :(得分:2)
我担心我不知道任何MATLAB,但在R中执行此操作的一种方法是使用ggplot2包。它的工作原理是在绘图中添加不同的图层,这使得它成为使用不同数据框的便捷方式。
首先,我生成了一些要使用的示例数据。
a <- data.frame(runif(100))
b <- data.frame(runif(150))
c <- data.frame(runif(125))
names(a) <- 'y'
names(b) <- 'y'
names(c) <- 'y'
这些只是不同长度的随机变量的数据帧。因为你的所有数据都是一维的,所以我制作了一个盒子图。
然后我分别使用每个数据框创建一个ggplot。
p <- ggplot()
p <- p + geom_boxplot(data=a, aes(y=y, x=1, color='a'))
p <- p + geom_boxplot(data=b, aes(y=y, x=2, color='b'))
p <- p + geom_boxplot(data=c, aes(y=y, x=3, color='c'))
p # to show the plot
每次我使用geom_boxplot()我都会在图中添加另一个图层。您也可以在一行中完成此操作。
p <- ggplot() + geom_boxplot(data=a, aes(y=y, x=1, color='a')) + geom_boxplot(data=b, aes(y=y, x=2, color='b')) + geom_boxplot(data=c, aes(y=y, x=3, color='c'))
p # to show the plot
现在我再次阅读你的帖子,我发现你可能意味着你想把它们指向散点图,文件中数字的位置为x值。使用ggplot很容易,但在我的例子中你不会看到任何趋势,因为我的值都是随机的。
q <- ggplot()
q <- q + geom_point(data=a, aes(y=y, x=1:dim(a)[1], color='a'))
q <- q + geom_point(data=b, aes(y=y, x=1:dim(b)[1], color='b'))
q <- q + geom_point(data=c, aes(y=y, x=1:dim(c)[1], color='c'))
q
或者
q <- ggplot() + geom_point(data=a, aes(y=y, x=1:dim(a)[1], color='a')) + geom_point(data=b, aes(y=y, x=1:dim(b)[1], color='b')) + geom_point(data=c, aes(y=y, x=1:dim(c)[1], color='c'))
q
我希望这有帮助!如果您对ggplot有任何疑问,请告诉我。虽然我当然不是专家,但我会尽我所能。
注意:在制作图表之前,我已将a,b和c的列名更改为“y”,但我在制作数据时忘记更新其名称。
这与您想要平滑曲线而不是点之间的唯一区别是什么?如果是这样,这是一个简单的解决方法。
首先,我更改了数据以使其具有趋势。
a <- data.frame(runif(100)-(1:100)/300)
b <- data.frame(runif(150)-(1:150)/300)
c <- data.frame(runif(125)-(1:125)/300)
names(a) <- 'y'
names(b) <- 'y'
names(c) <- 'y'
然后我只是将geom_point
替换为geom_smooth
。
r <- ggplot()
r <- r + geom_smooth(data=a, aes(y=y, x=1:dim(a)[1], color='a'), se=FALSE)
r <- r + geom_smooth(data=b, aes(y=y, x=1:dim(b)[1], color='b'), se=FALSE)
r <- r + geom_smooth(data=c, aes(y=y, x=1:dim(c)[1], color='c'), se=FALSE)
r
se=FALSE
阻止它将标准错误显示为背景中的灰色条带。如果标准错误对您有帮助,您可以省略它。
答案 1 :(得分:0)
假设我们在YourFolder='whatever\address\'
文件夹中有数据,那么如果我们想要double
数组:
Files=dir(['YourFolder' .*']); % look for csv. files in the folder
[M,~]=size(Files); % count them
AllData=zeros(M,0);
for ii=1:M
Temp=importdata([YourFolder,Files(ii).name '.csv'],','); % Read csv file into a structure
Temp=Temp.data; & Use only the data part
if size(Temp,2>size(AllData,2) %compare 2. dimensions of AllData and Temp
% if Temp is wider, then append NaN values to AllData to match widths
n=size(Temp,2)-size(AllData,2);
Refill=nan(M,n);
AllData=[AllData,Refill];
elseif size(Temp,2<size(AllData,2)
% If AllData is wider then append NaN values to Temp to match widths
n=size(AllData,2)-size(Temp,2);
Refill=nan(1,n);
Temp=[Temp,Refill];
end
% append new line to AllData
AllData(ii,:)=Temp;
end
plot(AllData') % Alldata shall be transposed because plot uses columns as data sets by default.
如果我们希望cell
数组与代码一起使用更简单,因为向量不需要匹配。
Files=dir(['YourFolder' .*']); % look for csv. files in the folder
[M,~]=size(Files); % count them
AllData=cell(M,1);
for ii=1:M
Temp=importdata([YourFolder,Files(ii).name '.csv'],','); % Read csv file into a structure
Temp=Temp.data; & Use only the data part
% append new line to AllData
AllData{ii}=Temp;
end
plot(AllData(:))