我正在尝试使用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
一个数据文件最多包含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]}]
该指令有效,但是当我尝试显示数千行时,它会迅速爬网。我如何加快速度?
其他一些细节:
DataRange
避免Take
没有帮助。 MaxPlotPoints
会严重扭曲图,以至于无法使用。 Take
中不使用Manipulate
无济于事。 Timing[ListLinePlot[Take[x,100000][[All, {1, 2}]]]]
会返回0.33
:这意味着Take
本身的评估几乎是瞬时的,这是使所有内容变慢的绘图渲染。 有什么提示吗?
最佳答案
我尚未在计算机上对此进行广泛的测试(我有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/