Изменить текст метки галочки
Я хочу внести некоторые изменения в некоторые метки на участке.
например, если я делаю:
label = axes.yaxis.get_major_ticks()[2].label
label.set_fontsize(size)
label.set_rotation('vertical')
размер шрифта и ориентация метки тика изменяется.
однако, если попробовать:
label.set_text('Foo')
метки засечки составляет не изменить. Также, если я делаю:
print label.get_text()
ничего не печатается.
вот еще одна странность. Когда я попробовал это:
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()
только пустые строки печатаются, но график содержит галочки, помеченные как '0.0', '0.5', '1.0', '1.5', и "2.0".
7 ответов:
предостережение: Если ticklabels уже не установлены в строку (как это обычно бывает, например, в 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илиax.*axis.set_ticklabelsделает.надеюсь, что это делает его слабо более ясным, почему изменение отдельной метки тика немного запутано.
часто то, что вы на самом деле хотите сделать, это просто аннотировать определенную позицию. В таком случае, смотрите в
annotate, вместо.
в новой версии
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.1rc1to текущая версия2.0.
можно также сделать это с помощью pylab и xticks
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
класс axes имеет set_yticklabels функция, которая позволяет установить метки галочек, например:
#ax is the axes instance group_labels = ['control', 'cold treatment', 'hot treatment', 'another treatment', 'the last one'] ax.set_xticklabels(group_labels)Я все еще работаю над почему ваш пример выше не работает.
прошло некоторое время с тех пор, как этот вопрос был задан. На сегодняшний день (
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- количество десятичных знаков после точки.
вы можете сделать:
for k in ax.get_xmajorticklabels(): if some-condition: k.set_color(any_colour_you_like) draw()





Comments