431

我不知道如何在 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')
4

13 回答 13

700

这对我有用:

plt.xticks(rotation=90)
于 2016-06-08T16:36:15.803 回答
228

这里有许多“正确”的答案,但我会再添加一个,因为我认为一些细节被遗漏了。OP 要求旋转 90 度,但我将更改为 45 度,因为当您使用不为零或 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

选项 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(as plt),但它是面向对象的,因为我们正在更改特定ax对象的属性。

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

选项 6

这个选项很简单,但是 AFAIK 你不能以这种方式设置标签水平对齐,所以如果你的角度不是 90,另一个选项可能会更好。

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

编辑: 讨论了这个确切的“错误”,但尚未发布修复程序(截至3.4.0): https ://github.com/matplotlib/matplotlib/issues/13774

于 2019-05-14T22:59:20.060 回答
201

简单的方法

如此处所述matplotlib.pyplot figure,该类中有一个现有方法可以为您的身材自动旋转适当的日期。

您可以在绘制数据后调用它(即ax.plot(dates,ydata)

fig.autofmt_xdate()

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

非日期时间对象

根据languitar的评论,我为 non-datetime 建议的方法xticks在缩放等时不会正确更新。如果它不是datetime用作 x 轴数据的对象,您应该遵循Tommy的回答

for tick in ax.get_xticklabels():
    tick.set_rotation(45)
于 2014-04-11T10:04:49.417 回答
67

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

x = range(len(time))
plt.xticks(x,  time)
locs, labels = plt.xticks()
plt.setp(labels, rotation=90)
plt.plot(x, delay)
于 2012-06-12T14:34:35.537 回答
57

来自

plt.xticks(rotation=90)

这也是可能的:

plt.xticks(rotation='vertical')
于 2017-09-01T09:38:23.920 回答
52

我想出了一个类似的例子。再一次,轮换关键字是……嗯,它是关键。

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 ) ;
于 2012-06-12T14:48:56.823 回答
43

如果要在轴对象上应用旋转,最简单的方法是使用tick_params. 例如。

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

Matplotlib 文档参考这里

这在您有一个由plt.subplots.set_xticks

于 2019-01-24T18:23:26.520 回答
36

如果使用plt

plt.xticks(rotation=90)

如果使用 pandas 或 seaborn 进行绘图,假设ax作为绘图的轴:

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

执行上述操作的另一种方法:

for tick in ax.get_xticklabels():
    tick.set_rotation(45)
于 2018-03-20T03:09:05.353 回答
32

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

for tick in ax.get_xticklabels():
    tick.set_rotation(45)
于 2015-09-09T11:45:41.137 回答
12

最简单的解决方案是使用:

plt.xticks(rotation=XX)

但是也

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

例如,对于我使用 rotation=45 和 bottom=0.20 的日期,但您可以对您的数据进行一些测试

于 2020-05-08T09:03:24.770 回答
8
import pylab as pl
pl.xticks(rotation = 90)
于 2016-11-23T17:15:37.110 回答
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 对象的 pandas 和 seaborn:

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来执行此操作。

于 2018-05-23T23:00:21.900 回答
3

将 x 轴标签旋转 90 度

for tick in ax.get_xticklabels():
    tick.set_rotation(45)
于 2019-07-10T11:37:23.080 回答