die Schriftgröße und die Ausrichtung der Teilstrichbeschriftung wird geändert.
Wenn Sie jedoch versuchen:
label.set_text('Foo')
das Tick-Label ist nicht geändert. Auch wenn ich es tue:
print label.get_text()
nichts wird gedruckt.
Hier ist noch mehr Seltsamkeit. Als ich das probiert habe:
from pylab import *
axes = figure().add_subplot(111)
t = arange(0.0, 2.0, 0.01)
s = sin(2*pi*t)
axes.plot(t, s)
for ticklabel in axes.get_xticklabels():
print ticklabel.get_text()
Es werden nur leere Zeichenfolgen gedruckt, aber der Plot enthält Ticks, die als „0.0“, „0.5“, „1.0“, „1.5“ und „2.0“ gekennzeichnet sind.
Können Sie das Grundstück angeben, aus dem Sie das Etikett erhalten haben?
– Claudio
28. Juni 2012 um 13:11 Uhr
Sie erhalten leere Etiketten, weil Sie die Leinwand noch nicht gezeichnet haben. Wenn Sie anrufen draw() Bevor Sie versuchen, die Etiketten zu drucken, erhalten Sie, was Sie erwarten. Das Festlegen einzelner Tick-Labels ist leider etwas schwieriger (was passiert ist, dass der Tick-Locator und -Formatierer nicht zurückgesetzt wurden und Dinge außer Kraft setzen, wenn Sie set_text). Ich werde gleich ein Beispiel hinzufügen, falls mir jemand nicht zuvorkommt. Allerdings muss ich jetzt den Bus nehmen.
– Joe Kington
28. Juni 2012 um 13:53 Uhr
@JoeKington: Großartig! Ich freue mich auf Ihre Lösung.
– Repomann
28. Juni 2012 um 15:04 Uhr
@repoman – Nun, es scheint, ich habe etwas zu früh gesprochen. Was ich im Sinn hatte, funktioniert für ältere Versionen von Matplotlib, aber nicht für die neueste Version. Ich muss noch ein bisschen graben. Wie gesagt, das sollte nicht so kompliziert sein, wie es ist …
– Joe Kington
28. Juni 2012 um 15:19 Uhr
Joe Kington
Vorbehalt: Sofern die Ticklabels nicht bereits auf eine Zeichenfolge gesetzt sind (wie dies normalerweise in zB einem Boxplot der Fall ist), funktioniert dies nicht mit einer neueren Version von matplotlib als 1.1.0. Wenn Sie mit dem aktuellen Github-Master arbeiten, funktioniert dies nicht. Ich bin mir noch nicht sicher, was das Problem ist … Es kann eine unbeabsichtigte Änderung sein, oder es kann nicht sein …
Normalerweise würden Sie so etwas tun:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
# We need to draw the canvas, otherwise the labels won't be positioned and
# won't have values yet.
fig.canvas.draw()
labels = [item.get_text() for item in ax.get_xticklabels()]
labels[1] = 'Testing'
ax.set_xticklabels(labels)
plt.show()
Um den Grund zu verstehen, warum Sie durch so viele Reifen springen müssen, müssen Sie etwas mehr darüber verstehen, wie matplotlib strukturiert ist.
Matplotlib vermeidet absichtlich die “statische” Positionierung von Ticks usw., es sei denn, es wird ausdrücklich dazu aufgefordert. Die Annahme ist, dass Sie mit dem Diagramm interagieren möchten und sich daher die Grenzen des Diagramms, Ticks, Ticklabels usw. dynamisch ändern.
Daher können Sie nicht einfach den Text eines bestimmten Tick-Labels festlegen. Standardmäßig wird es jedes Mal, wenn der Plot gezeichnet wird, vom Locator und Formatter der Achse neu gesetzt.
Wenn die Locators und Formatters jedoch auf statisch eingestellt sind (FixedLocator und FixedFormatter), dann bleiben die Tick-Beschriftungen gleich.
Das ist was set_*ticklabels oder ax.*axis.set_ticklabels tut.
Hoffentlich wird dadurch etwas klarer, warum das Ändern eines einzelnen Tick-Labels etwas kompliziert ist.
Oft möchten Sie nur eine bestimmte Position kommentieren. Schauen Sie in diesem Fall nach annotatestattdessen.
das scheint mit der aktuellen Version (1.20) nicht zu funktionieren!
– Andreas Jaffe
13. März 2013 um 16:38 Uhr
Wenn die Ticklabels bereits auf einen String gesetzt sind, wie zB in einem Boxplot, funktioniert dies immer noch. Dies mag offensichtlich sein, aber da die erste Zeile der Antwort lautet, dass es auf neueren Matplotlib-Versionen nicht funktioniert, können Benutzer es vollständig überspringen (ich habe es anfangs getan). Vielleicht kurz erwähnen.
– joelostblom
7. Dezember 2014 um 22:15 Uhr
Ich denke, Sie können es verdichten plt.gca().set_xticklabels(Etiketten)
– Alexej
5. August 2017 um 3:31 Uhr
Was ist, wenn ich die Schriftstärke von “Testing” haben möchte? bold während andere die Schriftstärke “light” verwenden. Gibt es eine Möglichkeit, es zu tun?
– Stefan
15. Juli 2019 um 5:29 Uhr
Für diejenigen, die dies in einem Jupyter-Notebook verwenden, kann dies von Vorteil sein fig.canvas.draw() ist entscheidend
– wander95
3. Januar 2020 um 21:07 Uhr
raffaelvalle
Das kann man auch mit pylab und x tickt
import matplotlib
import matplotlib.pyplot as plt
x = [0,1,2]
y = [90,40,65]
labels = ['high', 'low', 37337]
plt.plot(x,y, 'r')
plt.xticks(x, labels, rotation='vertical')
plt.show()
Dies ist eine einfache Lösung und funktioniert mit Pyplot 1.5.1. Dies sollte positiv bewertet werden.
– gut gespielt
22. Oktober 2016 um 19:09 Uhr
Obwohl in der Frage nicht danach gefragt wurde, weiß ich zu schätzen, dass Sie in diesem Beispiel die Position der Häkchen festlegen und gleichzeitig ihre Beschriftungen ändern können.
– Eklar
23. Mai 2017 um 1:11 Uhr
Von der Moderne Matplotlib-Dokumentation: “pylab ist veraltet und es wird dringend von seiner Verwendung abgeraten, da Namespaces verunreinigt sind. Verwenden Sie stattdessen pyplot.”
– Nathaniel Jones
21. Februar 2020 um 21:06 Uhr
CT Zhu
In neueren Versionen von matplotlibwenn Sie die Tick-Labels nicht mit einem Haufen setzen str Werte, das sind sie '' standardmäßig (und wenn der Plot gezeichnet wird, sind die Beschriftungen einfach die Tick-Werte). Wenn Sie das wissen, um die gewünschte Ausgabe zu erhalten, wäre etwa Folgendes erforderlich:
>>> from pylab import *
>>> axes = figure().add_subplot(111)
>>> a=axes.get_xticks().tolist()
>>> a[1]='change'
>>> axes.set_xticklabels(a)
[<matplotlib.text.Text object at 0x539aa50>, <matplotlib.text.Text object at 0x53a0c90>,
<matplotlib.text.Text object at 0x53a73d0>, <matplotlib.text.Text object at 0x53a7a50>,
<matplotlib.text.Text object at 0x53aa110>, <matplotlib.text.Text object at 0x53aa790>]
>>> plt.show()
und das Ergebnis:
und jetzt, wenn Sie das überprüfen _xticklabelssie sind kein Haufen mehr ''.
>>> [item.get_text() for item in axes.get_xticklabels()]
['0.0', 'change', '1.0', '1.5', '2.0']
Es funktioniert in den Versionen ab 1.1.1rc1 zur aktuellen Version 2.0.
Danke, das ist die Antwort, die ich gesucht habe. Sauberste Lösung IMO; nur versorgen set_xticklabels mit einer gemischten Liste von Strings und Tick-Objekten.
– Lukas Davis
27. April 2017 um 8:35 Uhr
Beachten Sie, dass, wenn die Tick-Beschriftungen als Ints festgelegt sind, sie in Floats geändert werden. Leicht umgangen, aber erwähnenswert.
– Annäherung an DarknessFish
31. Januar 2018 um 22:14 Uhr
Dieser hat funktioniert (ax.get_xticks().tolist()). Die Lösung mit den meisten Stimmen hat nicht (ax.get_xtickslabels()). Irgendwie war es nicht möglich, die Etiketten vorher zu extrahieren plt.show() hingerichtet wurde, obwohl ich benutzt habe fig.canvas.draw() wie vorgeschlagen.
– CypherX
6. Dezember 2019 um 10:20 Uhr
FYI, von modern Matplotlib-Dokumentation: “pylab ist veraltet und es wird dringend von seiner Verwendung abgeraten, da Namespaces verunreinigt sind. Verwenden Sie stattdessen pyplot.”
– Nathaniel Jones
21. Februar 2020 um 21:09 Uhr
UserWarning: FixedFormatter sollte nur zusammen mit FixedLocator verwendet werden
– Baxx
8. Dezember 2020 um 15:46 Uhr
iipr
Es ist schon eine Weile her, dass diese Frage gestellt wurde. Ab heute (matplotlib 2.2.2) und nach einigem Lesen und Versuchen denke ich, dass der beste/richtige Weg der folgende ist:
Matplotlib hat ein Modul namens ticker das “enthält Klassen zur Unterstützung der vollständig konfigurierbaren Ortung und Formatierung von Ticks”. Um einen bestimmten Tick aus dem Diagramm zu ändern, funktioniert Folgendes für mich:
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np
def update_ticks(x, pos):
if x == 0:
return 'Mean'
elif pos == 6:
return 'pos is 6'
else:
return x
data = np.random.normal(0, 1, 1000)
fig, ax = plt.subplots()
ax.hist(data, bins=25, edgecolor="black")
ax.xaxis.set_major_formatter(mticker.FuncFormatter(update_ticks))
plt.show()
Vorbehalt!x ist der Wert des Ticks und pos ist seine relative Position in der Reihenfolge in der Achse. Beachte das pos nimmt Werte beginnend in an 1nicht in 0 wie üblich beim Indexieren.
In meinem Fall habe ich versucht, die zu formatieren y-axis eines Histogramms mit Prozentwerten. mticker hat eine andere Klasse namens PercentFormatter das kann dies leicht tun, ohne dass wie zuvor eine separate Funktion definiert werden muss:
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np
data = np.random.normal(0, 1, 1000)
fig, ax = plt.subplots()
weights = np.ones_like(data) / len(data)
ax.hist(data, bins=25, weights=weights, edgecolor="black")
ax.yaxis.set_major_formatter(mticker.PercentFormatter(xmax=1.0, decimals=1))
plt.show()
In diesem Fall xmax ist der Datenwert, der 100 % entspricht. Prozentsätze werden berechnet als x / xmax * 100deshalb beheben wir xmax=1.0. Ebenfalls, decimals ist die Anzahl der Dezimalstellen nach dem Komma.
Die Axtklasse hat a set_yticklabels Funktion, mit der Sie die Tick-Labels wie folgt festlegen können:
#ax is the axes instance
group_labels = ['control', 'cold treatment',
'hot treatment', 'another treatment',
'the last one']
ax.set_xticklabels(group_labels)
Ich arbeite immer noch daran, warum Ihr obiges Beispiel nicht funktioniert hat.
Können Sie das Grundstück angeben, aus dem Sie das Etikett erhalten haben?
– Claudio
28. Juni 2012 um 13:11 Uhr
Sie erhalten leere Etiketten, weil Sie die Leinwand noch nicht gezeichnet haben. Wenn Sie anrufen
draw()
Bevor Sie versuchen, die Etiketten zu drucken, erhalten Sie, was Sie erwarten. Das Festlegen einzelner Tick-Labels ist leider etwas schwieriger (was passiert ist, dass der Tick-Locator und -Formatierer nicht zurückgesetzt wurden und Dinge außer Kraft setzen, wenn Sieset_text
). Ich werde gleich ein Beispiel hinzufügen, falls mir jemand nicht zuvorkommt. Allerdings muss ich jetzt den Bus nehmen.– Joe Kington
28. Juni 2012 um 13:53 Uhr
@JoeKington: Großartig! Ich freue mich auf Ihre Lösung.
– Repomann
28. Juni 2012 um 15:04 Uhr
@repoman – Nun, es scheint, ich habe etwas zu früh gesprochen. Was ich im Sinn hatte, funktioniert für ältere Versionen von Matplotlib, aber nicht für die neueste Version. Ich muss noch ein bisschen graben. Wie gesagt, das sollte nicht so kompliziert sein, wie es ist …
– Joe Kington
28. Juni 2012 um 15:19 Uhr