在python matplotlib中旋转轴文本

时间:2012-06-12 14:20:34

标签: 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')

12 个答案:

答案 0 :(得分:326)

这对我有用:

plt.xticks(rotation=90)

答案 1 :(得分:127)

简单方法

作为described herematplotlib.pyplot figure类中存在一种现有方法,可以根据您的需要自动轮换日期。

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

fig.autofmt_xdate()

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

非日期时间对象

根据 languitar 的评论,我建议用于非日期时间xticks的方法在缩放等时不会正确更新。如果不是datetime使用的对象作为您的x轴数据,您应该遵循Tommy's answer

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

答案 2 :(得分:60)

尝试pyplot.setp。我想你可以这样做:

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

答案 3 :(得分:44)

来自

的公寓
plt.xticks(rotation=90)

这也是可能的:

plt.xticks(rotation='vertical')

答案 4 :(得分:41)

我想出了一个类似的例子。同样,rotation关键字是..好吧,它是关键。

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

答案 5 :(得分:30)

我的答案受到了cjohnson318答案的启发,但我并不想提供硬编码的标签清单;我想旋转现有的标签:

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

答案 6 :(得分:18)

如果使用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)

答案 7 :(得分:15)

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

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

Matplotlib文档参考here

当您有plt.subplots返回的轴数组时,这很有用,并且比使用set_xticks更方便,因为在这种情况下,您还需要设置刻度标签,并且还要设置方便地进行那些遍历刻度的操作(出于明显的原因)

答案 8 :(得分:8)

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

答案 9 :(得分: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来执行此操作。

答案 10 :(得分:0)

这里有许多“正确”的答案,但我会再添加一个,因为我认为一些细节中没有列出。 OP要求旋转90度,但我将更改为45度,因为当您使用非零或90度的角度时,还应该更改水平对齐方式;否则,您的标签将偏离中心并产生误导性(我想很多来这里的人都想将轴旋转到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

答案 11 :(得分:0)

要将x轴标签旋转到90度 对于ax.get_xticklabels()中的刻度:     tick.set_rotation(45)