Ich habe ein Problem beim Versuch, meine Date-Ticks in matplotlib zu drehen. Ein kleines Beispielprogramm finden Sie weiter unten. Wenn ich versuche, die Zecken am Ende zu drehen, werden die Zecken nicht gedreht. Wenn ich versuche, die Häkchen wie unter dem Kommentar 'Abstürze' gezeigt zu drehen, stürzt matplot lib ab.
Dies geschieht nur, wenn die x-Werte Datumsangaben sind. Wenn ich die Variable dates
durch die Variable t
im Aufruf von ersetze avail_plot
, xticks(rotation=70)
funktioniert der Aufruf im Inneren einwandfreiavail_plot
.
Irgendwelche Ideen?
import numpy as np
import matplotlib.pyplot as plt
import datetime as dt
def avail_plot(ax, x, y, label, lcolor):
ax.plot(x,y,'b')
ax.set_ylabel(label, rotation='horizontal', color=lcolor)
ax.get_yaxis().set_ticks([])
#crashes
#plt.xticks(rotation=70)
ax2 = ax.twinx()
ax2.plot(x, [1 for a in y], 'b')
ax2.get_yaxis().set_ticks([])
ax2.set_ylabel('testing')
f, axs = plt.subplots(2, sharex=True, sharey=True)
t = np.arange(0.01, 5, 1)
s1 = np.exp(t)
start = dt.datetime.now()
dates=[]
for val in t:
next_val = start + dt.timedelta(0,val)
dates.append(next_val)
start = next_val
avail_plot(axs[0], dates, s1, 'testing', 'green')
avail_plot(axs[1], dates, s1, 'testing2', 'red')
plt.subplots_adjust(hspace=0, bottom=0.3)
plt.yticks([0.5,],("",""))
#doesn't crash, but does not rotate the xticks
#plt.xticks(rotation=70)
plt.show()
python
matplotlib
Neal
quelle
quelle
Antworten:
Wenn Sie einen nicht objektorientierten Ansatz bevorzugen, gehen Sie vor den beiden Aufrufen
plt.xticks(rotation=70)
nach rechts , zavail_plot
Dadurch wird die Rotationseigenschaft festgelegt, bevor die Beschriftungen eingerichtet werden. Da Sie hier zwei Achsen haben,
plt.xticks
wird es verwirrt, nachdem Sie die beiden Diagramme erstellt haben. An dem Punkt , wennplt.xticks
nichts tut,plt.gca()
hat nicht geben Sie die Achsen Sie ändern möchten, und soplt.xticks
, die auf den gegenwärtigen Achsen wirkt, nicht zur Arbeit gehen.Für einen objektorientierten Ansatz, der nicht verwendet wird
plt.xticks
, können Sie verwendennach den beiden
avail_plot
anrufen. Dadurch wird die Drehung speziell auf die richtigen Achsen eingestellt.quelle
plt.setp
, können Sie mehrere Parameter festlegen, indem Sie sie als zusätzliche Schlüsselwortargumente angeben. Dashorizontalalignment
Kwarg ist besonders nützlich, wenn Sie die Häkchen drehen:plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70, horizontalalignment='right' )
ax.tick_params(axis='x', rotation=70)
an jedem Ort anrufen .plt.setp
Lösung ist vollständig objektorientiert. Wenn Ihnen die Tatsache nicht gefällt, dass einigeplt
davon enthalten sind, verwenden Siefrom matplotlib.artist import setp; setp(ax.get_xticklabels(), rotation=90)
stattdessen.plt.xticks
ist Pyplot. Die Dokumentation selbst sagt, dass Stile nicht gemischt werden sollen.plt.setp
ist ausführlicher, aber auch nicht der typische objektorientierte Stil. Ihre Antwort ist hier definitiv die beste. Grundsätzlich ist alles mit einer Funktion nicht objektorientiert. Es spielt keine Rolle, ob Sie importierensetp
oder nicht.yticks
und der Code hat überhaupt keine Axt außerhalb vonavail_plot
...Die Lösung funktioniert für matplotlib 2.1+
Es gibt eine Achsenmethode
tick_params
, mit der die Tick-Eigenschaften geändert werden können. Es existiert auch als Achsenmethode alsset_tick_params
Oder
Nebenbei bemerkt, die aktuelle Lösung mischt die zustandsbehaftete Schnittstelle (mithilfe von Pyplot) mit der objektorientierten Schnittstelle mithilfe des Befehls
plt.xticks(rotation=70)
. Da der Code in der Frage den objektorientierten Ansatz verwendet, ist es am besten, diesen Ansatz durchgehend beizubehalten. Die Lösung gibt eine gute explizite Lösung mitplt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )
quelle
Eine einfache Lösung, die ein Schleifen über die Ticklabes vermeidet, ist die einfache Verwendung
fig.autofmt_xdate()
Dieser Befehl dreht die xaxis-Beschriftungen automatisch und passt ihre Position an. Die Standardwerte sind ein Drehwinkel von 30 ° und die horizontale Ausrichtung "rechts". Sie können aber im Funktionsaufruf geändert werden
Das zusätzliche
bottom
Argument entspricht der Einstellungplt.subplots_adjust(bottom=bottom)
, mit der die Polsterung der unteren Achsen auf einen größeren Wert gesetzt werden kann, um die gedrehten Ticklabels aufzunehmen.Im Grunde haben Sie hier alle Einstellungen, die Sie benötigen, um eine schöne Datumsachse in einem einzigen Befehl zu haben.
Ein gutes Beispiel finden Sie auf der matplotlib-Seite.
quelle
plt.setp
Ansatz verwenden oder die Ticks durchlaufen (was im Wesentlichen derselbe ist).twinx
Befindet sich die x-Achse jedoch oben im Diagramm oder sind zwei x-Achsen ( ) vorhanden, wird die Ausrichtung zwischen Ticks und Tick-Beschriftungen verzerrt. In diesem Fall ist die Lösung von Ted Petrou besser.Eine weitere Möglichkeit , anzuwenden
horizontalalignment
undrotation
zu jedem Tick Label macht einefor
Schleife über die Strichbeschriftungen Sie ändern möchten:Und hier ist ein Beispiel, wenn Sie die Position von Haupt- und Nebenzecken steuern möchten:
quelle
Einfach benutzen
quelle