2017-02-08 4 views
0

Я пытаюсь построить 20 миллионов точек данных, однако это занимает очень много времени (в течение часа) с использованием Matplotlib,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

Я удалил части вашего вопроса, касающиеся рекомендации библиотеки, поскольку эти вопросы не относятся к теме [so]. – Sayse

+0

Профилировали ли вы свой код, чтобы найти узкие места. На моем ПК 1 миллион случайных данных накладывается на секунды, а 2 миллиона и больше указывает на ошибку «В draw_path: предел превышения ячейки». Также можно предложить библиотеку PyQtgraph. –

+0

Спасибо. Я получал ошибку «Ошибка переполнения: выделено слишком много блоков» при запуске более 1 миллиона точек данных, но я исправил это, добавив matplotlib.pyplot.rcParams ['agg.path.chunksize'] = 20000. Однако даже работа 100 000 точек данных занимают не менее 20 минут. У моего ноутбука только 4 ГБ памяти, может ли проблема быть полностью с моим ноутбуком? – darrenvba

ответ

5

Нет никакой причины иметь линейный график 20000000 точек в matplotlib.

Рассмотрим сначала печать: Максимальный размер фигуры в matplotlib составляет 50 дюймов. Даже имея высокотехнологичный плоттер с 3600 точек на дюйм, вы получите максимальное количество 50 * 3600 = 180000 точек, которые разрешимы.

Для экранных приложений это еще меньше: даже высокотехнологичный 4k экран имеет ограниченное разрешение 4000 пикселей. Даже если вы используете эффекты сглаживания, есть максимум ~ 3 точки на пиксель, которые все еще будут различимы для человеческого глаза. Результат: максимум 12000 баллов имеет смысл.

Таким образом, вопрос, который вы задаете, скорее должен быть: как я подсуммирую свои 20000000 точек данных множеству точек, которые по-прежнему создают одно и то же изображение на бумаге или экране.

Решение этого сильно зависит от характера данных. Если он достаточно плавный, вы можете просто взять каждую запись в n-го списка.

sample = data[::n] 

Если есть высокочастотные компоненты, которые должны быть решены, это потребует более сложных методов, которые снова будут зависеть от того, как данные выглядит.

2

Следующий подход может дать вам небольшое улучшение. Она удаляет делает раскол дважды в строке (с помощью библиотеки CSV Питона), а также удаляет, если заявление, пропуская через две строки заголовка перед выполнением цикла:

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() 

я бы сказал главный замедлиться, хотя по-прежнему быть самим сюжетом.

0

Я бы порекомендовал переключиться на pyqtgraph. Я переключился на него из-за проблем с производительностью, пока я пытался сделать данные графика в реальном времени matplotlib. Работал как шарм. Here's my real time plotting example.

Смежные вопросы