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