trazar la dispersión 3d en matplotlib

Tengo una colección de matrices Nx3 en scipy / numpy y me gustaría hacer una dispersión tridimensional, donde los ejes X e Y están determinados por los valores de la primera y la segunda columnas de la matriz, la altura de cada barra es la tercera columna en la matriz, y el número de barras está determinado por N.

Cada matriz representa un grupo de datos diferente y quiero que cada una se trace con un color diferente, y luego establezca una leyenda para toda la figura.

Tengo el siguiente código:

fig = pylab.figure() s = plt.subplot(1, 1, 1) colors = ['k', "#B3C95A", 'b', '#63B8FF', 'g', "#FF3300", 'r', 'k'] ax = Axes3D(fig) plots = [] index = 0 for data, curr_color in zip(datasets, colors): p = ax.scatter(log2(data[:, 0]), log2(data[:, 1]), log2(data[:, 2]), c=curr_color, label=my_labels[index]) s.legend() index += 1 plots.append(p) ax.set_zlim3d([-1, 9]) ax.set_ylim3d([-1, 9]) ax.set_xlim3d([-1, 9]) 

El problema es que ax.scatter traza las cosas con una transparencia y me gustaría eliminarlas. Además, me gustaría configurar los xticks y los yticks y los zticks, ¿cómo puedo hacer eso?

Finalmente, la llamada de leyenda no aparece, aunque estoy llamando a label = “” para cada llamada de dispersión. ¿Cómo puedo hacer que aparezca la leyenda?

Muchas gracias por su ayuda.

Intente reemplazar ‘ax.scatter’ con ax.plot ‘, posiblemente con el parámetro’ o ‘para obtener círculos similares. Esto corrige la transparencia y la leyenda.

 import matplotlib as mpl from mpl_toolkits.mplot3d import Axes3D import numpy as np import matplotlib.pyplot as plt from numpy.random import random mpl.rcParams['legend.fontsize'] = 10 fig = plt.figure(1) fig.clf() ax = Axes3D(fig) datasets = random((8,100,3))*512 my_labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] colors = ['k', "#B3C95A", 'b', '#63B8FF', 'g', "#FF3300", 'r', 'k'] index = 0 for data, curr_color in zip(datasets, colors): ax.plot(np.log2(data[:, 0]), np.log2(data[:, 1]), np.log2(data[:, 2]), 'o', c=curr_color, label=my_labels[index]) index += 1 ax.set_zlim3d([-1, 9]) ax.set_ylim3d([-1, 9]) ax.set_xlim3d([-1, 9]) ax.set_xticks(range(0,11)) ax.set_yticks([1,2,8]) ax.set_zticks(np.arange(0,9,.5)) ax.legend(loc = 'upper left') plt.draw() plt.show() 

Agregué algunas líneas y ajustes para obtener algunos datos de muestra y hacer que el rest de su demostración funcione. Supongo que podrás hacerlo funcionar.

La configuración de los ticks requiere la actualización de agosto de 2010 a mplot3d como se describe aquí . Obtuve el último mplot3d de Sourceforge . No estoy seguro de si Matplotlib 1.0.1 contiene esta última actualización, ya que todavía estoy ejecutando Python 2.6 con Matplotlib 1.0.0.

Editar

Una ttwig ficticia rápida y sucia para las leyendas, manteniendo el efecto de transparencia 3D que se obtiene de la dispersión:

 index = 0 for data, curr_color in zip(datasets, colors): ax.scatter(np.log2(data[:, 0]), np.log2(data[:, 1]), np.log2(data[:, 2]), 'o', c=curr_color, label=my_labels[index]) ax.plot([], [], 'o', c = curr_color, label=my_labels[index]) index += 1 

AFAIK, las leyendas para los artistas de dispersión 3D no son compatibles directamente. Consulte aquí: http://matplotlib.sourceforge.net/users/legend_guide.html#plotting-guide-legend

Sin embargo, puedes usar un hack / work-around con un ‘artista proxy’, usando algo como:

 p = Rectangle((0, 0), 1, 1, fc="r") axis.legend([p], ["Red Rectangle"]) 

Por lo tanto, el artista proxy no se agregará al eje, pero puede usarlo para crear una leyenda.

Configurar el kwarg depthshade = False lo solucionó para mí:

 ax.scatter(np.log2(data[:, 0]), np.log2(data[:, 1]), np.log2(data[:, 2]), 'o', c=curr_color, label=my_labels[index], depthshade=False)