Matplotlib的情节过于缓慢

时间:2017-02-08 09:04:53

标签: python matplotlib

我正在尝试绘制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()

3 个答案:

答案 0 :(得分:6)

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

让我们先考虑打印: matplotlib中的最大图形尺寸为50英寸。即使拥有3600 dpi的高科技绘图仪,也可以获得最大数量50 * 3600 = 180000点,这些点可以解析。

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

因此,您要问的问题需要是:如何将我的20000000数据点二次采样到一组仍在纸张或屏幕上生成相同图像的点。

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

sample = data[::n]

如果存在需要解析的高频分量,则需要更复杂的技术,这又取决于数据的外观。

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

答案 1 :(得分:2)

以下方法可能会给您一点改进。它删除了每行两次拆分(通过使用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()

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

答案 2 :(得分:0)

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