下面是我所拥有的,除了我无法弄清楚之外,它可以正常工作了解如何旋转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')
#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
评论
有关将旋转标签与ha(水平对齐)对齐的重要内容,请参见此答案。