【问题标题】:Matplotlib plot excessively slowMatplotlib 绘图速度过慢
【发布时间】:2017-06-25 19:31:03
【问题描述】:

我正在尝试绘制 2000 万个数据点,但是使用 matplotlib 需要很长时间(超过一个小时),

我的代码中是否有什么东西让这个异常缓慢?

import csv
import matplotlib.pyplot as plt
import numpy as np
import Tkinter
from Tkinter import *
import tkSimpleDialog
from tkFileDialog import askopenfilename

plt.clf()

root = Tk()
root.withdraw() 
listofparts = askopenfilename()                  # asks user to select file
root.destroy()

my_list1 = []
my_list2 = []
k = 0

csv_file = open(listofparts, 'rb')

for line in open(listofparts, 'rb'):
    current_part1 = line.split(',')[0]
    current_part2 = line.split(',')[1]
    k = k + 1
    if k >= 2:                                   # skips the first line
        my_list1.append(current_part1)
        my_list2.append(current_part2)

csv_file.close()

plt.plot(my_list1 * 10, 'r')
plt.plot(my_list2 * 10, 'g')

plt.show()
plt.close()

【问题讨论】:

  • 我已经删除了您与图书馆推荐相关的部分问题,因为这些问题在 Stack Overflow 上是题外话。
  • 您是否对代码进行了概要分析以找到瓶颈。在我的 PC 上,绘制 100 万个随机数据需要几秒钟,而 200 万个或更多点会导致错误“在 draw_path:超出单元块限制”。另外,可以推荐 PyQtgraph 库。
  • 谢谢。当我运行超过 100 万个数据点时,出现“溢出错误:分配了太多块”错误,但我通过添加 matplotlib.pyplot.rcParams['agg.path.chunksize'] = 20000 解决了这个问题。但是即使运行100,000 个数据点至少需要 20 分钟。我的笔记本只有 4GB 内存,问题会完全出在我的笔记本上吗?
  • 代码不需要,我可能应该为 stackoverflow 取出 * 10。 Excel 每行有 100 万个单元格的限制,我在 excel 上创建了具有 100 万个数据点的 csv,但我想测试更多。它应该只重复图形线 10 次,它在尝试较小的数据集时有效。

标签: python matplotlib


【解决方案1】:

我建议切换到 pyqtgraph。由于速度问题,我在尝试制作 matplotlib 绘制实时数据时切换到它。像魅力一样工作。 Here's my real time plotting example.

【讨论】:

    【解决方案2】:

    没有任何理由在 matplotlib 中有 20000000 个点的线图。

    让我们先考虑打印: matplotlib 中的最大图形大小为 50 英寸。即使拥有一台 3600 dpi 的高科技绘图仪,最多也可以提供 50*3600 = 180000 个可解析的点。

    对于屏幕应用,它甚至更少:即使是高科技的 4k 屏幕也只有 4000 像素的有限分辨率。即使使用混叠效果,每个像素最多也有大约 3 个点对于人眼来说仍然是可区分的。结果:最多 12000 点是有意义的。

    因此,您要问的问题应该是:如何将我的 20000000 个数据点二次采样为一组仍然在纸上或屏幕上产生相同图像的点。

    解决方案很大程度上取决于数据的性质。如果它足够平滑,您可以只获取每个nth 列表条目。

    sample = data[::n]
    

    如果有需要解决的高频分量,这将需要更复杂的技术,这将再次取决于数据的外观。

    其中一种技术可能是How can I subsample an array according to its density? (Remove frequent values, keep rare ones) 中显示的技术。

    【讨论】:

      【解决方案3】:

      以下方法可能会给您带来小的改进。它消除了对每行进行两次拆分(通过使用 Python 的 CSV 库),并且还通过在执行循环之前跳过两个标题行来消除 if 语句:

      import matplotlib.pyplot as plt
      import csv
      
      l1, l2 = [], []
      
      with open('input.csv', 'rb') as f_input:
          csv_input = csv.reader(f_input)
      
          # Skip two header lines
          next(csv_input)
          next(csv_input)
      
          for cols in csv_input:
              l1.append(cols[0])
              l2.append(cols[1])
      
      plt.plot(l1, 'r')
      plt.plot(l2, 'g')
      plt.show()
      

      我会说主要的减速仍然是情节本身。

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-09
        • 1970-01-01
        相关资源
        最近更新 更多