Wolfram mathematica 加速列表线图
我试图用Mathematica分析一些原始数据。我希望能够使用Wolfram mathematica 加速列表线图,wolfram-mathematica,plot,Wolfram Mathematica,Plot,我试图用Mathematica分析一些原始数据。我希望能够使用operate和ListLinePlot动态显示我感兴趣的数据范围,但绘图渲染速度非常慢。我怎样才能加快速度 这里有一些额外的细节。外部文本文件存储原始数据:第一列是时间戳,第二、第三和第四列是数据读取,例如: 1309555993069, -2.369941, 6.129157, 6.823794 1309555993122, -2.260978, 6.170018, 7.014479 1309555993183, -2.07029
operate
和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[ListLinePlot[Take[x, numrows][[All, {1, 2}]]], {numrows, 1, Length[x]}]
这个指令有效,但当我试图显示超过几千行时,它会快速爬行。我怎样才能加快速度
其他一些细节:
- MATLAB在同一台计算机上几乎同时显示相同数量的数据,因此原始数据的大小不应成为问题
- 我已经尝试过关闭图形抗锯齿,但它根本不会影响渲染速度
- 使用
DataRange
避免Take
没有帮助
- 使用
MaxPlotPoints
会使绘图扭曲太多,无法使用
- 在
操作中不使用Take
没有帮助
- 渲染似乎需要花费大量的时间。运行
Timing[ListLinePlot[Take[x,100000][[All,{1,2}]]]]
返回0.33
:这意味着Take
本身的计算几乎是瞬时的,是减慢一切的绘图渲染
- 我使用fglrx驱动程序在UbuntuLinux11.10上运行Mathematica。迫使Mathematica使用mesa驱动程序没有任何帮助
有什么提示吗?我还注意到Mathematica有时会花费太长时间来渲染图形。实际上,从Mathematica图形
表达式到其他表示法的转换步骤一定很长,因为一旦渲染,调整图形大小(从而重新渲染)的速度要快得多。在许多示例中,6版之前的图形渲染速度更快(但也缺少6+所具有的许多功能)
关于你能做什么的一些想法:
使用ListLinePlot
的MaxPlotPoints
选项在打印前减少数据。如果它的样本减少了,它在外观上可能不会有什么不同。Method
选项应该选择downsample算法,但我找不到它的任何文档(有人吗?)
使用操纵
中的ContinuousAction->False
,在拖动滑块时阻止它实时重新计算所有内容
我还没有在我的机器上对此进行过广泛的测试(我有一台Mac电脑,所以我不能排除Linux特有的问题)。但我想到了两点。下面的内容对我来说相当快,但显然比数据集更小时慢。您正在绘制数十万个数据点
data = Accumulate@RandomVariate[NormalDistribution[], 200000];
Manipulate[ListLinePlot[Take[data, n]], {n, 1, Length[data]}]
在操作
中,允许使用Take
显示的数据量任意变化。尝试每100点左右增加一次numrows
,这样可以减少渲染次数
尝试使用ContinuousAction->False
选项(请参阅)(我看到@Szabolcs的想法与我键入的想法相同)
我打算建议使用MaxPlotPoints
,但尝试使用PerformanceGoal->“Speed”
选项。(请参阅)
如果您的目标是快速而正确地可视化数据,那么可以使用以下技巧,我一直在使用这些技巧
我将数据划分为大致与屏幕分辨率相对应的多个块(通常为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]
您可以添加DataRange->{…}
选项来适当地标记x轴
希望这有帮助
编辑:
另请参见Mathematica Stackexchange上的类似问题:
这里的另一个想法是在绘图之前使用减少数据点的数量。这可能会更好地保留数据的形状。我不知道您是否仍然需要它,所以我不会提供一个实现。+1只是为了提及MaxPlotPoints
,我不知道这一点,并且+1击败我继续操作:)很抱歉,我的问题不清楚。ContinuousAction->False肯定会有帮助,但即使是ListLinePlot[Take[x,100000][[All,{1,2}]],和MaxPlotPoints
的绘图过程也非常缓慢,使绘图扭曲得太多而没有用处(奇怪的是,即使我使用它,绘图时间也没有明显减少)您确定不能使用MaxPlotPoints
?图形只有这么多像素宽(当然比10^6小得多!),并且最多使用超过像素宽度的点是没有意义的。你是对的,我对MaxPlotPoints
使用的值太高了。与MATLAB的渲染相比,渲染质量更低,速度也慢得多,总之比以前要好。我接受Verbeia的回答,因为他建议使用PerformanceGoal
,t这似乎很有帮助。谢谢你的回答!为MaxPlotPoints
使用一个合理的值,并使用PerformanceGoal
成功了。渲染效果仍然比MATLAB的渲染效果差,但比以前好得多,谢谢!什么是PerformanceGoal->“速度?”“
实际在做什么?我以为它只是减少了MaxPlotPoints
@giuseppe您使用的MaxPlotPoints
的值是多少?我感觉到你figu中的像素数