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)
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)
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)
小智 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)
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以外的位置)。
plt.xticks(rotation=45, ha='right')
Run Code Online (Sandbox Code Playgroud)
如前所述,如果您宁愿采用面向对象的方法,那可能也不是所希望的。
另一种快速方法(该方法适用于日期对象,但似乎可以在任何标签上使用;不过建议不要这样做):
fig.autofmt_xdate(rotation=45)
Run Code Online (Sandbox Code Playgroud)
fig 您通常可以从:
fig = plt.figure()fig, ax = plt.subplots()fig = ax.figureax如果您有标签列表:
labels = ['One', 'Two', 'Three']
ax.set_xticklabels(labels, rotation=45, ha='right')
Run Code Online (Sandbox Code Playgroud)
如果要从当前图中获取标签列表:
# 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)
与上述类似,但手动循环。
for label in ax.get_xticklabels():
label.set_rotation(45)
label.set_ha('right')
Run Code Online (Sandbox Code Playgroud)
我们仍在此处使用pyplot(as plt),但是它是面向对象的,因为我们正在更改特定ax对象的属性。
plt.setp(ax.get_xticklabels(), rotation=45, ha='right')
Run Code Online (Sandbox Code Playgroud)
此选项很简单,但是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 但你可以对你的数据做一些测试