2015-02-19 9 views
14

Ich möchte die Markierungen einiger Ticks horizontal entlang der X-Achse bewegen, ohne die entsprechenden Ticks zu bewegen.Wie verschiebe ich ein Tick-Label in Matplotlib?

Genauer gesagt, wenn Etiketten mit plt.setp rotieren, bleiben die Mitten der Beschriftungen mit den Ticks ausgerichtet. Ich möchte diese Beschriftungen nach rechts verschieben, sodass die nahen Enden der Beschriftungen wie im Bild unten gezeigt ausgerichtet werden.

enter image description here

Ich bin mir dessen bewusst this post und this one, aber die Antworten sind interessant kludges eher als strenge Antworten auf die Frage.

mein Code:

import matplotlib.pyplot as plt 
import numpy as np 
import datetime 

# my fake data 
dates = np.array([datetime.datetime(2000,1,1) + datetime.timedelta(days=i) for i in range(365*5)]) 
data = np.sin(np.arange(365*5)/365.0*2*np.pi - 0.25*np.pi) + np.random.rand(365*5) /3 

# creates fig with 2 subplots 
fig = plt.figure(figsize=(10.0, 6.0)) 
ax = plt.subplot2grid((2,1), (0, 0)) 
ax2 = plt.subplot2grid((2,1), (1, 0)) 
## plot dates 
ax2.plot_date(dates, data) 

# rotates labels 
plt.setp(ax2.xaxis.get_majorticklabels(), rotation=-45) 

# try to shift labels to the right 
ax2.xaxis.get_majorticklabels()[2].set_y(-.1) 
ax2.xaxis.get_majorticklabels()[2].set_x(10**99) 

plt.show() 

Merkwürdigerweise set_y verhält sich wie erwartet, aber selbst wenn ich x auf eine fantasillion gesetzt, würde die Etiketten nicht durch ein Jota bewegen. (Die Verwendung von plot_date kann zusätzliche Verwirrung vorstellen, aber das gleiche passiert eigentlich mit plot.)

+0

ich nicht in der Lage bin zu replizieren Ihr Bild mit dem obigen Code ... – MattDMo

+0

@MattDMo Ich habe versucht, es so zu kopieren und es auszuführen, und ich bekomme die richtige Handlung. Es hat jedoch zwei Unterplots. Hast du überhaupt etwas? –

Antwort

9

Ich habe einen Weg gefunden, um die Ticks der x-Achse um einen beliebigen und genauen Betrag zu verschieben, aber dieser Weg verläuft gefährlich nah an den steilen und rutschigen Klippen, die über dem Meer des Wahnsinns ragen. Also nur die sehr Mutigen oder Verzweifelten sollten lesen ...

Das heißt, das Problem ist, dass die x-Position der Etiketten festgelegt werden, wenn die Zeichnung gerendert wird (ich habe nicht in diesen Teil des Codes geschaut, aber das ist mein Verständnis). Alles, was Sie mit set_x() tun, wird später überschrieben. Allerdings gibt es eine Möglichkeit, um das: Sie set_x Affen-Patch für bestimmte Zecken können, so dass die Etiketten nicht gezogen, wo der Renderer will sie zeichnen:

import types 
SHIFT = 10. # Data coordinates 
for label in ax2.xaxis.get_majorticklabels(): 
    label.customShiftValue = SHIFT 
    label.set_x = types.MethodType(lambda self, x: matplotlib.text.Text.set_x(self, x-self.customShiftValue), 
            label, matplotlib.text.Text) 

Sie diese selektiv tun können, nur für die Etiketten, die Sie wollen zu wechseln und Sie können natürlich auch eine andere Schicht für jedes Etikett verwenden.

Wenn jemand weiß, wie dies auf einem niedrigeren Niveau Wahnsinn zu tun, wäre ich sehr interessiert ...

+0

Wenn Sie die Zecke Positionen kennen, können Sie so etwas wie für pos tun, tick in zip (Zecken, ax.xaxis.get_majorticklabels()): tick.set_x (po - 0,1) tick.set_x = Lambda-x : Keine ... Ich weiß nicht, wie Code in einem Kommentar erhalten, aber hoffentlich bekommen Sie den Kern. – valhallasw

16

Statt

ax2.xaxis.get_majorticklabels()[2].set_y(-.1) 
ax2.xaxis.get_majorticklabels()[2].set_x(10**99) 

die set_horizontalalignment() auf der Achse für jede Zecke verwenden:

for tick in ax2.xaxis.get_majorticklabels(): 
    tick.set_horizontalalignment("left") 

resultierend in:

+7

Danke für Ihre Antwort. Es bietet jedoch nicht viel Flexibilität: "links", "rechts", "Mitte". Ich versuche genaue Koordinaten zuzuordnen. Ich habe so viel Zeit damit verbracht, es zu versuchen, dass meine wirkliche Sorge hier eher ist zu wissen, ob es überhaupt möglich ist. –

3

Eine weitere Möglichkeit, eine horizontale Ausrichtung zu tun:

plt.xticks(ha='left') 
Verwandte Themen