在python matplotlib中旋转轴文本

tMC*_*tMC 261 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')
Run Code Online (Sandbox Code Playgroud)

sco*_*tle 431

这对我有用:

plt.xticks(rotation=90)
Run Code Online (Sandbox Code Playgroud)

  • 如今,“ax.tick_params(axis='x', labelrotation=90)”是强烈首选。 (7认同)
  • 添加 plt.tight_layout() 让它们留在图形内 (6认同)
  • 万一其他人正在使用mpld3,并且对这些解决方案都无法使用而感到沮丧。mpld3不支持旋转。 (5认同)
  • 将此称为*之后*绘图。即,首先 `ax.plot(...)` 然后 `plt.xticks(rotation=90)` (4认同)
  • 使这些停留在图形/窗口中的额外点。我的一半在外面。 (3认同)
  • 刚刚想通了。使用 [`plt.sca(ax) `](https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.sca) 激活轴,并使用这个答案。 (2认同)

rya*_*lon 139

简单的方法

如此处所述,类中存在一种现有方法,matplotlib.pyplot figure可以根据您的需要自动旋转日期.

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

fig.autofmt_xdate()
Run Code Online (Sandbox Code Playgroud)

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

非日期时间对象

根据languitar的评论,我建议用于非日期时间的方法xticks在缩放等时不会正确更新.如果它不是datetime用作x轴数据的对象,你应该按照Tommy的回答:

for tick in ax.get_xticklabels():
    tick.set_rotation(45)
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的方法,因为它简洁,它在现有的自动生成的刻度上运行,并调整绘图边距以使其可读.其他方法让标记离开页面,需要进一步操作(例如plt.tight_layouts())来调整它们. (2认同)

opi*_*kie 63

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

x = range(len(time))
plt.xticks(x,  time)
locs, labels = plt.xticks()
plt.setp(labels, rotation=90)
plt.plot(x, delay)
Run Code Online (Sandbox Code Playgroud)

  • `Traceback(最近一次调用最后一次):文件"plotter.py",第23行,在<module> plt.setp(time,rotation = 90)文件"/usr/lib64/python2.7/site-packages/matplotlib/ pyplot.py",第183行,在setp ret = _setp(*args,**kwargs)文件"/usr/lib64/python2.7/site-packages/matplotlib/artist.py",第1199行,在setp func中= getattr(o,funcName)AttributeError:'datetime.datetime'对象没有属性'set_rotation'` (2认同)

小智 48

公寓从

plt.xticks(rotation=90)
Run Code Online (Sandbox Code Playgroud)

这也是可能的:

plt.xticks(rotation='vertical')
Run Code Online (Sandbox Code Playgroud)


cjo*_*318 44

我想出了一个类似的例子.同样,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 ) ;
Run Code Online (Sandbox Code Playgroud)


Tom*_*mmy 31

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

for tick in ax.get_xticklabels():
    tick.set_rotation(45)
Run Code Online (Sandbox Code Playgroud)

  • 这似乎不再起作用。没有任何影响。 (2认同)

Man*_*thy 27

如果使用plt:

plt.xticks(rotation=90)
Run Code Online (Sandbox Code Playgroud)

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

ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
Run Code Online (Sandbox Code Playgroud)

另一种做法如上:

for tick in ax.get_xticklabels():
    tick.set_rotation(45)
Run Code Online (Sandbox Code Playgroud)


kir*_*ril 24

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

ax.tick_params(axis='x', labelrotation=90)
Run Code Online (Sandbox Code Playgroud)

Matplotlib文档参考此处.

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


get*_*up8 24

这里有许多“正确”的答案,但由于我认为一些细节中遗漏了一些,因此我将再添加一个。OP要求旋转90度,但我将更改为45度,因为当您使用非零或90度的角度时,还应该更改水平对齐方式;否则,您的标签将偏离中心并产生误导性(我猜很多来过这里的人都想将轴旋转到90以外的位置)。

最简单/最少的代码

选项1

plt.xticks(rotation=45, ha='right')
Run Code Online (Sandbox Code Playgroud)

如前所述,如果您宁愿采用面向对象的方法,那可能也不是所希望的。

选项2

另一种快速方法(该方法适用于日期对象,但似乎可以在任何标签上使用;不过建议不要这样做):

fig.autofmt_xdate(rotation=45)
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)

选项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')
Run Code Online (Sandbox Code Playgroud)

选项4

与上述类似,但手动循环。

for label in ax.get_xticklabels():
  label.set_rotation(45)
  label.set_ha('right')
Run Code Online (Sandbox Code Playgroud)

选项5

我们仍在此处使用pyplot(as plt),但是它是面向对象的,因为我们正在更改特定ax对象的属性。

plt.setp(ax.get_xticklabels(), rotation=45, ha='right')
Run Code Online (Sandbox Code Playgroud)

选项6

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

ax.tick_params(axis='x', labelrotation=45)
Run Code Online (Sandbox Code Playgroud)

编辑: 这里有关于这个确切的“错误”的讨论,并且可能会针对v3.2.0以下问题进行修复:https : //github.com/matplotlib/matplotlib/issues/13774


小智 11

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

plt.xticks(rotation=XX)
Run Code Online (Sandbox Code Playgroud)

但是也

# Tweak spacing to prevent clipping of tick-labels
plt.subplots_adjust(bottom=X.XX)
Run Code Online (Sandbox Code Playgroud)

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


Ish*_*mar 8

import pylab as pl
pl.xticks(rotation = 90)
Run Code Online (Sandbox Code Playgroud)