我不知道如何在 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
对齐(水平对齐)的重要信息,请参阅 this answer
这对我有用:
plt.xticks(rotation=90)
这里有许多“正确”的答案,但我会再添加一个,因为我认为一些细节被遗漏了。 OP 要求旋转 90 度,但我将更改为 45 度,因为当您使用不为零或 90 度的角度时,您也应该更改水平对齐方式;否则你的标签会偏离中心并且有点误导(我猜很多来这里的人都想将轴旋转到 90 以外的位置)。
最简单/最少的代码
选项1
plt.xticks(rotation=45, ha='right')
如前所述,如果您宁愿采用面向对象的方法,这可能是不可取的。
选项 2
另一种快速方法(它适用于日期对象,但似乎适用于任何标签;但怀疑这是推荐的):
fig.autofmt_xdate(rotation=45)
fig
您通常会从:
无花果 = plt.gcf()
无花果 = plt.figure()
无花果,斧头 = plt.subplots()
fig = ax.figure
面向对象/直接处理ax
选项 3a
如果您有标签列表:
labels = ['One', 'Two', 'Three']
ax.set_xticks([1, 2, 3])
ax.set_xticklabels(labels, rotation=45, ha='right')
在更高版本的 Matplotlib (3.5+) 中,您可以单独使用 set_xticks
:
ax.set_xticks([1, 2, 3], 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_xticks(ax.get_xticks())
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha='right')
如上所述,在更高版本的 Matplotlib(3.5+)中,您可以只使用 set_xticks
单独:
ax.set_xticks(ax.get_xticks(), 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)
编辑:讨论了这个确切的“错误”,但尚未发布修复程序(截至 3.4.0
):https://github.com/matplotlib/matplotlib/issues/13774
fig = plt.gcf()
- 很好的答案顺便说一句,它对我帮助很大。
v3.4.0
中,令人讨厌。
简单的方法
与 described here 一样,matplotlib.pyplot
figure
类中有一个现有方法可以自动根据您的数字适当地轮换日期。
您可以在绘制数据后调用它(即ax.plot(dates,ydata)
:
fig.autofmt_xdate()
如果您需要进一步格式化标签,请查看上面的链接。
非日期时间对象
根据 languitar 的评论,我为非日期时间 xticks
建议的方法在缩放等时不会正确更新。如果它不是用作 x 轴数据的 datetime
对象,您应该遵循 Tommy's answer:
for tick in ax.get_xticklabels():
tick.set_rotation(45)
试试 pyplot.setp。我认为你可以这样做:
x = range(len(time))
plt.xticks(x, time)
locs, labels = plt.xticks()
plt.setp(labels, rotation=90)
plt.plot(x, delay)
Traceback (most recent call last): File "plotter.py", line 23, in <module> plt.setp(time, rotation=90) File "/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py", line 183, in setp ret = _setp(*args, **kwargs) File "/usr/lib64/python2.7/site-packages/matplotlib/artist.py", line 1199, in setp func = getattr(o, funcName) AttributeError: 'datetime.datetime' object has no attribute 'set_rotation'
setp(subplot(111).get_xticklabels(), rotation=90)
可以与 Qt4Agg 后端一起正常工作。在我的例子中,它被 plt.hist()
重置,所以我在之后调用它,虽然 plt.plot()
没有重置它,所以你应该没问题。
plt.plot(time, delay)
之前添加了 locs, labels = plt.xticks() plt.setp(labels, rotation=90)
,它工作正常。
来自
plt.xticks(rotation=90)
这也是可能的:
plt.xticks(rotation='vertical')
plt.xticks(rotation=45) plt.savefig(nomefile,dpi=150, optimize=True) plt.clf()
我想出了一个类似的例子。再一次,轮换关键字是……嗯,它是关键。
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
的时间戳
如果要对坐标区对象应用旋转,最简单的方法是使用 tick_params
。例如。
ax.tick_params(axis='x', labelrotation=90)
Matplotlib 文档参考 here。
当您有一个由 plt.subplots
返回的轴数组时,这很有用,并且比使用 set_xticks
更方便,因为在这种情况下,您还需要设置刻度标签,并且比那些遍历蜱虫(原因很明显)
pd_dataframe.plot().tick_params(axis='x', labelrotation=90)
。
labelrotation=30
之类的东西,我无法弄清楚如何正确水平对齐标签。
如果使用 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)
for tick in ax.get_xticklabels(): tick.set_rotation(45)
为我解决了问题。
plt.xticks(rotation=45)
无济于事
我的回答受到 cjohnson318 回答的启发,但我不想提供硬编码的标签列表;我想旋转现有的标签:
for tick in ax.get_xticklabels():
tick.set_rotation(45)
最简单的解决方案是使用:
plt.xticks(rotation=XX)
但是也
# Tweak spacing to prevent clipping of tick-labels
plt.subplots_adjust(bottom=X.XX)
例如,对于我使用 rotation=45 和 bottom=0.20 的日期,但您可以对您的数据进行一些测试
import pylab as pl
pl.xticks(rotation = 90)
将 x 轴标签旋转 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)
对于为您提供 Axes 对象的 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_scale=1.0
来执行此操作。
ax.plot(...)
然后plt.xticks(rotation=90)
plt.sca(ax)
激活轴,并使用此答案。