Wolfram 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

我试图用Mathematica分析一些原始数据。我希望能够使用
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中的像素数