titulo - python graficos 2d
Visualización de gráficos de dispersión con puntos superpuestos en matplotlib (2)
También puede colorear los puntos calculando primero una estimación de densidad del núcleo de la distribución de la dispersión y utilizando los valores de densidad para especificar un color para cada punto de la dispersión. Para modificar el código en el ejemplo anterior:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde as kde
from matplotlib.colors import Normalize
from matplotlib import cm
N = 10000
mean = [0,0]
cov = [[2,2],[0,2]]
samples = np.random.multivariate_normal(mean,cov,N).T
densObj = kde( samples )
def makeColours( vals ):
colours = np.zeros( (len(vals),3) )
norm = Normalize( vmin=vals.min(), vmax=vals.max() )
#Can put any colormap you like here.
colours = [cm.ScalarMappable( norm=norm, cmap=''jet'').to_rgba( val ) for val in vals]
return colours
colours = makeColours( densObj.evaluate( samples ) )
plt.scatter( samples[0], samples[1], color=colours )
plt.show()
Aprendí este truco hace un tiempo cuando noté la documentación de la función de dispersión:
c : color or sequence of color, optional, default : ''b''
c
puede ser una cadena de formato de un solo color, o una secuencia de especificaciones de color de longitudN
, o una secuencia deN
números que deben asignarse a los colores mediante elcmap
y lanorm
especificada mediante kwargs (ver más abajo). Tenga en cuenta quec
no debe ser una única secuencia RGB o RGBA numérica porque no se puede distinguir de una matriz de valores para ser asignados en color.c
puede ser una matriz 2-D en la que las filas son RGB o RGBA, sin embargo, incluido el caso de una sola fila para especificar el mismo color para todos los puntos.
Tengo que representar unos 30,000 puntos en un diagrama de dispersión en matplotlib. Estos puntos pertenecen a dos clases diferentes, por lo que quiero describirlos con diferentes colores.
Lo logré, pero hay un problema. Los puntos se superponen en muchas regiones y la clase que represento para el final se visualizará encima de la otra, ocultándola. Además, con el diagrama de dispersión no es posible mostrar cuántos puntos se encuentran en cada región. También he intentado hacer un histograma 2d con histogram2d e imshow, pero es difícil mostrar los puntos que pertenecen a ambas clases de forma clara.
¿Puede sugerir una manera de aclarar tanto la distribución de las clases como la concentración de los puntos?
EDITAR: Para ser más claro, este es el link a mi archivo de datos en el formato "x, y, clase"
Un enfoque es trazar los datos como un diagrama de dispersión con un alfa bajo , para que pueda ver los puntos individuales así como una medida aproximada de la densidad. (La desventaja de esto es que el enfoque tiene un rango limitado de superposición que puede mostrar, es decir, una densidad máxima de aproximadamente 1 / alfa).
Aquí hay un ejemplo:
Como se puede imaginar, debido a la limitada gama de superposiciones que se pueden expresar, hay una compensación entre la visibilidad de los puntos individuales y la expresión de la cantidad de superposición (y el tamaño del marcador, el gráfico, etc.).
import numpy as np
import matplotlib.pyplot as plt
N = 10000
mean = [0, 0]
cov = [[2, 2], [0, 2]]
x,y = np.random.multivariate_normal(mean, cov, N).T
plt.scatter(x, y, s=70, alpha=0.03)
plt.ylim((-5, 5))
plt.xlim((-5, 5))
plt.show()
(Supongo que aquí significó 30e3 puntos, no 30e6. Para 30e6, creo que sería necesario algún tipo de gráfico de densidad promedio).