web-dev-qa-db-de.com

Ändern Sie den Beschriftungstext

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.

152
repoman

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

enter image description here

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. 

213
Joe Kington

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: enter image description here

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.

75
CT Zhu

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

64
rafaelvalle

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. 

10
stanri

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

5
Soham

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

 Histogram with random values from a normal distribution

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

 Histogram with random values from a normal distribution

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.

4
iipr

Das funktioniert auch in Matplotlib 3:

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

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

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

0
dopexxx