Giu*_*one 8 plot wolfram-mathematica
我正在尝试使用Mathematica来分析一些原始数据.我希望能够动态显示的数据我感兴趣的使用范围Manipulate和ListLinePlot,但情节渲染极为缓慢.我怎样才能加快速度?
以下是一些其他细节.外部文本文件存储原始数据:第一列是时间戳,第二列,第三列和第四列是数据读数,例如:
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)
这条指令有效,但当我尝试显示超过几千行时,它会快速爬行.我怎样才能加快速度?
一些额外的细节:
DataRange避免Take没有帮助.MaxPlotPoints扭曲过多的情节有用.Takein Manipulate没有帮助.Timing[ListLinePlot[Take[x,100000][[All, {1, 2}]]]]返回0.33:这意味着评估Take本身几乎是瞬时的,是绘图减慢一切的速度.任何提示?
小智 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
我没有在我的机器上进行过大量测试(我有一台Mac,所以我不能排除特定于Linux的问题).但是我发现了几点.以下对我来说非常快,但明显比数据集较小时要慢.您正在绘制数十万个数据点.
data = Accumulate@RandomVariate[NormalDistribution[], 200000];
Manipulate[ListLinePlot[Take[data, n]], {n, 1, Length[data]}]
Run Code Online (Sandbox Code Playgroud)
Manipulate,您允许显示的数据量Take随意变化.尝试只增加numrows每100个左右的点,因此渲染的次数较少.ContinuousAction->False选项(参见文档)(我看到@Szabolcs与我输入时的想法相同.MaxPlotPoints,但尝试PerformanceGoal ->"Speed"选择.(见文件)我还注意到Mathematica偶尔渲染图形需要很长时间.实际上它必须是从Mathematica Graphics表达式到一些其他表示的一些转换步骤,因为一旦渲染,调整大小(并因此重新渲染)图形要快得多.对于许多示例而言,版本6之前的图形渲染曾经更快(但也缺少6+以上的许多功能).
关于你可以做什么的一些想法:
在绘图之前使用MaxPlotPoints选项ListLinePlot减少数据.如果它的下采样,它看起来可能没有区别.该Method选项应该选择缩减采样算法,但我找不到任何文档(任何人?)
用ContinuousAction -> False在Manipulate当你拖动滑块从重新计算实时一切停止.