在python matplotlib中旋转轴文本
我不知道如何在X轴上旋转文本。这是一个时间戳,所以随着样本数量的增加,它们越来越近,直到重叠。我想将文本旋转90度,这样当样本靠近时,它们就不会重叠 下面是我所拥有的,它可以正常工作,但我不知道如何旋转X轴文本在python matplotlib中旋转轴文本,python,matplotlib,Python,Matplotlib,我不知道如何在X轴上旋转文本。这是一个时间戳,所以随着样本数量的增加,它们越来越近,直到重叠。我想将文本旋转90度,这样当样本靠近时,它们就不会重叠 下面是我所拥有的,它可以正常工作,但我不知道如何旋转X轴文本 import sys import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import datetime font = {'family' : 'normal', 'weigh
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')
请尝试pyplot.setp。我想你可以这样做:
x = range(len(time))
plt.xticks(x, time)
locs, labels = plt.xticks()
plt.setp(labels, rotation=90)
plt.plot(x, delay)
我提出了一个类似的例子。同样,旋转关键字是。。嗯,这是关键
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 ) ;
简易方法 同样,在
matplotlib.pyplot
figure
类中有一个现有的方法,可以自动为您的figure适当地旋转日期
您可以在绘制数据后调用它(即ax.plot(dates,ydata)
:
如果需要进一步格式化标签,请签出上面的链接
非日期时间对象
根据Langitar的评论,我为非日期时间xticks
建议的方法在缩放等时不会正确更新。如果它不是用作x轴数据的datetime
对象,您应该遵循:
我的答案受CJOhnson 318答案的启发,但我不想提供标签的硬编码列表;我想旋转现有标签:
for tick in ax.get_xticklabels():
tick.set_rotation(45)
这对我很有用:
plt.xticks(rotation=90)
公寓
plt.xticks(rotation=90)
这也是可能的:
plt.xticks(rotation='vertical')
如果使用
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)
这将取决于你在策划什么
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)
对于提供Axis对象的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\u scale=1.0
来执行此操作。如果要在轴对象上应用旋转,最简单的方法是使用勾选参数
ax.tick_params(axis='x', labelrotation=90)
Matplotlib文档参考
当您有一个由plt.subplot
返回的轴数组时,这很有用,并且比使用set_xticks
更方便,因为在这种情况下,您还需要设置记号标签,并且比那些在记号上迭代的轴(出于明显的原因)更方便答案在这里,但我会补充一个,因为我认为一些细节被遗漏了。OP要求90度旋转,但我会改为45度,因为当你使用的角度不是零或90度时,你也应该改变水平对齐;否则你的标签会偏离中心,有点误导(我猜很多来这里的人都想把轴旋转到90以外的位置)
最简单/最少代码
选择1
plt.xticks(旋转=45,ha='right')
如前所述,如果您更愿意采用面向对象的方法,那么这可能是不可取的
选择2
另一种快捷方式(适用于日期对象,但似乎适用于任何标签;不过,我怀疑这是推荐的):
fig.autofmtxdate(旋转=45)
fig
您通常会从以下位置获得:
fig=plt.gcf()
fig=plt.figure()
fig,ax=plt.subplot()
fig=ax.图
面向对象/直接处理ax
备选案文3a
如果您有标签列表:
labels=['One','Two','Three']
ax.setxticklabels(标签,旋转=45,ha='right')
备选方案3b
如果要从当前打印中获取标签列表,请执行以下操作:
#不幸的是,您需要先绘制图形来分配标签,
#否则,getxticklabels()将返回空字符串。
plt.draw()
ax.setxticklabels(ax.getxticklabels(),rotation=45,ha='right')
选择4
与上面类似,但改为手动循环
ax.getxticklabels()中标签的:
标签。设置旋转(45)
label.set_ha('右')
备选案文5
我们在这里仍然使用pyplot
(作为plt
),但它是面向对象的,因为我们正在更改特定ax
对象的属性
plt.setp(ax.getxticklabels(),旋转=45,ha='right')
备选案文6
此选项很简单,但您不能以这种方式设置标签水平对齐,因此如果角度不是90,则另一个选项可能更好
ax.勾选参数(轴=x',标签旋转=45)
编辑:
有人讨论过这个“错误”,但尚未发布修复程序(从3.4.0
):
将x轴标签旋转90度
ax.getxticklabels()中的勾号的
:
勾选。设置旋转(45)
最简单的解决方案是使用:
plt.xticks(rotation=XX)
而且
# Tweak spacing to prevent clipping of tick-labels
plt.subplots_adjust(bottom=X.XX)
e、 g对于日期,我使用了rotation=45,bottom=0.20,但您可以对数据进行一些测试(最近一次调用是最后一次):文件“plotter.py”,第23行,在plt.setp(time,rotation=90)文件/usr/lib64/python2.7/site packages/matplotlib/pyplot.py中,setp ret=\u setp(*args,**kwargs)文件第183行“/usr/lib64/python2.7/site packages/matplotlib/artist.py”,第1199行,setp func=getattr(o,funcName)AttributeError:'datetime.datetime'对象没有属性'set\u rotation'我想我错过了前面的一步。编辑的示例有用吗?虽然我远不是matplotlib专家,但可能有更好的方法。这似乎根本不起作用-图像(在我的机器上)完全搞砸了。输出图像上到处都是黑线…几乎看起来像条形码。这很奇怪。这是哪个版本的matplotlib?在1.2.0中,
setp(子批(111)。getxticklabels(),rotation=90)
在Qt4Agg后端工作正常。在我的例子中,它通过plt.hist()重置
,所以我在之后调用它,尽管plt.plot()
没有重置它,所以您应该可以。@tMC使用mpl 1.2.0,我复制了您的代码(带有一些虚拟数据),添加了locs,labels=plt.xticks()
ax.tick_params(axis='x', labelrotation=90)
plt.xticks(rotation=XX)
# Tweak spacing to prevent clipping of tick-labels
plt.subplots_adjust(bottom=X.XX)