【问题标题】:Plot many csv "row" files in Matlab (or R if you prefere) [closed]在 Matlab 中绘制许多 csv“行”文件(或 R,如果你喜欢的话)[关闭]
【发布时间】:2016-06-23 21:27:19
【问题描述】:

问题

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

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

更新2

感谢您的回答,我做了一个简单的 hack,我最终得到了正确的解决方案,但它是一个 hack。我刚刚使用 python 来复制命令,然后我运行了所有命令......

@Crowley 您的解决方案可能是正确的,但不幸的是存在一些语法问题。

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

结果如下:

用这个“愚蠢的”script制造

【问题讨论】:

  • 文件名如何?它们是否在同一个文件夹中?将数据导入程序可能是这里的关键,对吧?
  • 名称为 sudoku1_EUC.csv sudoku2_EUC.csv ... sudoku50_EUC.csv 。问题是我对这两个框架的了解几乎为零。
  • 这听起来像是读取文件的基本循环任务,然后生成一些漂亮的图表,其中包含各种文件的图例方面。您是否可以考虑通过为几个文件提供一些类似于您的真实数据的内容来使示例更具重现性?
  • 为什么不向我们展示您的尝试并选择一种语言
  • 好吧,sudoku0_EUC.csv:pastebin.com/FfBCryCMsudoku1_EUC.csv:pastebin.com/1J6KXg2Nsudoku15_EUC.csv:pastebin.com/LBFRw7gS@rawr,因为我告诉过你我对框架的了解为零。我注意到您可以通过一次调用将 csv 收集到一个数组中,但我不想手动进行。我在问一种我不知道的程序方式。

标签: r matlab csv plot


【解决方案1】:

恐怕我不知道任何 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 阻止它在背景中将标准错误显示为灰色带。如果标准错误对您有帮助,您可以省略它。

【讨论】:

  • @rawr 我已经加载了 ggplot 2.0.0。看起来他们现在已经到了 2.1.0。
  • 您的编辑修复了它,谢谢
  • @rawr 可能是我将列命名为“a”、“b”和“c”。让我知道它现在是否有效。
【解决方案2】:

假设我们在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(:))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-13
    • 2010-12-25
    • 2018-02-26
    • 2011-07-18
    • 2012-05-01
    • 2010-09-05
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多