此问题已在此处有答案:
Aligning rotated xticklabels with their respective xticks(6个答案)
8个月前关闭。
如何在matplotlib中旋转xticklabels,使每个xticklabel之间的间距相等?
例如,使用以下代码:
import matplotlib.pyplot as plt
import numpy as np
# Data + parameters
fontsize = 20
t = np.arange(0.0, 6.0, 1)
xticklabels = ['Full', 'token emb', 'char emb', 'char LSTM',
'token LSTM', 'feed forward','ANN']
# Plotting
fig = plt.figure(1)
ax = fig.add_subplot(111)
plt.plot(t, t)
plt.xticks(range(0, len(t) + 1))
ax.tick_params(axis='both', which='major', labelsize=fontsize)
ax.set_xticklabels(xticklabels, rotation = 45)
fig.savefig('test_rotation.png', dpi=300, format='png', bbox_inches='tight')
本人获得:
每个xticklabel之间的间距不相等。例如,“Full”和“token emb”之间的间隔比“feed forward”和“ANN”之间的间隔大得多。
我在Windows 7 SP1 x64 Ultimate上使用Matplotlib 2.0.0和Python 3.5 64位。
3条答案
按热度按时间7gs2gvoe1#
标签在刻度线位置居中。它们的边界框宽度不等,甚至可能重叠,这使得它们看起来不相等。
由于您总是希望刻度标签链接到它们的刻度线,因此更改间距并不是一个真正的选择。
但是,您可能希望将它们对齐,以便右上角作为它们在刻度下方的位置参考。
使用
horizontalalignment
或ha
参数,并将其设置为"right"
:这导致以下图:
另一种方法是保持ticklabel水平居中,但也可以垂直居中。这导致相等的间距,但需要进一步调整它们相对于轴线的垂直位置。
如果像问题中那样手动指定刻度,则可以使用上述方法(例如通过
plt.xticks
或通过ax.set_xticks
)或如果使用分类图。如果自动显示标签,则不应使用
set_xticklabels
。这通常会使标签和刻度位置变得不同步,因为set_xticklabels
将轴的格式化器设置为FixedFormatter
,而定位器保持自动AutoLocator
或任何其他自动定位器。在这些情况下,可以使用
plt.setp
设置现有标注的旋转和对齐方式,或在它们上循环以设置相应的属性,
举个例子
5rgfhyps2#
这里有一个很好的资源,提供了几个选项。他们并不完美,但基本上还行:
https://www.pythoncharts.com/2019/05/17/rotating-axis-labels/
更新:
我查看了
matplotlib.text.Text.set_rotation_mode
的文档(链接):因此,如果未指定
rotation_mode
,文本将首先旋转,然后对齐。在此模式下,即使使用ha="right"
,边界框也不完全位于文本的右上角。如果为
rotation_mode="anchor"
,则文本将直接绕锚点旋转(ha="right"
)。下面是一个例子(改编自这里的代码)
图现在具有正确的对齐方式:
kb5ga3dv3#
如果旋转Angular 是~45度,那么Ernest的
ha='right
和gbinux的rotation_mode='anchor'
是很棒的:**然而,这对于其他旋转Angular 不起作用,**例如70度(见左侧子图)。
如果旋转Angular 不是~45度,则将
ha='right'
与**ScaledTranslation
**组合(见右侧子图)。按照how to move a tick's label中的说明应用**
ScaledTranslation
**: