Controlar el valor alfa en un gráfico de dispersión 3D utilizando Python y matplotlib

Estoy trazando un diagtwig de dispersión 3D utilizando la función scatter y mplot3d. Estoy eligiendo un solo color para todos los puntos de la gráfica, pero cuando se dibuja con matplotlib, la transparencia de los puntos se establece en relación con la distancia desde la cámara. ¿Hay alguna manera de deshabilitar esta característica?

Intenté configurar el alfa kwarg en Ninguno / 1 y también configuré vmin / vmax en 1 (en un bash de forzar que la escala de color sea un solo color sólido) sin suerte. No vi ninguna otra opción probable relacionada con esta configuración en la documentación de dispersión.

¡Gracias!

Para Matplotlib 1.4+, la respuesta proporcionada a continuación por @fraxel es la mejor solución: llame a ax.scatter con el argumento depthshade=False .

No hay argumentos que puedan controlar esto. Aquí hay un método de hackeo.

Desactive el método set_edgecolors y set_facecolors , para que mplot3d no pueda actualizar la parte alfa de los colores:

 from mpl_toolkits.mplot3d import Axes3D import numpy as np import matplotlib.pyplot as plt fig = plt.figure() ax = fig.gca(projection='3d') x = np.random.sample(20) y = np.random.sample(20) z = np.random.sample(20) s = ax.scatter(x, y, z, c="r") s.set_edgecolors = s.set_facecolors = lambda *args:None ax.legend() ax.set_xlim3d(0, 1) ax.set_ylim3d(0, 1) ax.set_zlim3d(0, 1) plt.show() 

introduzca la descripción de la imagen aquí

Si desea llamar a los métodos set_edgecolors y set_facecolors más adelante, puede hacer una copia de seguridad de estos dos métodos antes de deshabilitarlos:

 s._set_facecolors, s._set_edgecolors = s.set_facecolors, s.set_edgecolors 

Si solo desea deshabilitar el ajuste alfa, puede sobrescribir la función zalpha. Esto le permitirá actualizar los colores en el caso de una plot interactiva y aún así eliminar la niebla de profundidad.

 from mpl_toolkits.mplot3d import * import numpy as np import matplotlib.pyplot as plt plt.ion() art3d.zalpha = lambda *args:args[0] fig = plt.figure() ax = fig.gca(projection='3d') x = np.random.sample(20) y = np.random.sample(20) z = np.random.sample(20) s = ax.scatter(x, y, z, c="r") ax.legend() ax.set_xlim3d(0, 1) ax.set_ylim3d(0, 1) ax.set_zlim3d(0, 1) plt.show() 
 ax.scatter(x, y, z, depthshade=0)