我正在尝试绘制 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()
请您参考如下方法:
没有任何理由在 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) 中所示的技术。 .
