Подтвердить что ты не робот

График рассеяния с огромным количеством данных

Я хотел бы использовать Matplotlib для создания графика рассеяния с огромным объемом данных (около 3 миллионов точек). На самом деле у меня есть 3 вектора с одинаковым размером, и я использую их для построения следующим образом.

import matplotlib.pyplot as plt
import numpy as np
from numpy import *
from matplotlib import rc
import pylab
from pylab import * 
fig = plt.figure()
fig.subplots_adjust(bottom=0.2)
ax = fig.add_subplot(111)
plt.scatter(delta,vf,c=dS,alpha=0.7,cmap=cm.Paired)

Ничего особенного на самом деле. Но для его создания требуется слишком много времени (я работаю над своим MacBook Pro 4 ГБ оперативной памяти с Python 2.7 и Matplotlib 1.0). Есть ли способ улучшить скорость?

4b9b3361

Ответ 1

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

Ответ 2

Если ваша графика огромна, многие из этих 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

Ответ 3

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