Matplotlib plot过多

2024-10-01 15:36:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: csvfromimportmatplotlibtkintermyasline
3条回答

我建议切换到pyqtgraph。当我试图让matplotlib绘制实时数据时,由于速度问题,我切换到了它。很有魅力。Here's my real time plotting example.

下面的方法可能会给您带来一些小的改进。它删除了对每行执行两次拆分(使用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()

我想说,最主要的减速还是情节本身。在

没有任何理由在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)中所示的技术。在

相关问题 更多 >

    热门问题