python matplotlib에서 축 텍스트 회전


313

X 축에서 텍스트를 회전시키는 방법을 알 수 없습니다. 타임 스탬프이므로 샘플 수가 증가함에 따라 겹칠 때까지 점점 가까워집니다. 샘플이 서로 가까워 질수록 텍스트가 겹치지 않도록 텍스트를 90도 회전하고 싶습니다.

아래는 내가 가지고있는 것입니다 .X 축 텍스트를 회전시키는 방법을 알 수 없다는 점을 제외하고는 잘 작동합니다.

import sys

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import datetime

font = {'family' : 'normal',
        'weight' : 'bold',
        'size'   : 8}

matplotlib.rc('font', **font)

values = open('stats.csv', 'r').readlines()

time = [datetime.datetime.fromtimestamp(float(i.split(',')[0].strip())) for i in values[1:]]
delay = [float(i.split(',')[1].strip()) for i in values[1:]]

plt.plot(time, delay)
plt.grid(b='on')

plt.savefig('test.png')

3
회전 된 레이블을 (수평 정렬) 에 맞추는 데 대한 중요한 내용은 이 답변 을 참조하십시오.ha
LondonRob

답변:


510

이것은 나를 위해 작동합니다 :

plt.xticks(rotation=90)

8
다른 사람이 mpld3을 사용하고 있으며 이러한 솔루션 중 어느 것도 작동하지 않는 것에 좌절합니다. mpld3에서는 회전이 지원 되지 않습니다 .
beetree

4
이를 그림 / 창 안에 유지하기위한 추가 포인트. 광산은 반 밖에 있습니다.
Gauthier

1
플로팅 이것을 호출하십시오 . 첫째 즉, ax.plot(...)다음plt.xticks(rotation=90)
CGFoX

161

쉬운 방법

여기설명 된 것처럼 matplotlib.pyplot figure클래스 에는 기존 날짜가 적절하게 자동으로 회전하는 그림이 있습니다.

데이터를 플로팅 한 후 호출 할 수 있습니다 (예 ax.plot(dates,ydata):

fig.autofmt_xdate()

라벨을 추가로 포맷해야하는 경우 위의 링크를 확인하십시오.

날짜 이외의 객체

languitar 의 코멘트, I가 제시 한 방법 비는-날짜는 xticks등, 줌 때이 아니라면 제대로 업데이트되지 것입니다 datetime귀하의 x 축 데이터로 사용되는 객체가 수행해야 할, 토미 의 답을 ' :

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

3
이 방법은 간결하고 기존의 자동 생성 틱에서 작동하며 읽기 가능하도록 플롯 여백을 조정하기 때문에 가장 좋은 방법입니다. 다른 방법을 사용하면 틱이 페이지를 벗어나도록 조정할 수 있으므로 추가 조치 (예 : plt.tight_layouts ())를 조정해야합니다.
EL_DON

로케이터와 포맷터를 사용한 경우 나중에 "기타"방법을 적용하면 효과가 손상 될 수 있습니다.
languitar

73

여기에 많은 "올바른"답변이 있지만 몇 가지 세부 사항이 몇 가지로 남아 있다고 생각하므로 하나 더 추가하겠습니다. OP는 90도 회전을 요청했지만 0 또는 90이 아닌 각도를 사용할 때 수평 정렬도 변경해야하기 때문에 45 도로 변경합니다. 그렇지 않으면 라벨이 중심을 벗어나고 약간 오도 될 것입니다 (그리고 여기에 오는 많은 사람들이 축을 90 이외의 것으로 회전시키고 싶어합니다).

가장 쉬운 코드

옵션 1

plt.xticks(rotation=45, ha='right')

앞에서 언급했듯이 객체 지향 접근 방식을 사용하려는 경우 바람직하지 않을 수 있습니다.

옵션 2

또 다른 빠른 방법 (날짜 개체를 대상으로하지만 모든 레이블에서 작동하는 것 같습니다.

fig.autofmt_xdate(rotation=45)

fig 당신은 보통 다음에서 얻을 것입니다 :

  • fig = plt.figure()
  • fig, ax = plt.subplots()
  • fig = ax.figure

객체 지향 / 직접 다루기 ax

옵션 3a

라벨 목록이있는 경우 :

labels = ['One', 'Two', 'Three']
ax.set_xticklabels(labels, rotation=45, ha='right')

옵션 3b

현재 플롯에서 레이블 목록을 얻으려면 다음을 수행하십시오.

# Unfortunately you need to draw your figure first to assign the labels,
# otherwise get_xticklabels() will return empty strings.
plt.draw()
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha='right')

옵션 4

위와 비슷하지만 대신 수동으로 반복하십시오.

for label in ax.get_xticklabels():
  label.set_rotation(45)
  label.set_ha('right')

옵션 5

우리는 여전히 pyplot( plt)를 사용 하지만 특정 ax객체 의 속성을 변경하기 때문에 객체 지향적 입니다.

plt.setp(ax.get_xticklabels(), rotation=45, ha='right')

옵션 6

이 옵션은 간단하지만 AFAIK에서는이 방법으로 레이블을 수평 정렬 할 수 없으므로 각도가 90이 아닌 경우 다른 옵션이 더 나을 수 있습니다.

ax.tick_params(axis='x', labelrotation=45)

편집 : 이 정확한 "버그"에 대한 토론이 있으며 수정 사항은 잠재적으로 예정되어 있습니다 v3.2.0: https://github.com/matplotlib/matplotlib/issues/13774


65

pyplot.setp를 사용해보십시오. 나는 당신이 이런 식으로 할 수 있다고 생각합니다.

x = range(len(time))
plt.xticks(x,  time)
locs, labels = plt.xticks()
plt.setp(labels, rotation=90)
plt.plot(x, delay)

2
Traceback (most recent call last): File "plotter.py", line 23, in <module> plt.setp(time, rotation=90) File "/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py", line 183, in setp ret = _setp(*args, **kwargs) File "/usr/lib64/python2.7/site-packages/matplotlib/artist.py", line 1199, in setp func = getattr(o, funcName) AttributeError: 'datetime.datetime' object has no attribute 'set_rotation'
tMC

한 걸음 앞서 놓친 것 같습니다. 편집 된 예가 도움이됩니까? 나는 matplotlib 전문가와는 거리가 멀지 만 더 나은 방법이있을 수 있습니다.
opiethehokie

1
이것은 전혀 작동하지 않는 것 같습니다-내 컴퓨터의 이미지가 완전히 엉망이됩니다. 출력 이미지 전체에 검은 선이 있습니다. 거의 바코드처럼 보입니다. 매우 이상합니다.
tMC 2016 년

이것이 어떤 버전의 matplotlib입니까? 1.2.0에서는 setp(subplot(111).get_xticklabels(), rotation=90)Qt4Agg 백엔드에서 잘 작동합니다. 내 경우에는로 재설정 plt.hist()되므로 나중에 호출하지만 plt.plot()재설정하지는 않으므로 확인해야합니다.
drevicko 2013

1
@tMC mpl 1.2.0을 사용하면 코드를 더미 데이터와 함께 복사 하고 locs, labels = plt.xticks() plt.setp(labels, rotation=90)바로 추가 plt.plot(time, delay)했으며 정상적으로 작동했습니다.
drevicko 2013


49

비슷한 예를 생각해 냈습니다. 다시 한번 로테이션 키워드는 핵심입니다.

from pylab import *
fig = figure()
ax = fig.add_subplot(111)
ax.bar( [0,1,2], [1,3,5] )
ax.set_xticks( [ 0.5, 1.5, 2.5 ] )
ax.set_xticklabels( ['tom','dick','harry'], rotation=45 ) ;

이것은 작동하는 것처럼 보이지만 타임 스탬프가 아닌 datetime
신기원

32

내 답변은 cjohnson318의 답변에서 영감을 얻었지만 하드 코딩 된 레이블 목록을 제공하고 싶지 않았습니다. 기존 레이블을 회전하고 싶었습니다.

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

2
이것은 더 이상 작동하지 않는 것 같습니다. 아무 효과가 없습니다.
zbyszek

31

사용하는 경우 plt:

plt.xticks(rotation=90)

플롯의 ax축으로 가정하여 팬더 또는 seaborn을 사용 하여 플롯하는 경우 :

ax.set_xticklabels(ax.get_xticklabels(), rotation=90)

위의 다른 방법 :

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

이러한 모든 방법은 이미 다른 답변에 나와 있습니다. 이 답변은 여기에 무엇입니까?
ImportanceOfBeingErnest

@ImportanceOfBeingErnest 플로팅을 위해 직접 panplotlib가 아닌 팬더 또는 seaborn을 사용하는 사람들을 돕습니다.
Manavalan Gajapathy

for tick in ax.get_xticklabels(): tick.set_rotation(45)나를 위해 트릭을했다.
AP

30

axes 객체에 회전을 적용하려면 가장 쉬운 방법은을 사용하는 것 tick_params입니다. 예를 들어.

ax.tick_params(axis='x', labelrotation=90)

Matplotlib 문서 참조 here .

이것은로 반환 된 축 배열이있을 때 유용하며 plt.subplots, set_xticks이 경우 눈금 레이블을 설정해야하고 눈금 위에 반복되는 눈금이 더 편리하기 때문에 사용하는 것보다 편리합니다 (명백한 이유로)


1
또한이 솔루션은 좌표축 객체도 반환하므로 팬더 데이터 프레임의 플롯 함수에서도 작동합니다. 여기를 확인 하십시오 . 매우 편리한 기능. pd_dataframe.plot().tick_params(axis='x', labelrotation=90).
metinsenturk

이것의 유일한 문제는와 같은 것을 사용하는 경우 레이블을 가로로 올바르게 정렬하는 방법을 알 수 없다는 것 labelrotation=30입니다.
getup8


3

무엇을 플로팅하고 있는지에 따라 다릅니다.

import matplotlib.pyplot as plt

 x=['long_text_for_a_label_a',
    'long_text_for_a_label_b',
    'long_text_for_a_label_c']
y=[1,2,3]
myplot = plt.plot(x,y)
for item in myplot.axes.get_xticklabels():
    item.set_rotation(90)

팬더와 seaborn의 경우 Axes 객체를 제공합니다.

df = pd.DataFrame(x,y)
#pandas
myplot = df.plot.bar()
#seaborn 
myplotsns =sns.barplot(y='0',  x=df.index, data=df)
# you can get xticklabels without .axes cause the object are already a 
# isntance of it
for item in myplot.get_xticklabels():
    item.set_rotation(90)

레이블을 회전해야하는 경우 글꼴 크기도 변경해야 할 수도 있습니다 font_scale=1.0.


2

x 축 레이블을 90도 회전하려면

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

답변이 얼마나 짧은 지 좋아하지만 게시 한 내용이 유효한 Python 코드가 아닙니다. 유효한 파이썬 코드로 해석하는 방법이 명확하지 않습니다.
데이브 C

1

가장 간단한 해결책은 다음을 사용하는 것입니다.

plt.xticks(rotation=XX)

뿐만 아니라

# Tweak spacing to prevent clipping of tick-labels
plt.subplots_adjust(bottom=X.XX)

예를 들어 날짜의 경우 rotation = 45 및 bottom = 0.20을 사용했지만 데이터를 테스트 할 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.