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