2015-11-19 23 views
3

Я в процессе создания графика рассеяния из тысяч точек на питоне, используя pyplot. Моя проблема в том, что они, как правило, концентрируются в одном месте, и это всего лишь гигантский кусок очков.Pyplot Scatter to Contour plot

Есть ли какая-то функциональность, чтобы сделать точки графика пипса вверх, пока она не достигнет определенной критической плотности, а затем сделайте ее контурной графикой?

Мой вопрос похож на this one, где примерный график имеет контурные линии, в которых цвет представляет плотность нанесенных точек.

Super cool contour plot

Благодаря

Edit: Это то, что выглядит мои данные как Lots of yellow points

+1

Возможно, вам не придется переключаться. Если точки ослаблены, то контурные линии не будут слишком заметны, но сами точки будут передавать информацию. Однако, если точки плотны, как на изображении выше, то они создадут хороший фон, над которым должен быть виден «контур». Поэтому я предлагаю сначала использовать «разброс» с заполненными маркерами и «контур» поверх этого. Вам просто нужно определить плотность, которую вы можете использовать для контура. И если это не работает для вас, * затем * попробуйте сделать переключатель, возможно, в 'contourf'. –

+0

Почему бы не просто уменьшить размер ваших точек? или использовать некоторую прозрачность, которая эффективно даст вам плотность в виде серой шкалы? – Julien

ответ

5

Во-первых, вам нужно оценить плотность Ваших данных. В зависимости от выбранного метода можно получить varying result.

Давайте предположим, что вы хотите сделать оценку гауссовской плотностей, основанную на примере scipy.stats.gaussian_kde, вы можете получить высоту плотности с:

def density_estimation(m1, m2): 
    X, Y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]              
    positions = np.vstack([X.ravel(), Y.ravel()])              
    values = np.vstack([m1, m2])                   
    kernel = stats.gaussian_kde(values)                 
    Z = np.reshape(kernel(positions).T, X.shape) 
    return X, Y, Z 

Затем, вы можете построить его с contour с

X, Y, Z = density_estimation(m1, m2) 

fig, ax = plt.subplots()     

# Show density 
ax.imshow(np.rot90(Z), cmap=plt.cm.gist_earth_r,              
      extent=[xmin, xmax, ymin, ymax]) 

# Add contour lines 
plt.contour(X, Y, Z)                   

ax.plot(m1, m2, 'k.', markersize=2)  

ax.set_xlim([xmin, xmax])                   
ax.set_ylim([ymin, ymax])                   
plt.show() 

В качестве альтернативы вы можете изменить цвет маркера на основе их плотности, как показано на рисунке here.

+0

Эй, спасибо за ответ! Похоже, что он застрял на строке Z = np.reshape (ядро (позиции) .T, X.shape). Есть ли другой способ сделать что-то эквивалентное? – Matthew

+0

Выдает сообщение об ошибке: 'NameError: глобальное имя 'xmin' не определено'. Я предполагаю, что он должен быть 'min (m1)'. – Annan

+0

Да, они не определены в этом _snippet_. Они исходят из ссылки на функцию gaussian_kde. – memoselyk