在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')
803354 次浏览

pyplot.setp试试。我认为你可以这样做:

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

我想到了一个类似的例子。同样,旋转关键字是..这是关键。

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

简单的方法

就像这里描述一样,在matplotlib.pyplot figure类中有一个现有的方法,它可以自动为你的图适当地旋转日期。

你可以在绘制数据之后调用它(例如__abc0:

fig.autofmt_xdate()

如果您需要进一步格式化标签,请签出上面的链接。

Non-datetime对象

根据languitar的注释,我为非datetime xticks建议的方法在缩放时不能正确更新,等等。如果它不是用作x轴数据的datetime对象,则应该遵循汤米< em > < / em >的答案:

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

我的回答受到了cjohnson318的回答的启发,但我不想提供一个硬编码的标签列表;我想旋转现有的标签:

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

这对我来说很管用:

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

直升机从

plt.xticks(rotation=90)

这也是可能的:

plt.xticks(rotation='vertical')

如果使用plt:

plt.xticks(rotation=90)

如果使用熊猫或海运来绘图,假设ax作为绘图的坐标轴:

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

做上述事情的另一种方式:

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

这取决于你画的是什么。

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)

对于pandas和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来做到这一点。

如果你想在坐标轴对象上应用旋转,最简单的方法是使用tick_params。为例。

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

Matplotlib文档引用在这里

当你有一个由plt.subplots返回的轴数组时,这很有用,而且它比使用set_xticks更方便,因为在这种情况下,你还需要设置刻度标签,而且比那些迭代刻度的标签更方便(原因很明显)。

许多“correct"这里有答案,但我要再补充一个,因为我认为一些细节被遗漏了。OP要求90度旋转,但我将改为45度,因为当你使用一个不是0或90度的角度时,你也应该改变水平对齐;否则你的标签会偏离中心,有点误导(我猜很多来这里的人都想把轴旋转到90度以外的地方)。

最简单/最少的代码

选项1

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

如前所述,如果您更愿意采用面向对象的方法,这可能是不可取的。

选项2

另一种快速方法(它适用于日期对象,但似乎适用于任何标签;但我不建议你这么做):

fig.autofmt_xdate(rotation=45)

fig你通常会从:

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

面向对象/直接处理ax

选项3

如果你有标签列表:

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

在Matplotlib(3.5+)的后续版本中,你可以只使用set_xticks:

ax.set_xticks([1, 2, 3], labels, rotation=45, ha='right')

选项3 b

如果你想从当前图中获取标签列表:

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

如上所述,在Matplotlib(3.5+)的后续版本中,你可以只使用set_xticks:

ax.set_xticks(ax.get_xticks(), 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)

<强>编辑: 有关于这个确切的“bug”的讨论;但修复尚未发布(截至3.4.0): https://github.com/matplotlib/matplotlib/issues/13774 < / p >

将x轴标签旋转90度

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

最简单的解决方法是:

plt.xticks(rotation=XX)

但也

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

例如,对于日期,我使用旋转=45和底部=0.20,但你可以对你的数据做一些测试