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


评论

有关将旋转标签与ha(水平对齐)对齐的重要内容,请参见此答案。

#1 楼

这对我有用:

plt.xticks(rotation=90)


评论


万一其他人正在使用mpld3,并且对这些解决方案都无法使用而感到沮丧。 mpld3不支持旋转。

– Beetree
18-09-30在0:39

使这些停留在图形/窗口中的额外点。我的一半在外面。

–Gauthier
18-10-20在13:50

绘制后称此。即,首先是ax.plot(...),然后是plt.xticks(rotation = 90)

– CGFoX
20年3月1日,16:25

添加plt.tight_layout()以使其停留在图中

–astroflyer
20年8月5日,12:25

只是想通了。使用plt.sca(ax)激活轴,并使用此答案。

–queezz
20年8月7日在10:12

#2 楼

简单的方法

如此处所述,matplotlib.pyplot figure类中存在一个现有方法,该方法可以自动轮换显示适合您的数字。

绘制数据后即可调用它(即ax.plot(dates,ydata):链接。

非日期时间对象

根据languitar的评论,我为非日期时间xticks建议的方法在缩放等时无法正确更新。如果不是datetime对象用作您的x轴数据,您应该遵循汤米的答案:

fig.autofmt_xdate()


评论


这是最好的方法,因为它简洁明了,可以对现有的自动生成的刻度进行操作,并且可以调整绘图边距,以便于阅读。其他方法使刻度线离开页面,需要进一步的操作(例如plt.tight_layouts())来进行调整。

– EL_DON
2016年9月9日在21:05

如果您使用了定位符和格式化程序,则“ other”方法如果后来应用,可能会破坏其效果。

– Languitar
17年8月2日在12:10

#3 楼

这里有许多“正确”的答案,但由于我认为一些细节中遗漏了一些,因此我将再添加一个。 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进行修复: br />https://github.com/matplotlib/matplotlib/issues/13774

#4 楼

尝试pyplot.setp。我认为您可以执行以下操作:

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


评论


追溯(最近一次通话):<模块> plt.setp中文件“ plotter.py”,第23行(时间,旋转= 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”

–tMC
2012年6月12日14:38

我想我错过了一步。编辑后的示例有帮助吗?我离matplotlib专家还很远,可能会有更好的方法。

–opiethehokie
2012年6月12日14:55

这似乎根本不起作用-(在我的计算机上)图像完全混乱了。输出图像上遍布黑线...几乎看起来像条形码。这很奇怪。

–tMC
2012年6月12日18:18

这是哪个版本的matplotlib?在1.2.0中,setp(subplot(111).get_xticklabels(),rotation = 90)在Qt4Agg后端正常工作。就我而言,它会被plt.hist()重置,因此我会在之后调用它,尽管plt.plot()不会重置它,所以您应该没问题。

– drevicko
13年2月28日在23:19

@tMC在mpl 1.2.0中,我复制了您的代码(带有一些虚拟数据),添加了locs,labels = plt.xticks()plt.setp(labels,rotation = 90)就在plt.plot(time,delay)和工作正常。

– drevicko
13年2月28日在23:43

#5 楼

来自

plt.xticks(rotation=90)
的Appart

这也是可能的:

plt.xticks(rotation='vertical')


评论


可以,但是地块的高度有问题

– Roberto Marzocchi
20年5月8日在8:51

plt.xticks(旋转= 45)plt.savefig(nomefile,dpi = 150,optimize = True)plt.clf()

– Roberto Marzocchi
20年5月8日在8:55



#6 楼

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

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的时间戳

–tMC
2012年6月12日18:19

#7 楼

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

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


Matplotlib文档参考在这里。

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

评论


除此之外,该解决方案还适用于pandas数据框的plot函数,因为它也返回轴对象。在这里检查。非常方便的功能。 pd_dataframe.plot()。tick_params(axis ='x',labelrotation = 90)。

– metasenturk
19-2-25在15:57



唯一的问题是,如果使用诸如labelrotation = 30之类的方法,我将无法弄清楚如何正确地水平对齐标签。

– getup8
19年5月14日在22:02

#8 楼

如果使用plt

plt.xticks(rotation=90)


如果使用大熊猫或seaborn进行绘图,则假定ax作为绘图的轴:

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


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

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


评论


所有这些方法已在其他答案中显示。这个答案在这里添加了什么?

–重要性
18年5月30日在8:13

@ImportanceOfBeingErnest旨在帮助那些使用熊猫或海洋生物(而不是直接使用matplotlib)进行绘图的人。

– Manavalan Gajapathy
18年5月30日在14:58

对于ax.get_xticklabels()中的刻度:tick.set_rotation(45)对我有用。

– A.P.
19-10-7在20:32

#9 楼

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

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


评论


这似乎不再起作用。没有任何影响。

–zbyszek
16年1月24日在17:45

#10 楼

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


#11 楼

最简单的解决方案是:

45和bottom = 0.20,但您可以对数据进行一些测试

#12 楼

这取决于您要绘制的内容。

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)


对于熊猫和海生动物,它们会给您提供轴对象:

如果需要旋转标签,还可能需要更改字体大小,可以使用font_scale=1.0来实现。

#13 楼

要将x轴标签旋转90度

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


评论


我喜欢您的答案有多短,但是您发布的内容无效的Python代码。我不清楚如何将其解释为有效的python代码。

–戴夫C
20 Mar 27 '20 at 19:47