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

回答:


512

これは私にとってはうまくいきます:

plt.xticks(rotation=90)

8
他の誰かがmpld3を使用していて、これらのソリューションがどれも機能しないことに不満を感じている場合。回転はmpld3 ではサポートされていません
beetree 2018

4
これらをフィギュア/ウィンドウ内に留めるための追加ポイント。鉱山は半分外にあります。
Gauthier、

1
プロット後にこれ呼び出します。ax.plot(...)plt.xticks(rotation=90)
つまり

161

簡単な方法

ここで説明し、内の既存の方法があるmatplotlib.pyplot figure自動的に数字のために適切な日付を回転させることをクラス。

データをプロットした後で呼び出すことができます(つまりax.plot(dates,ydata)

fig.autofmt_xdate()

さらにラベルをフォーマットする必要がある場合は、上記のリンクを確認してください。

非日時オブジェクト

あたりとしてlanguitarのコメント、非日時がために、私は提案された方法xticksなどのズーミング時に正しく更新されないだろう、それがない場合はdatetime、あなたのx軸データとして使用するオブジェクト、あなたが従うべきトミーの答え」を

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

3
これは簡潔で、既存の自動的に生成されたティックに作用し、読みやすいようにプロットマージンを調整するため、これが最良の方法です。他のメソッドでは、目盛りをページから外すことができるため、目盛りを調整するための追加のアクション(plt.tight_layouts()など)が必要です。
EL_DON 2016

ロケーターとフォーマッターを使用した場合、後で適用すると、「その他」の方法で効果が失われる可能性があります。
languitar 2017

73

ここでは「正しい」答えがたくさんありますが、いくつかの詳細は省略されていると思うので、もう1つ追加します。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

ここでもpyplotplt)を使用していますが、特定のaxオブジェクトのプロパティを変更しているため、オブジェクト指向です。

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

オプション6

このオプションは単純ですが、私の知る限り、ラベルの水平方向の配置をこのように設定することはできないため、角度が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

これは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

54

アパートから

plt.xticks(rotation=90)

これも可能です:

plt.xticks(rotation='vertical')

うまく
いき

plt.xticks(rotation=45) plt.savefig(nomefile,dpi=150, optimize=True) plt.clf()
Roberto Marzocchi

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 2016年

31

使用する場合plt

plt.xticks(rotation=90)

プロットのax軸として、パンダまたはシーボーンを使用してプロットする場合:

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

上記を行う別の方法:

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

これらの方法はすべて、他の回答ですでに示されています。ここに追加するこの答えは何ですか?
ImportanceOfBeingErnest

@ImportanceOfBeingErnestこれは、プロットのために直接matplotlibではなく、パンダまたはシーボーンを使用するユーザーを支援することを目的としています。
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ドキュメントのリファレンスはこちら

これはplt.subplots、によって返される軸の配列がある場合に便利です。set_xticksその場合、目盛りラベルも設定する必要があるため、使用するよりも便利です。また、目盛りを反復するもの(明らかな理由により)も便利です。


1
これに加えて、このソリューションはAxesオブジェクトも返すため、pandasデータフレームのプロット関数でも機能します。こちらをチェックしてください。かなり便利な機能。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)

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コードではありません。それを有効な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.