2012-06-28 2 views
115

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

Например, если я делаю:

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

+0

Можете ли вы SUPPL y сюжет, который вы использовали для получения ярлыка? – Claudio

+1

См. Фрагмент выше – repoman

+0

Вы получаете пустые ярлыки, потому что вы еще не нарисовали холст. Если вы вызываете 'draw()' перед тем, как пытаться распечатать метки, вы получите то, что ожидаете. Устанавливать индивидуальные метки ярлыков, к сожалению, сложнее (что происходит, когда локатор тиков и форматирование не были сброшены, и это переопределяет вещи, когда вы 'set_text'). Я немного добавлю пример, если кто-то меня не избивает. Я должен поймать автобус, на данный момент. –

ответ

156

Предостережение: если флажки ticklabels уже установлены в строку (как это обычно бывает в случае, например, в коробке), это не будет работать с любой версией 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 and Formatters установлены как статические (FixedLocator и FixedFormatter соответственно), то метки тика остаются неизменными.

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

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

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

+5

не работает с текущей версией (1.20)! –

+1

Если метки метки уже установлены в строку, как, например, boxplot, это все еще работает. Это может быть очевидным, но поскольку первая строка ответа заключается в том, что она не работает над новыми версиями matplotlib, пользователи могут пропустить ее полностью (сначала). Возможно, коротко расскажите об этом. –

+2

Я думаю, вы можете сконденсировать его до * plt.gca(). Set_xticklabels (labels) * – alexey

10

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

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

ax.set_xticklabels(group_labels) 

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

+2

Но я хочу изменить только одну метку. Вышеупомянутый трюк требует, чтобы вы извлекли все метки меток и задали желаемое новое значение. Но как я могу извлечь метки меток, когда label.get_text() ничего не возвращает? – repoman

-4

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

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

draw() 
65

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

+0

Спасибо, это ответ, который я искал. Чистое решение IMO; просто поставьте 'set_xticklabels' со смешанным списком строк и объектов тика. –

+0

Имейте в виду, что если метки метки установлены как int, это изменит их на float. Легко работать, но стоит отметить. – ApproachingDarknessFish

56

Можно также сделать это с 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

+0

Это простое решение и работает с pyplot 1.5.1. Это должно быть поддержано. – wordsmith

+0

Хотя вопрос не просил об этом, я ценю, что этот пример позволяет вам установить местоположение тиков одновременно с изменением их меток. – eclark

1

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

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

Смежные вопросы