Skip to main content
 首页 » 编程设计

python之Matplotlib 绘图速度过慢

2025年05月04日12insus

我正在尝试绘制 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) 中所示的技术。 .