我正在尝试使用Mathematica分析一些原始数据。我希望能够动态显示我对使用ManipulateListLinePlot感兴趣的数据范围,但是绘图渲染非常慢。我如何加快速度?

以下是一些其他详细信息。外部文本文件存储原始数据:第一列是时间戳记,第二,第三和第四列是数据读数,例如:

1309555993069, -2.369941, 6.129157, 6.823794
1309555993122, -2.260978, 6.170018, 7.014479
1309555993183, -2.070293, 6.129157, 6.823794
1309555993242, -1.988571, 6.238119, 7.123442

一个数据文件最多包含2·106行。例如,要显示第二列,我使用:
x = Import["path/to/datafile"];
ListLinePlot[x[[All, {1, 2}]]]

该操作的执行时间长得令人难以忍受。为了显示可变范围的数据,我尝试使用Manipulate:
Manipulate[ListLinePlot[Take[x, numrows][[All, {1, 2}]]], {numrows, 1, Length[x]}]

该指令有效,但是当我尝试显示数千行时,它会迅速爬网。我如何加快速度?

其他一些细节:
  • MATLAB几乎立即在同一台计算机上显示相同数量的数据,因此原始数据大小不应该成为问题。
  • 我已经尝试关闭图形抗锯齿功能,但是它根本没有影响渲染速度。
  • 使用DataRange避免Take没有帮助。
  • 使用MaxPlotPoints会严重扭曲图,以至于无法使用。
  • Take中不使用Manipulate无济于事。
  • 渲染似乎要花费大量时间。运行Timing[ListLinePlot[Take[x,100000][[All, {1, 2}]]]]会返回0.33:这意味着Take本身的评估几乎是瞬时的,这是使所有内容变慢的绘图渲染。
  • 我正在使用fglrx驱动程序在Ubuntu Linux 11.10上运行Mathematica。强制Mathematica使用台面驱动程序无济于事。

  • 有什么提示吗?

    最佳答案

    我尚未在计算机上对此进行广泛的测试(我有Mac,因此不能排除Linux特定的问题)。但是我想到了两点。对于我而言,以下操作相当快,但显然比数据集较小时要慢。您正在绘制成千上万个数据点。

    data = Accumulate@RandomVariate[NormalDistribution[], 200000];
    Manipulate[ListLinePlot[Take[data, n]], {n, 1, Length[data]}]
    
  • Manipulate中,您允许Take显示的数据量任意变化。尝试仅每100个点左右增加numrows,以减少渲染次数。
  • 尝试使用ContinuousAction->False选项(请参阅documentation)(我发现@Szabolcs与我键入的想法相同。
  • 我本来建议MaxPlotPoints,但是尝试PerformanceGoal ->"Speed"选项。 (请参阅documentation)
  • 关于wolfram-mathematica - 加速ListLinePlot,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6560095/

    10-12 17:48