Разброс сюжета с огромным количеством данных - PullRequest
15 голосов
/ 03 ноября 2010

Я хотел бы использовать Matplotlib для создания точечной диаграммы с огромным количеством данных (около 3 миллионов точек).На самом деле у меня есть 3 вектора с одним и тем же измерением, и я использую их для построения следующим образом.Но на самом деле на его генерацию уходит слишком много времени (я работаю на 4 ГБ ОЗУ MacBook Pro с Python 2.7 и Matplotlib 1.0).Есть ли способ улучшить скорость?

Ответы [ 3 ]

20 голосов
/ 03 ноября 2010

Если ваша графика не огромна, многие из этих 3 миллионов точек будут перекрываться.(Изображение размером 400x600 имеет только 240K точек ...)

Так что проще всего было бы взять, скажем, 1000 точек из ваших данных:

import random
delta_sample=random.sample(delta,1000)

ипросто нарисуйте это.

Например:

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
import random

fig = plt.figure()
fig.subplots_adjust(bottom=0.2)
ax = fig.add_subplot(111)

N=3*10**6
delta=np.random.normal(size=N)
vf=np.random.normal(size=N)
dS=np.random.normal(size=N)

idx=random.sample(range(N),1000)

plt.scatter(delta[idx],vf[idx],c=dS[idx],alpha=0.7,cmap=cm.Paired)
plt.show()

alt text

Или, если вам нужно больше внимания уделять выбросам, то, возможно, вы могли бы связать свои данныеиспользуя np.histogram, а затем составьте delta_sample, в котором есть представители от каждой ячейки.

К сожалению, при использовании np.histogram я не думаю, что существует какой-либо простой способ связать ячейки с отдельными точками данных.Простое, но приблизительное решение состоит в том, чтобы использовать местоположение точки внутри или на самом крае ячейки в качестве прокси для точек в ней:

xedges=np.linspace(-10,10,100)
yedges=np.linspace(-10,10,100)
zedges=np.linspace(-10,10,10)
hist,edges=np.histogramdd((delta,vf,dS), (xedges,yedges,zedges))
xidx,yidx,zidx=np.where(hist>0)
plt.scatter(xedges[xidx],yedges[yidx],c=zedges[zidx],alpha=0.7,cmap=cm.Paired)
plt.show()

alt text

9 голосов
/ 10 ноября 2010

Как насчет попытки pyplot.hexbin ?Он генерирует своего рода тепловую карту на основе плотности точек в заданном количестве бинов.

7 голосов
/ 03 ноября 2010

Вы можете использовать подход тепловой карты, показанный здесь . В этом примере цвет представляет количество данных в корзине, а не среднее значение массива dS, но это должно быть легко изменить. Еще позже, если вам интересно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...