Изменить текст метки галочки



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



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



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

647   7  

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()

enter image description here

чтобы понять причину, почему вы нужно перепрыгнуть через столько обручей, вам нужно понять немного больше о том, как 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()

и результат: 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 to текущая версия 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)

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

это работает:

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

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

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

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

draw()

Comments

    Ничего не найдено.