Text der Teilstrichbeschriftung ändern

Lesezeit: 8 Minuten

Benutzer-Avatar
repoman

Ich möchte einige Änderungen an einigen ausgewählten Tick-Labels in einem Diagramm vornehmen.

Wenn ich zum Beispiel mache:

label = axes.yaxis.get_major_ticks()[2].label
label.set_fontsize(size)
label.set_rotation('vertical')

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


Benutzer-Avatar
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()

Geben Sie hier die Bildbeschreibung ein

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

Benutzer-Avatar
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()

https://matplotlib.org/stable/gallery/ticks_and_spines/ticklabels_rotation.html

  • 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

Benutzer-Avatar
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:
Geben Sie hier die Bildbeschreibung ein

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

Benutzer-Avatar
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()

Histogramm mit zufälligen Werten aus einer Normalverteilung

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()

Histogramm mit zufälligen Werten aus einer Normalverteilung

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.

Das funktioniert:

import matplotlib.pyplot as plt

fig, ax1 = plt.subplots(1,1)

x1 = [0,1,2,3]
squad = ['Fultz','Embiid','Dario','Simmons']

ax1.set_xticks(x1)
ax1.set_xticklabels(squad, minor=False, rotation=45)

FEDS

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.

Benutzer-Avatar
Michael SB

Dies funktioniert auch in matplotlib 3:

x1 = [0,1,2,3]
squad = ['Fultz','Embiid','Dario','Simmons']

plt.xticks(x1, squad, rotation=45)

1072330cookie-checkText der Teilstrichbeschriftung ändern

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy