Изменить текст метки метки

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

Например, если:

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

изменяется размер шрифта и ориентация метки метки.

Однако, если try:

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".

Ответ 1

Предостережение: если метки метки уже не установлены в строку (как это обычно бывает в случае, например, в 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()

enter image description here

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

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

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

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

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

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

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

Ответ 2

В новых версиях 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()

и результат: enter image description here

и теперь, если вы проверите _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

В классе осей есть функция set_yticklabels, которая позволяет установить метки тика, например:

#ax is the axes instance
group_labels = ['control', 'cold treatment',
             'hot treatment', 'another treatment',
             'the last one']

ax.set_xticklabels(group_labels)

Я все еще работаю над тем, почему ваш пример выше не работает.

Ответ 5

Это работает:

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

Ответ 6

Прошло много времени с тех пор, как этот вопрос был задан. На сегодняшний день (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()

Histogram with random values from a normal distribution

Предостережение! 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()

Histogram with random values from a normal distribution

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

Ответ 7

Это также работает в matplotlib 3:

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

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

Ответ 8

Если вы не работаете с fig и ax и хотите изменить все метки (например, для нормализации), вы можете сделать это:

labels, locations = plt.yticks()
plt.yticks(labels, labels/max(labels))

Ответ 9

вы можете сделать:

for k in ax.get_xmajorticklabels():
    if some-condition:
        k.set_color(any_colour_you_like)

draw()