Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python matplotlib中旋转轴文本_Python_Matplotlib - Fatal编程技术网

在python matplotlib中旋转轴文本

在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

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

请尝试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)