2013-04-17 13 views
6

Sto cercando di capire come impostare/correggere la posizione delle etichette di graduazione per un grafico 3D matplotlib. Le etichette di spunta non sono allineate con le zecche. Il problema sembra essere particolarmente importante quando sono richieste molte etichette di graduazione.posizioni dell'etichetta di graduazione per trama 3D matplotlib

Ho modificato un esempio (http://matplotlib.org/examples/mplot3d/polys3d_demo.html) dalla documentazione di matplotlib per illustrare la mia domanda.

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib.collections import PolyCollection 
from matplotlib.colors import colorConverter 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure(figsize=(10,10)) 
ax = fig.gca(projection='3d') 

cc = lambda arg: colorConverter.to_rgba(arg, alpha=0.6) 

xs = np.arange(0, 10, 0.4) 
verts = [] 
zs = np.arange(50) 
for z in zs: 
    ys = np.ones(len(xs))*z 
    ys[0], ys[-1] = 0, 0 
    verts.append(list(zip(xs, ys))) 

poly = PolyCollection(verts,facecolor='c') 
poly.set_alpha(0.7) 
ax.add_collection3d(poly, zs=zs, zdir='y') 

ax.set_xlabel('X') 
ax.set_xlim3d(0, 10) 
ax.set_ylabel('Y') 
ax.set_ylim3d(-1, len(zs)) 
ax.set_yticks(np.arange(len(zs))) 
labels = {} 
for l_c in zs: 
    labels[l_c] = 'This Looks Bad' 
ax.set_yticklabels(labels,rotation=-15) 
ax.set_zlabel('Z') 
ax.set_zlim3d(0, ys.max()) 

plt.show() 

enter image description here

Quindi la domanda è: come posso ottenere le etichette di graduazione per allinearsi con le posizioni di zecca?

risposta

5

Si allineano, ma con la posizione orizzontale centrata sul segno di spunta. A causa della vista 3D, ciò li fa apparire un po 'al di sotto dove ti aspetteresti che siano. L'effetto non è correlato alla quantità di zecche ma alla larghezza.

In particolare l'impostazione dell'allineamento aiuterà. Prova ad aggiungere:

ax.set_yticklabels(labels,rotation=-15, va='center', ha='left') 

giocare un po 'con i diversi allineamenti per vedere quale preferite, penso che tu sia dopo ha = 'left'.

Ridurre il padding, distanza dal segno di spunta, potrebbe anche aiutare.

enter image description here

+1

Come nota all'OP: 'va' è sinonimo di' verticalalignment' come nel mio esempio. Lo stesso vale per 'ha' e' horizontalalignment'. – Hooked

+0

Sì, grazie per aver chiarito che le abbreviazioni sono felici quando le digiti molto. :) –

+0

Grazie a @Rutger. Immagino che questo sia il meglio che si possa fare. Avevo già giocato con questi (ha, va) e ho quasi ottenuto quello che volevo. Funziona meglio su questo esempio di giocattolo che sul problema reale che sto cercando di risolvere. Puoi dare un esempio di come ridurre il padding? Forse aggiungi alla tua risposta esistente. –

10

Utilizzando questi allineamenti, ottengo tirocini molto meglio:

ax.set_yticklabels(labels,rotation=-15, 
        verticalalignment='baseline', 
        horizontalalignment='left') 

Ho modificato l'esempio con meno marcatori tick in modo da poter vedere il posizionamento:

enter image description here

+0

Grazie a @Hooked. Il problema è che ho bisogno di avere tutte le etichette di tick lì (ce ne sono almeno 50), quindi usare meno tick ticker non è un'opzione. Il disallineamento è considerevolmente più evidente con più etichette. Anche usando le varianti della tua soluzione (e quella di @ Rutgers), le etichette non sembrano allineate. –

+0

@ random.me Puoi sempre ridurre la dimensione del font delle etichette, ma hai ancora il problema fondamentale di due molto testo e troppo poco spazio! – Hooked

+0

@ random.me Avete bisogno di _ticks_ o _text_? – tacaswell

Problemi correlati