Изменить текст метки галочки
Я хочу внести некоторые изменения в несколько выбранных меток тика на графике.
Например, если я сделаю:
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
- это количество десятичных знаков, которые нужно поместить после точки.