Вопрос-Ответ

Modify tick label text

Изменить текст метки галочки

Я хочу внести некоторые изменения в несколько выбранных меток тика на графике.

Например, если я сделаю:

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

изменен размер шрифта и ориентация метки галочки.

Однако, если попытаться:

label.set_text('Foo')

метка галочки не изменяется. Также, если я сделаю:

print label.get_text()

ничего не печатается.

Вот еще несколько странностей. Когда я попробовал это:

import matplotlib.pyplot as plt
import numpy as np

axes = plt.figure().add_subplot(111)
t = np.arange(0.0, 2.0, 0.01)
s = np.sin(2*np.pi*t)
axes.plot(t, s)
for ticklabel in axes.get_xticklabels():
print(ticklabel.get_text())

Печатаются только пустые строки, но график содержит галочки, помеченные как '0.0', '0.5', '1.0', '1.5', и '2.0'.

введите описание изображения здесь

Переведено автоматически
Ответ 1

Предостережение: если для меток уже не задано значение string (как обычно бывает, например, в boxplot), это не будет работать ни с одной версией matplotlib новее, чем 1.1.0. Если вы работаете с текущим мастером github, это не сработает. Я пока не уверен, в чем проблема... Это может быть непреднамеренное изменение, а может и нет...

Обычно вы бы сделали что-то в этом роде:

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

введите описание изображения здесь

Чтобы понять причину, по которой вам нужно перепрыгивать через такое количество обручей, вам нужно немного больше понять о том, как структурирован matplotlib.

Matplotlib намеренно избегает выполнения "статического" позиционирования тиков и т.д., если только это явно не указано. Предполагается, что вы захотите взаимодействовать с графиком, и поэтому границы графика, тики, метки тика и т.д. Будут динамически меняться.

Следовательно, вы не можете просто задать текст данной метки галочки. По умолчанию он повторно устанавливается локатором оси и программой форматирования каждый раз при построении графика.

Однако, если локаторы и форматеры установлены как статические (FixedLocator и FixedFormatter соответственно), то метки тика остаются неизменными.

Это то, что делает set_*ticklabels or ax.*axis.set_ticklabels.

Надеюсь, это немного прояснит, почему изменение отдельной метки тика немного запутано.

Часто то, что вы на самом деле хотите сделать, это просто прокомментировать определенную позицию. В таком случае вместо этого загляните в annotate.

Ответ 2

Это также можно сделать с помощью pylab и xticks

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

Ответ 3

В более новых версиях matplotlib, если вы не задаете метки галочки с набором str значений, они есть '' по умолчанию (и когда график рисуется, метки представляют собой просто значения галочек). Зная это, для получения желаемого результата потребуется что-то вроде этого:

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

и результат:
введите описание изображения здесь

и теперь, если вы проверите _xticklabels, они больше не являются кучей ''.

>>> [item.get_text() for item in axes.get_xticklabels()]
['0.0', 'change', '1.0', '1.5', '2.0']

Это работает в версиях от 1.1.1rc1 до текущей версии 2.0.

Ответ 4

Прошло некоторое время с тех пор, как этот вопрос задавался. На сегодняшний день (matplotlib 2.2.2) и после некоторого чтения и испытаний, я думаю, что лучшим / правильным способом является следующий:

В Matplotlib есть модуль с именем, ticker который "содержит классы для поддержки полностью настраиваемого расположения и форматирования галочек". Чтобы изменить конкретную галочку на графике, для меня работает следующее:

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

Гистограмма со случайными значениями из нормального распределения

Предостережение! x это значение галочки и pos это ее относительное положение по порядку на оси. Обратите внимание, что pos принимает значения, начинающиеся с 1, а не с 0, как обычно при индексации.


В моем случае я пытался отформатировать y-axis гистограмму с процентными значениями. mticker имеет другой класс с именем PercentFormatter, который может сделать это легко, без необходимости определять отдельную функцию, как раньше:

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

Гистограмма со случайными значениями из нормального распределения

В данном случае xmax это значение данных, соответствующее 100%. Проценты вычисляются как x / xmax * 100, поэтому мы исправляем xmax=1.0. Кроме того, decimals - это количество десятичных знаков, которые нужно поместить после точки.

python matplotlib