Ich möchte einige Änderungen an einigen ausgewählten Hilfsstrichbeschriftungen in einem Diagramm vornehmen.
Zum Beispiel, wenn ich:
label = axes.yaxis.get_major_ticks()[2].label
label.set_fontsize(size)
label.set_rotation('vertical')
die Schriftgröße und Ausrichtung des Tick-Labels wird geändert.
Wenn Sie jedoch versuchen:
label.set_text('Foo')
das Häkchenetikett ist nicht modifiziert. Auch wenn ich tue:
print label.get_text()
nichts wird gedruckt.
Hier ist noch etwas Seltsames. Als ich das ausprobierte:
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 mit '0.0', '0.5', '1.0', '1.5' und '2.0' beschriftete Ticks.
Vorbehalt: Wenn die Ticklabels nicht bereits auf einen String gesetzt sind (wie dies beispielsweise in 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 nicht sicher, was das Problem noch ist ... Es kann eine unbeabsichtigte Änderung sein oder es kann nicht sein ...
Normalerweise würden Sie Folgendes 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 zu verstehen, warum Sie durch so viele Reifen springen müssen, müssen Sie etwas mehr über die Struktur von Matplotlib verstehen.
Matplotlib vermeidet absichtlich die "statische" Positionierung von Ticks usw., sofern dies nicht ausdrücklich gesagt wird. Die Annahme ist, dass Sie mit dem Plot interagieren möchten. Daher ändern sich die Grenzen des Plots, der Ticks, der Ticklabels usw. dynamisch.
Daher können Sie nicht einfach den Text einer bestimmten Hilfsstrichbeschriftung festlegen. Standardmäßig wird es vom Locator und vom Formatter der Achse jedes Mal neu gesetzt, wenn die Zeichnung gezeichnet wird.
Wenn die Locators und Formatters jedoch als statisch festgelegt sind (FixedLocator
bzw. FixedFormatter
), bleiben die Tick-Labels unverändert.
Dies ist, was set_*ticklabels
oder ax.*axis.set_ticklabels
tut.
Hoffentlich wird dadurch etwas klarer, warum das Ändern eines einzelnen Tick-Labels ein wenig kompliziert ist.
Oft möchten Sie eigentlich nur eine bestimmte Position kommentieren. Schauen Sie sich stattdessen annotate
an.
Wenn Sie in neueren Versionen von matplotlib
die Häkchenbeschriftungen nicht mit einer Reihe von str
-Werten festlegen, werden sie standardmäßig ''
verwendet (und wenn die Zeichnung gezeichnet wird, sind die Beschriftungen einfach die Tickwerte). Um zu wissen, dass die gewünschte Ausgabe erforderlich ist, müsste Folgendes erforderlich sein:
>>> 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 den _xticklabels
überprüfen, sind sie nicht mehr ein Haufen ''
.
>>> [item.get_text() for item in axes.get_xticklabels()]
['0.0', 'change', '1.0', '1.5', '2.0']
Es funktioniert in den Versionen von 1.1.1rc1
bis zur aktuellen Version 2.0
.
Das kann man auch mit pylab und xticks machen
import pylab 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()
http://matplotlib.org/examples/ticks_and_spines/ticklabels_demo_rotation.html
Die Achsenklasse verfügt über eine set_yticklabels - Funktion, mit der Sie die Tick-Labels setzen 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 Beispiel oben nicht funktioniert hat.
Es ist eine Weile her, seit diese Frage gestellt wurde. Nach heute (matplotlib 2.2.2
) und nach einigem Lesen und Versuchen denke ich, dass der beste/richtige Weg der folgende ist:
Matplotlib verfügt über ein Modul mit dem Namen ticker
that "enthält Klassen zur Unterstützung der vollständig konfigurierbaren Markierungssuche und -formatierung". Um ein bestimmtes Häkchen aus der Zeichnung 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. Beachten Sie, dass pos
Werte verwendet, die in 1
beginnen und nicht wie üblich bei 0
beim Indexieren.
In meinem Fall habe ich versucht, den y-axis
eines Histogramms mit Prozentwerten zu formatieren. mticker
hat eine andere Klasse mit dem Namen PercentFormatter
, die dies problemlos tun kann, ohne dass eine separate Funktion wie zuvor 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 ist xmax
der Datenwert, der 100% entspricht. Prozentsätze werden als x / xmax * 100
berechnet, daher beheben wir xmax=1.0
. Außerdem ist decimals
die Anzahl der Nachkommastellen, die nach dem Punkt platziert werden sollen.
Das funktioniert auch in Matplotlib 3:
x1 = [0,1,2,3]
squad = ['Fultz','Embiid','Dario','Simmons']
plt.xticks(x1, squad, rotation=45)
Wenn Sie nicht mit fig
und ax
arbeiten und alle Bezeichnungen ändern möchten (z. B. zur Normalisierung), können Sie dies tun:
labels, locations = plt.yticks()
plt.yticks(labels, labels/max(labels))