2014-07-01 4 views
3

Essayer de tracer un 3 graphique tridimensionnel avec:tracé 3D avec l'axe catégorique [python/Matplotlib]

axe x - Valeurs (float) axe y - Valeurs (float) d'axe z - Catégorie (string)

maintenant, j'ai essayé de convertir le vecteur z en utilisant pandas.factorize (table.zcolumn)

Output: (array([ 0, 0, 0, ..., -1, -1, 1]), Index([u'London', u'National'], dtype='object')) 

Je peux donc tracer les chiffres sans problème. Vous verrez qu'il y a des valeurs NaN qui se convertissent en -1, donc quand je trace le graphique, il y a un tas de valeurs à -1. Les données contiennent les catégories London, National et NaN.

Comment puis-je étiqueter les axes pour les adapter à mes données? Je pense qu'il devrait y avoir une fonction simple pour le faire correspondre.

Sur l'axe z je dois réattribuer les tiques -1 pour devenir « NA », 0 pour devenir « Londres » et 1 pour devenir

« National »

Je serais également intéressé par un moyen pour faire cela avec un grand nombre de catégories, de sorte que le code qui n'a pas besoin entrer manuellement chaque chaîne de catégorie

regions = pandas.factorize(dataTable.Region[id_range]) 
regions_num = regions[0] 

fig = plot.figure() 
ax = fig.add_subplot(111,projection='3d') 
ax.scatter(y, x, zs=regions_num) 

ax.axes.set_zticklabels(["London","National","N/A"]) 

plot.show() 

The problem: Z-Axis labels do not match discrete values (at -1, 0, 1)

Répondre

1

Vous avez juste besoin de régler les zticks aux trois valeurs z correspondant à vos catégories:

ax.axes.set_zticks(regions_num) 

Cela dit, je ne suis pas vraiment un très bon moyen de tracer vos données. Les tracés 3D sont plus utiles lorsque vos valeurs X, Y et Z sont toutes des variables continues. Représenter des régions en tant que niveaux z différents peut sembler un peu plus logique si 'région' est une variable ordinale, mais y a-t-il une raison pour laquelle 'N/A' devrait être 'supérieur' à 'National'? Les tracés 3D sont généralement plus difficiles à lire que les tracés 2D - par exemple, en raison de la projection de perspective, un point proche de la catégorie 'National' peut ressembler beaucoup à un point plus éloigné mais dans la catégorie 'N/A'.

Un choix plus approprié pourrait être de représenter ces données sous forme de nuage de points sur des axes 2D, avec des couleurs différentes correspondant aux différentes catégories.

+0

Cela fonctionne merci. Je vois totalement ce que vous voulez dire dans le deuxième point. Mais je l'utilise principalement comme un exercice de codage. D'une manière ou d'une autre, je n'arrive pas à définir les étiquettes comme des chaînes bien que? Puis-je ne pas utiliser ax.axes.set_zticklabels (regions [1] [:]) pour définir chaque étiquette de tick? C'est tout imprimer les uns sur les autres à la minute – darkace

+0

@darkace, qu'est-ce que 'regions [1] [:]'? –