représentation graphique de la dispersion 3d dans matplotlib
j'ai une collection de matrices Nx3 en scipy / numpy et j'aimerais en faire une dispersion tridimensionnelle, où les axes X et Y sont déterminés par les valeurs des première et deuxième colonnes de la matrice, la hauteur de chaque barre est la troisième colonne dans la matrice, et le nombre de barres est déterminé par N.
chaque matrice représente un groupe de données différent et je veux que chacun soit tracé avec une couleur différente, puis définir une légende pour la figure entière.
j'ai le code suivant:
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])
le problème est que la hache.les diagrammes de dispersion des choses avec une transparence et j'aimerais que supprimer. J'aimerais aussi régler les xticks et les yticks et les zticks ... Comment puis-je faire ça?
enfin, l'appel de légende n'apparaît pas, même si j'appelle label="" pour chaque appel scatter. Comment faire apparaître la légende?
merci beaucoup pour votre aide.
3 réponses
essayez de remplacer " ax.scatter' ax.tracer', peut-être avec le paramètre' o ' pour obtenir des cercles similaires. Cela fixe la transparence et la légende.
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()
j'ai ajouté quelques lignes et retouches pour obtenir quelques données d'échantillon et obtenir le reste de votre démo. Je suppose que vous serez en mesure de le faire fonctionner.
le réglage des tiques nécessite la mise à jour d'août 2010 à mplot3d comme décrit ici . J'ai eu le dernier mplot3d de Sourceforge . Je ne suis pas tout à fait sûr si Matplotlib 1.0.1 contient cette dernière mise à jour car J'exécute toujours Python 2.6 avec Matplotlib 1.0.0.
Modifier
un tracé fictif rapide et sale pour les légendes tout en gardant l'effet de transparence 3d que vous obtenez de scatter:
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
autant que je sache, les légendes 3d pour disperser les artistes ne sont pas directement pris en charge. Voir ici: http://matplotlib.sourceforge.net/users/legend_guide.html#plotting-guide-legend
cependant, vous pouvez utiliser un hack / work-around avec un 'proxy artist', en utilisant quelque chose comme:
p = Rectangle((0, 0), 1, 1, fc="r")
axis.legend([p], ["Red Rectangle"])
donc l'artiste proxy ne sera pas ajouté à l'axe, mais vous pouvez l'utiliser pour créer une légende.
Réglage de la kwarg depthshade=False fixe pour moi:
ax.scatter(np.log2(data[:, 0]), np.log2(data[:, 1]),
np.log2(data[:, 2]), 'o', c=curr_color, label=my_labels[index], depthshade=False)