2013-11-20 3 views
37

Я хотел бы сделать график рассеяния, где каждая точка окрашена пространственной плотностью соседних точек.Как я могу сделать график разброса по плотности в matplotlib?

я наткнулся на очень похожий вопрос, который показывает пример этого с помощью R:

R Scatter Plot: symbol color represents number of overlapping points

Какой самый лучший способ сделать что-то подобное в Python с использованием Matplotlib?

+3

Привет! Люди, вероятно, задерживают вас, потому что вы не переписываете вопрос или не даете никакого контекста, и вы не пытались сделать это сами. Попробуйте отредактировать вопрос как самодостаточный (а не только ссылку), и для будущих вопросов, пожалуйста, сделайте некоторую попытку до публикации. – askewchan

ответ

77

В дополнение к hist2d или hexbin, как @askewchan предложил, вы можете использовать тот же метод, что принятый ответ на вопрос, который вы связаны с использований ,

Если вы хотите сделать это:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.stats import gaussian_kde 

# Generate fake data 
x = np.random.normal(size=1000) 
y = x * 3 + np.random.normal(size=1000) 

# Calculate the point density 
xy = np.vstack([x,y]) 
z = gaussian_kde(xy)(xy) 

fig, ax = plt.subplots() 
ax.scatter(x, y, c=z, s=100, edgecolor='') 
plt.show() 

enter image description here

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

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.stats import gaussian_kde 

# Generate fake data 
x = np.random.normal(size=1000) 
y = x * 3 + np.random.normal(size=1000) 

# Calculate the point density 
xy = np.vstack([x,y]) 
z = gaussian_kde(xy)(xy) 

# Sort the points by density, so that the densest points are plotted last 
idx = z.argsort() 
x, y, z = x[idx], y[idx], z[idx] 

fig, ax = plt.subplots() 
ax.scatter(x, y, c=z, s=50, edgecolor='') 
plt.show() 

enter image description here

+3

Умный, особенно получив «самые плотные» сверху :) – askewchan

+0

Большое вам спасибо @Joe Kington – 2964502

+0

отлично! любая идея, как построить colorbar для этого, как в примере ниже? – Leszek

24

Вы могли бы сделать гистограмму:

import numpy as np 
import matplotlib.pyplot as plt 

# fake data: 
a = np.random.normal(size=1000) 
b = a*3 + np.random.normal(size=1000) 

plt.hist2d(a, b, (50, 50), cmap=plt.cm.jet) 
plt.colorbar() 

2dhist

+0

Большое вам спасибо @askewchan – 2964502

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