Programing

python matplotlib에서 축 텍스트 회전

lottogame 2020. 4. 6. 07:58
반응형

python matplotlib에서 축 텍스트 회전


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

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

plt.xticks(rotation=90)

쉬운 방법

여기설명 된 것처럼 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)

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

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

에서 아파트

plt.xticks(rotation=90)

이것은 또한 가능하다 :

plt.xticks(rotation='vertical')

비슷한 예를 생각해 냈습니다. 다시 말하지만 회전 키워드는 중요합니다.

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

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

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

사용하는 경우 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)

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

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

Matplotlib 설명서 참조 here .

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


여기에 많은 "올바른"답변이 있지만 몇 가지 세부 사항이 몇 가지로 남아 있다고 생각하므로 하나 더 추가하겠습니다. 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


import pylab as pl
pl.xticks(rotation = 90)

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

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.


ax.get_xticklabels ()에서 눈금에 대해 x 축 레이블을 90 도로 회전 시키려면 : tick.set_rotation (45)

참고 URL : https://stackoverflow.com/questions/10998621/rotate-axis-text-in-python-matplotlib

반응형