如何在 matplotlib 中旋转 xticklabels 以使每个 xticklabel 之间的间距相等?
问题:如何在 matplotlib 中旋转 xticklabels 以使每个 xticklabel 之间的间距相等? 如何在 matplotlib 中旋转 xticklabels 以使每个 xticklabel 之间的间距相等? 例如,使用此代码: import matplotlib.pyplot as plt import numpy as np # Data + parameters font
问题:如何在 matplotlib 中旋转 xticklabels 以使每个 xticklabel 之间的间距相等?
如何在 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 位。
解答
标签以刻度线位置为中心。它们的边界框宽度不等,甚至可能重叠,这使得它们看起来不等间距。
由于您总是希望刻度标签链接到它们的刻度标记,因此更改间距并不是一个真正的选择。
但是,您可能希望将它们对齐,以便右上角是它们在刻度下方定位的参考。
为此使用horizontalalignment
或ha
参数并将其设置为"right"
:
ax.set_xticklabels(xticklabels, rotation = 45, ha="right")
这导致以下情节:
另一种方法是保持刻度标签水平居中,但也垂直居中。这导致相等的间距,但需要进一步调整它们相对于轴的垂直位置。
ax.set_xticklabels(xticklabels, rotation = 45, va="center", position=(0,-0.28))
如果在问题中手动指定刻度(例如通过plt.xticks
或通过ax.set_xticks
)或使用分类图,则可以使用上述方法。
如果改为自动显示标签,则不应使用set_xticklabels
。这通常会使标签和刻度位置不同步,因为set_xticklabels
将轴的格式化程序设置为FixedFormatter
,而定位器保持自动AutoLocator
或任何其他自动定位器。
在这些情况下,要么使用plt.setp
设置现有标签的旋转和对齐方式,
plt.setp(ax.get_xticklabels(), ha="right", rotation=45)
或循环它们以设置相应的属性,
for label in ax.get_xticklabels():
label.set_ha("right")
label.set_rotation(45)
一个例子是
import numpy as np; np.random.seed(42)
import matplotlib.pyplot as plt
t = np.arange("2018-01-01", "2018-03-01", dtype="datetime64[D]")
x = np.cumsum(np.random.randn(len(t)))
fig, ax = plt.subplots()
ax.plot(t, x)
for label in ax.get_xticklabels():
label.set_ha("right")
label.set_rotation(45)
plt.tight_layout()
plt.show()
更多推荐
所有评论(0)