метка галочки не изменяется. Также, если я сделаю:
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()
В более новых версиях 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
defupdate_ticks(x, pos): if x == 0: return'Mean' elif pos == 6: return'pos is 6' else: return x
Предостережение!x это значение галочки и pos это ее относительное положение по порядку на оси. Обратите внимание, что pos принимает значения, начинающиеся с 1, а не с 0, как обычно при индексации.
В моем случае я пытался отформатировать y-axis гистограмму с процентными значениями. mticker имеет другой класс с именем PercentFormatter, который может сделать это легко, без необходимости определять отдельную функцию, как раньше:
import matplotlib.pyplot as plt import matplotlib.ticker as mticker import numpy as np
В данном случае xmax это значение данных, соответствующее 100%. Проценты вычисляются как x / xmax * 100, поэтому мы исправляем xmax=1.0. Кроме того, decimals - это количество десятичных знаков, которые нужно поместить после точки.