Visualización de gráficos de dispersión con puntos superpuestos en matplotlib

Tengo que representar unos 30,000 puntos en un diagtwig 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 diagtwig de dispersión no es posible mostrar cuántos puntos se encuentran en cada región. También he intentado hacer un histogtwig 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 enlace a mi archivo de datos en el formato “x, y, clase”

Un enfoque es trazar los datos como un diagtwig 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:

introduzca la descripción de la imagen aquí

Como se puede imaginar, debido a la limitada gama de superposiciones que se pueden express, 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, la ttwig, 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).

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() 

Diagrama de dispersión con información de densidad

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 longitud N , o una secuencia de N números que deben asignarse a los colores utilizando el cmap y la norm especificada a través de kwargs (ver más abajo). Tenga en cuenta que c 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.