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.

13
demandé sur user248237dfsf 2011-03-30 22:05:52

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
15
répondu Daan 2011-04-06 09:56:49

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.

4
répondu mkocubinski 2011-04-05 14:41:54

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)
0
répondu lemdan 2016-08-04 09:25:40