加速ListLinePlot

Giu*_*one 8 plot wolfram-mathematica

我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)

单个数据文件最多包含2·10 6行.例如,要显示第二列,我使用:

x = Import["path/to/datafile"];
ListLinePlot[x[[All, {1, 2}]]]
Run Code Online (Sandbox Code Playgroud)

该操作的执行时间长得令人难以忍受.要显示我尝试使用的可变数据范围Manipulate:

Manipulate[ListLinePlot[Take[x, numrows][[All, {1, 2}]]], {numrows, 1, Length[x]}]
Run Code Online (Sandbox Code Playgroud)

这条指令有效,但当我尝试显示超过几千行时,它会快速爬行.我怎样才能加快速度?

一些额外的细节:

  • MATLAB几乎立即在同一台计算机上显示相同数量的数据,因此原始数据大小不应成为问题.
  • 我已经尝试关闭图形抗锯齿功能,但它根本不会影响渲染速度.
  • 使用DataRange避免Take没有帮助.
  • 使用MaxPlotPoints扭曲过多的情节有用.
  • 不使用Takein Manipulate没有帮助.
  • 渲染似乎需要花费大量时间.运行Timing[ListLinePlot[Take[x,100000][[All, {1, 2}]]]]返回0.33:这意味着评估Take本身几乎是瞬时的,是绘图减慢一切的速度.
  • 我正在使用fglrx驱动程序在Ubuntu Linux 11.10上运行Mathematica.强迫Mathematica使用mesa驱动程序没有帮助.

任何提示?

小智 11

如果您的目标是快速但正确地可视化您的数据,您可以使用我经常使用的以下技巧.

我将数据划分为大致对应于我的屏幕分辨率的块数(通常为1000或更少),无论如何都无法显示更多细节.然后我确定每个块的最小值和最大值,并从最小值到最大值到最小值到最大值绘制一条曲折线......结果看起来与原始数据完全一样.然而,您可以不"放大",因为您将看到之字形线(例如,在导出到高分辨率pdf时).然后你需要使用更多的块.

rv = RandomVariate[ExponentialDistribution[2], 100000];

ListLinePlot[rv, PlotRange -> All] (* original, slow *)
ListLinePlot[rv, PlotRange -> All, MaxPlotPoints -> 1000] (* fast but distorted *)

numberOfBlocks = 1000;

ListLinePlot[Riffle @@ Through[{Min /@ # &, Max /@ # &}[
   Partition[rv,Floor[Length[rv]/numberOfBlocks]]]], PlotRange -> All]
Run Code Online (Sandbox Code Playgroud)

您可以添加DataRange->{...}选项以适当地标记x轴.

希望这可以帮助!

编辑:请参阅Mathematica Stackexchange上的类似问题:https://mathematica.stackexchange.com/q/140/58


Ver*_*eia 7

我没有在我的机器上进行过大量测试(我有一台Mac,所以我不能排除特定于Linux的问题).但是我发现了几点.以下对我来说非常快,但明显比数据集较小时要慢.您正在绘制数十万个数据点.

data = Accumulate@RandomVariate[NormalDistribution[], 200000];
Manipulate[ListLinePlot[Take[data, n]], {n, 1, Length[data]}]
Run Code Online (Sandbox Code Playgroud)
  1. 在a中Manipulate,您允许显示的数据量Take随意变化.尝试只增加numrows每100个左右的点,因此渲染的次数较少.
  2. 尝试使用该ContinuousAction->False选项(参见文档)(我看到@Szabolcs与我输入时的想法相同.
  3. 我打算建议MaxPlotPoints,但尝试PerformanceGoal ->"Speed"选择.(见文件)


Sza*_*lcs 5

我还注意到Mathematica偶尔渲染图形需要很长时间.实际上它必须是从Mathematica Graphics表达式到一些其他表示的一些转换步骤,因为一旦渲染,调整大小(并因此重新渲染)图形要快得多.对于许多示例而言,版本6之前的图形渲染曾经更快(但也缺少6+以上的许多功能).

关于你可以做什么的一些想法:

  1. 在绘图之前使用MaxPlotPoints选项ListLinePlot减少数据.如果它的下采样,它看起来可能没有区别.该Method选项应该选择缩减采样算法,但我找不到任何文档(任何人?)

  2. ContinuousAction -> FalseManipulate当你拖动滑块从重新计算实时一切停止.


Sza*_*lcs 5

这里的另一个想法是使用Ramer-Douglas-Peucker算法在绘图之前减少数据点的数量.这可能会更好地保留数据的形状.我不知道你是否仍然需要这个,所以我不会提供实现.