2013-04-17 10 views
6

Próbuję ustalić, jak ustawić/poprawić pozycję etykiet zaznaczania dla wykresu 3D matplotlib. Etykiety Tick nie są wyrównane z kleszczami. Wydaje się, że kwestia ta jest szczególnie widoczna, gdy wymagane są liczne etykiety zaznaczenia.pozycje etykiet zaznaczania dla matplotlib 3D plot

Zmodyfikowałem przykład (http://matplotlib.org/examples/mplot3d/polys3d_demo.html) z dokumentacji matplotlib, aby zilustrować moje pytanie.

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

Więc pytanie brzmi: w jaki sposób mogę uzyskać etykiety tick wyrównać ze stanowiskami kleszczy?

Odpowiedz

5

Wyrównują, ale z poziomą pozycją wyśrodkowaną przy tikku. Ze względu na widok 3D sprawia to, że pojawiają się one nieco poniżej miejsca, w którym można się tego spodziewać. Efekt nie jest związany z ilością kleszczy, ale z szerokością.

W szczególności pomocne będzie ustawienie wyrównania. Spróbuj dodać:

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

Pobaw się trochę z różnymi trasowania aby zobaczyć, które wolisz, myślę, że jesteś po ha = „left”.

Pomóc może również zmniejszenie odległości od kleszcza.

enter image description here

+1

Jako uwaga do OP: 'va' jest synonimem' verticalalignment' jak w moim przykładzie. To samo dotyczy "ha" i "horizontalalignment". – Hooked

+0

Tak, dziękuję za wyjaśnienie, że skróty są rozkoszne, gdy je często piszemy. :) –

+0

Dzięki @Rutger. Sądzę, że to jest najlepsze, co można zrobić. Już grałem z tymi (ha, va) i prawie dostałem to, czego chcę. Działa lepiej na tym zabawkowym przykładzie, niż na rzeczywistym problemie, który próbuję rozwiązać. Czy możesz podać przykład, jak zmniejszyć wypełnienie? Może dodaj do swojej istniejącej odpowiedzi. –

10

Używając tych wyrównań, mam dużo lepszych miejsc docelowych:

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

Mam zmodyfikowane przykład z mniej markerów kleszczy więc można zobaczyć Umiejscowienie:

enter image description here

+0

Dzięki @Hooked. Problem polega na tym, że muszę mieć wszystkie etykiety zaznaczenia (są one co najmniej 50), więc używanie mniej znaczników nie jest opcją. Niewspółosiowość jest znacznie bardziej widoczna w przypadku większej liczby etykiet. Nawet przy użyciu wariantów rozwiązania (i metody @Rutgers) etykiety nie wyglądają równo. –

+0

@ random.me Zawsze możesz zmniejszyć rozmiar czcionki etykiet, ale nadal masz zasadniczy problem z dwoma dużymi tekstami i zbyt małą przestrzenią! – Hooked

+0

@ random.me Czy potrzebujesz _ticks_ lub _text_? – tacaswell

Powiązane problemy