눈금 레이블 텍스트 수정


216

플롯에서 선택된 몇 가지 눈금 레이블을 수정하고 싶습니다.

예를 들어 내가 할 경우 :

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'으로 레이블이 지정된 눈금이 포함됩니다.


라벨을 가져 오는 데 사용한 플롯을 제공 할 수 있습니까?
Claudio

아직 캔버스를 그리지 않았기 때문에 빈 레이블이 나타납니다. draw()라벨을 인쇄하기 전에 전화 하면 원하는 것을 얻을 수 있습니다. 개별 눈금 레이블을 설정하는 것은 불행히도 터치하기가 더 어렵습니다 (발생하는 상황은 눈금 로케이터와 포맷터가 재설정되지 않았으며 사용자가이를 무시합니다 set_text). 누군가 나를 이길 수 없다면 예제를 조금 추가하겠습니다. 그래도 나는 지금 버스를 타야한다.
Joe Kington

@JoeKington : 좋아요! 당신의 수정을 기대합니다.
repoman 2016 년

@ repoman-글쎄, 내가 너무 빨리 연락을 한 것 같습니다. 내가 생각한 것은 이전 버전의 matplotlib에서는 작동하지만 최신 버전에서는 작동하지 않습니다. 좀 더 파고 듭니다. 말했던 것처럼, 이것은 그렇게 복잡해서는 안됩니다 ...
Joe Kington

답변:


298

주의 사항 : 눈금 레이블이 이미 문자열로 설정되어 있지 않으면 (예 : 상자 그림의 경우와 같이) 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()

여기에 이미지 설명을 입력하십시오

너무 많은 후프를 뛰어 넘어야하는 이유를 이해하려면 matplotlib의 구조에 대해 조금 더 이해해야합니다.

Matplotlib은 명시 적으로 지시되지 않는 한 진드기 등의 "정적"위치 지정을 의도적으로 피합니다. 플롯과 상호 작용하기를 원하므로 플롯, 눈금, 눈금 레이블 등의 범위가 동적으로 변경된다는 가정이 있습니다.

따라서 지정된 눈금 레이블의 텍스트를 설정할 수 없습니다. 기본적으로 플롯이 그려 질 때마다 축의 로케이터 및 포맷터에 의해 재설정됩니다.

그러나 로케이터 및 포맷터가 정적 ( 각각 FixedLocator및)으로 설정된 FixedFormatter경우 눈금 레이블은 동일하게 유지됩니다.

이것은 무엇 set_*ticklabels이나 ax.*axis.set_ticklabels한다.

다행히도 개별 눈금 레이블을 변경하는 것이 약간 복잡한 이유에 대해 매우 명확하게 알 수 있기를 바랍니다.

종종, 실제로하고 싶은 것은 단지 특정 위치에 주석을 달아주는 것입니다. 이 경우 annotate대신을 살펴보십시오 .


10
현재 버전 (1.20)에서는 작동하지 않는 것 같습니다!
Andrew Jaffe

1
상자 레이블과 같이 눈금 레이블이 이미 문자열로 설정되어 있으면 여전히 작동합니다. 이것은 명백 할 수도 있지만 대답의 첫 번째 줄은 최신 matplotlib 버전에서 작동하지 않는다는 것이므로 사용자는 완전히 건너 뛸 수 있습니다 (처음에 했음). 아마도 이것을 간단히 언급하십시오.
joelostblom

2
나는 당신이 plt.gca (). set_xticklabels (labels)
alexey

bold다른 사람들이 "light"의 fontweight를 사용하는 동안 "testing"의 fontweight를 원한다면 어떻게 될까요? 그것을 할 수있는 방법이 있습니까?
steven

1
jupyter 노트북에서 이것을 사용하는 사람들에게는 그것이 fig.canvas.draw()중요 하다는 점에서 이점을 얻을 수 있습니다.
wander95

96

pylabxticks 로도이 작업을 수행 할 수 있습니다

import matplotlib
import matplotlib.pyplot 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


이것은 간단한 솔루션이며 pyplot 1.5.1에서 작동합니다. 이것은 upvoted해야합니다.
wordsmith

질문이 이것을 요구하지는 않았지만이 예제를 사용하면 레이블을 수정하는 동시에 틱의 위치를 ​​설정할 수 있습니다.
eclark

현대의 matplotlib 문서에서 : "pylab은 더 이상 사용되지 않으며 네임 스페이스 오염으로 인해 사용하지 않는 것이 좋습니다. 대신 pyplot을 사용하십시오."
Nathaniel Jones

93

최신 버전에서 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()

그리고 결과 : 여기에 이미지 설명을 입력하십시오

그리고 지금 당신이 체크하면 _xticklabels, 그들은 더 이상 무리가 아닙니다'' .

>>> [item.get_text() for item in axes.get_xticklabels()]
['0.0', 'change', '1.0', '1.5', '2.0']

버전에서 1.1.1rc1현재 버전 까지 작동합니다 2.0.


고마워, 이것은 내가 찾고있는 대답입니다. 가장 깨끗한 솔루션 IMO; 단지 공급 set_xticklabels문자열과 진드기 개체의 혼합 목록.
Luke Davis

눈금 레이블이 int로 설정되면 플로트로 변경됩니다. 쉽게 해결할 수 있지만 주목할 가치가 있습니다.
ApproachingDarknessFish

이것은 효과가 ax.get_xticks().tolist()있었습니다 ( ). 가장 투표 된 솔루션은 ( ax.get_xtickslabels()) 하지 않았습니다 . 어쨌든 제안 된대로 plt.show()사용 했음에도 불구 하고 라벨을 추출 할 수 없었습니다 fig.canvas.draw().
CypherX

현대의 matplotlib 문서 에서 참고 : "pylab은 더 이상 사용되지 않으며 네임 스페이스 오염으로 인해 사용을 권장하지 않습니다. 대신 pyplot을 사용하십시오."
Nathaniel Jones

17

이 질문을한지 오래되었습니다. 오늘 ( 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()

정규 분포에서 임의의 값을 가진 히스토그램

경고! x틱의 값이며 pos축에서 순서대로 상대 위치입니다. 인덱싱 할 때 평소가 아닌로 pos시작 하는 값을 사용 합니다.10


필자의 경우 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()

정규 분포에서 임의의 값을 가진 히스토그램

이 경우 xmax100 %에 해당하는 데이터 값입니다. 백분율은로 계산되므로이 x / xmax * 100점을 수정해야 xmax=1.0합니다. 또한 decimals점 다음에 소수점 이하 자릿수입니다.


12

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)

위의 예제가 왜 작동하지 않는지 여전히 연구 중입니다.


3
그러나 단일 레이블 만 변경하고 싶습니다. 위의 트릭에서는 모든 눈금 레이블을 추출하고 원하는 레이블을 새 값으로 설정해야합니다. 그러나 label.get_text ()가 아무것도 반환하지 않을 때 눈금 레이블을 추출하려면 어떻게해야합니까?
repoman

11

이것은 작동합니다 :

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)

피드


7

이것은 matplotlib 3에서도 작동합니다.

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

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

5

당신이 작동하지 않는 경우 fig그리고 ax당신은 모든 레이블을 수정하려면 (예를 들어 정상화를위한) 당신은이 작업을 수행 할 수 있습니다

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

1

이 시도 :

  fig,axis = plt.subplots(nrows=1,ncols=1,figsize=(13,6),sharex=True)
  axis.set_xticklabels(['0', 'testing', '10000', '20000', '30000'],fontsize=22)

-4

넌 할 수있어:

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

draw()

누군가이 대답이 왜 그렇게 다운 다운되었는지 설명 할 수 있습니까?
Hlynur Davíð Hlynsson

@ HlynurDavíðHlynsson 나는 그것이 실제로 질문과 관련이 없다고 생각합니다. 글쎄요, 아마도 약간의 편집이있을 것입니다 ... 질문과 관련이 있다면 편집하십시오. ;)
loved.by.Jesus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.