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

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

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

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

размер шрифта и ориентация метки галочки изменены.

Однако, если попробовать:

label.set_text('Foo')

метка галочкиnot модифицирована. Также если я сделаю:

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

 repoman28 июн. 2012 г., 15:35
Смотрите фрагмент выше
 Joe Kington28 июн. 2012 г., 15:53
Вы получаете пустые метки, потому что вы еще не нарисовали холст. Если вы позвонитеdraw() прежде чем пытаться распечатать этикетки, вы получите то, что ожидаете. Установка отдельных меток тиков, к сожалению, является более сложным (происходит то, что локатор и форматировщик тиков не были сброшены, и они переопределяют вещи, когда выset_text). Я добавлю пример чуть позже, если кто-то не побьет меня. Хотя сейчас мне нужно сесть на автобус.
 Claudio28 июн. 2012 г., 15:11
Можете ли вы предоставить участок, который вы использовали для получения этикетки?
 repoman28 июн. 2012 г., 17:04
@JoeKington: Отлично! С нетерпением жду вашего исправления.
 Joe Kington28 июн. 2012 г., 17:19
@repoman - Ну, кажется, я говорил немного раньше. То, что я имел в виду, работает для старых версий matplotlib, но не для последней версии. Мне нужно больше копать. Сказано, это не должно быть так сложно, как это ...

Ответы на вопрос(8)

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

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

 23 мая 2017 г., 03:11
Хотя вопрос не задавался по этому поводу, я ценю, что этот пример позволяет вам устанавливать местоположение галочек одновременно с изменением их меток.
 22 окт. 2016 г., 21:09
Это простое решение и работает с pyplot 1.5.1. Это должно быть проголосовано.
Решение Вопроса

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

 05 авг. 2017 г., 05:31
я думаю, что вы можете сократить это доplt.gca().set_xticklabels(labels)
 13 мар. 2013 г., 17:38
это не похоже на работу с текущей версией (1.20)!
 07 дек. 2014 г., 23:15
Если метки уже установлены в строку, как, например, бокс, это все еще работает. Это может быть очевидно, но поскольку первая строка ответа такова, что он не работает с более новыми версиями matplotlib, пользователи могут полностью его пропустить (я это сделал изначально). Может быть, упомяну это кратко.

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.

 27 апр. 2017 г., 10:35
Спасибо, это ответ, который я искал. Чистое решение ИМО; просто поставкаset_xticklabels со смешанным списком строк и тиковых объектов.
 31 янв. 2018 г., 23:14
Имейте в виду, что если метки тиков установлены как целые, это изменит их на плавающие. Легко обходится, но стоит отметить.

Прошло много времени с тех пор, как был задан этот вопрос. По состоянию на сегодня (matplotlib 2.2.2) и после некоторого чтения и испытаний, я думаю, что лучший / правильный путь заключается в следующем:

Matplotlib имеет модуль с именемticker тот"contains classes to support completely configurable tick locating and formatting", Чтобы изменить конкретный тик из графика, у меня работает следующее:

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

Caveat! 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 количество знаков после запятой после точки.

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

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

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

draw()

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

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

ax.set_xticklabels(group_labels)

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

 repoman28 июн. 2012 г., 15:21
Но я хочу изменить только один ярлык. Приведенный выше трюк требует, чтобы вы извлекли все метки тиков и установили желаемое новое значение. Но как я могу извлечь метки, когда label.get_text () ничего не возвращает?

Ваш ответ на вопрос