it-swarm.com.de

Wie setze ich mein xlabel am Ende von xaxis?

Ich möchte, dass meine X-Achse das Etikett wie dieses Format hat

0 1 2 3 4 5 Xlabel

aber ich versuche den folgenden Code, erhalte mich in zwei Zeilen 

self.axes.set_xticks(np.arange(0,6,1))
self.axes.set_xlabel('Xlabel', fontsize=9,x=1,y=1)

=> mein Ergebnis :(

0 1 2 3 4 5 
        Xlabel 
31
billyduc

Beim Festlegen der x-Beschriftung weist der Parameter x die Position in Achseneinheiten zu, also ist 0 der Ursprung und 1 der rechte Rand des Diagramms. y wird ignoriert, da erwartet wird, dass es sich um einen Standardwert handelt, direkt unterhalb der Markierungen. 

Um dieses Verhalten zu überschreiben, können Sie die Position in Achseneinheiten mit der Variablen Axisset_label_coordsMethode festlegen. Sie können andere Einheiten verwenden, indem Sie auch eine Transformation bereitstellen.

Hier ist ein Beispiel dafür:

import matplotlib.pyplot as plt
import numpy as np

ax = plt.gca()
ax.set_xticks(np.arange(0,6,1))
label = ax.set_xlabel('Xlabel', fontsize = 9)
ax.xaxis.set_label_coords(1.05, -0.025)

plt.savefig('labelAtEnd.png')
plt.show()

Ergebend:enter image description here

Der x-Wert (1,05) wurde gewählt, um die Beschriftung außerhalb des Achsenrahmens zu positionieren. Der y-Wert (-0,025) wurde als bester Schätzwert für die gewünschte Position ausgewählt. Bei einer Transformation kann es möglich sein, den Text automatisch in Übereinstimmung mit den Beschriftungen Tick zu positionieren. 

EDIT:

Hier ist ein erweitertes Beispiel für eine Transformation. Es ist nicht unbedingt hilfreicher, die Transformation des letzten Ticklabels zu verwenden, da die Größe des Textes und die Ausrichtung des Textes nicht berücksichtigt werden. Um einen etwas gewünschten Effekt zu erzielen, musste ich 1) dieselbe Schriftgröße für mein x-Label verwenden, 2) die vertikale Ausrichtung (va) auf "top" und 3) die horizontale Ausrichtung auf "links" positionieren. Die Transformation für jeden Tick wird für Dateneinheiten für x (weil es eine X-Achse ist) und Achseneinheiten für Y (0 bis 1) festgelegt, jedoch um einen festen Abstand (in Pixel) von der X-Achse verschoben. 

import matplotlib.pyplot as plt
import numpy as np

ax = plt.gca()
ax.set_xticks(np.arange(0,6,1))
ax.set_yticks(np.arange(0,6,1))
label = ax.set_xlabel('xlabel', ha='left', va = 'top', )#fontsize = 9)

# need to draw the figure first to position the tick labels
fig = plt.gcf()
fig.draw(fig.canvas.get_renderer())

# get a tick and will position things next to the last one
ticklab = ax.xaxis.get_ticklabels()[0]
trans = ticklab.get_transform()
ax.xaxis.set_label_coords(5.1, 0, transform=trans)

plt.savefig('labelAtEnd2.png')
plt.show()

Das führt zu:

enter image description here

39
Yann

Zusätzlich zu dem, was @Yann bereits gesagt hat, ist dies mit annotate tatsächlich einfacher. Es bleibt auch in der richtigen Position, wenn es gezoomt/verschoben wird.

import matplotlib.pyplot as plt
import matplotlib as mpl

ticklabelpad = mpl.rcParams['xtick.major.pad']

fig, ax = plt.subplots()
ax.set_xlim([0, 5])

# Add the label as annotation. The "5" is the padding betweent the right side
# of the axis and the label...
ax.annotate('XLabel', xy=(1,0), xytext=(5, -ticklabelpad), ha='left', va='top',
            xycoords='axes fraction', textcoords='offset points')

plt.show()

enter image description here

17
Joe Kington

Hier ist meine Variante der @JoeKington-Methode . Zuerst setze ich letzte Striche auf leere Zeichenfolgen und verwende dann Annotate (). Ich habe annotate () verwendet, weil ich die Schriftgröße der Achsenbeschriftung steuern muss. 

import numpy as np
import matplotlib.pyplot as plt

plt.xlim(50, 70)
plt.ylim(100, 250)

ax = plt.gca()
# clears last tick label
xticks = ax.get_xticks().tolist()
xticks[-1] = ''
ax.set_xticklabels(xticks)
yticks = ax.get_yticks().tolist()
yticks[-1] = ''
ax.set_yticklabels(yticks)
# sets axes labels on both ends
ax.annotate('$t$', xy=(0.98, 0), ha='left', va='top', xycoords='axes fraction', fontsize=20)
ax.annotate('$x$', xy=(0, 1), xytext=(-15,2), ha='left', va='top', xycoords='axes fraction', textcoords='offset points', fontsize=20)

plt.show(block=True)

Vielleicht weiß jemand einen eleganteren Weg, dies zu tun, weil es eine lächerlich komplexe Operation ist.

enter image description here

3
Dmitry Davydov

Ich verwende die von @JoeKington bereitgestellte Lösung mit der Erweiterung, Beschriftungsschrift-Eigenschaften für den von ax.annotate(...) erzeugten Text festzulegen.

Dies ist wichtig, wenn Achsenbeschriftungen anders als andere Texte formatiert sind.

import matplotlib.pyplot as plt
import matplotlib as mpl

ticklabelpad = mpl.rcParams['xtick.major.pad']

fig, ax = plt.subplots()
ax.set_xlim([0, 5])

dx_in_points = 5
fontproperties = ax.xaxis.get_label().get_fontproperties()

ax.annotate('XLabel', xy=(1,0), xytext=(dx_in_points, -ticklabelpad), ha='left', va='top',
         xycoords='axes fraction', textcoords='offset points', fontproperties=fontproperties)

plt.show()
0
Bastian