绘制许多csv" row" Matlab中的文件(如果您喜欢,则为R)

时间:2016-03-09 13:18:25

标签: r matlab csv plot

问题

我有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)

......但我正在寻找程序方式。

UPDATE2

感谢您的回答,我做了一个简单的黑客攻击,最终找到了正确的解决方案,但这是一个黑客攻击。我刚用python来复制命令然后我把它们全部运行了......

@Crowley你的解​​决方案可能是正确的但不幸的是有一些语法问题。

@njc谢谢你的努力!但这不是我需要的,也许我的结果可以帮助你开发R代码,那么我一定会把你的答案提升为正确的答案。

结果如下:

enter image description here

用这个"愚蠢的" script

2 个答案:

答案 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

Simple box plot. It's also easy to do things like change the axis names, legend title, etc.

现在我再次阅读你的帖子,我发现你可能意味着你想把它们指向散点图,文件中数字的位置为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

Scatter plot

我希望这有帮助!如果您对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

Plot with geom_smooth

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