检查下图的x轴。如何将标签向左移动一点,使它们与各自的刻度对齐?
我正在使用以下方式旋转标签:
ax.set_xticks(xlabels_positions)
ax.set_xticklabels(xlabels, rotation=45)
但是,正如您所看到的,旋转位于文本标签的中间。这使它看起来像是向右移动了。
我尝试过使用它:
ax.set_xticklabels(xlabels, rotation=45, rotation_mode="anchor")
......但它不符合我的意愿。并且"anchor"
似乎是rotation_mode
参数允许的唯一值。
答案 0 :(得分:163)
您可以设置ticklabels的水平对齐方式,请参阅下面的示例。如果你想象一个旋转标签周围的矩形框,你想要与标记点对齐矩形的哪一边?
根据您的描述,您需要:ha ='right'
n=5
x = np.arange(n)
y = np.sin(np.linspace(-3,3,n))
xlabels = ['Ticklabel %i' % i for i in range(n)]
fig, axs = plt.subplots(1,3, figsize=(12,3))
ha = ['right', 'center', 'left']
for n, ax in enumerate(axs):
ax.plot(x,y, 'o-')
ax.set_title(ha[n])
ax.set_xticks(x)
ax.set_xticklabels(xlabels, rotation=40, ha=ha[n])
答案 1 :(得分:8)
旋转标签肯定是可能的。请注意,这样做会降低文本的可读性。另一种方法是使用如下代码替换标签位置:
import numpy as np
n=5
x = np.arange(n)
y = np.sin(np.linspace(-3,3,n))
xlabels = ['Long ticklabel %i' % i for i in range(n)]
fig, ax = plt.subplots()
ax.plot(x,y, 'o-')
ax.set_xticks(x)
labels = ax.set_xticklabels(xlabels)
for i, label in enumerate(labels):
label.set_y(label.get_position()[1] - (i % 2) * 0.075)
有关更多背景和替代方案,请参阅this post on my blog
答案 2 :(得分:6)
虽然接受的答案 (ha='right'
) 在某种程度上改善了对齐,但它实际上并没有将标签与刻度对齐(参见左子图)。
需要额外的 ScaledTranslation
才能真正将旋转的标签与刻度对齐(见右子图):
这是因为 matplotlib 将刻度线与标签的边界框的右边缘对齐,而不是最右边字符的中线。
要移除此偏移量,请按照 ScaledTranslation
中的说明应用 how to move a tick's label in matplotlib,例如:
x = xticks = np.arange(10)
xticklabels = (f'xticklabel {tick}' for tick in xticks)
fig, ax = plt.subplots()
ax.bar(x, x - 4.5)
ax.set_xticks(xticks)
ax.set_xticklabels(xticklabels, rotation=70, ha='right')
# create offset transform (x=5pt)
from matplotlib.transforms import ScaledTranslation
dx, dy = 5, 0
offset = ScaledTranslation(dx/fig.dpi, dy/fig.dpi, scale_trans=fig.dpi_scale_trans)
# apply offset transform to all xticklabels
for label in ax.xaxis.get_majorticklabels():
label.set_transform(label.get_transform() + offset)
答案 3 :(得分:4)
一个简单,无循环的替代方法是使用horizontalalignment
Text属性作为xticks
[1]的关键字参数。在下面的注释行中,我强制xticks
对齐为"对"。
n=5
x = np.arange(n)
y = np.sin(np.linspace(-3,3,n))
xlabels = ['Long ticklabel %i' % i for i in range(n)]
fig, ax = plt.subplots()
ax.plot(x,y, 'o-')
plt.xticks(
[0,1,2,3,4],
["this label extends way past the figure's left boundary",
"bad motorfinger", "green", "in the age of octopus diplomacy", "x"],
rotation=45,
horizontalalignment="right") # here
plt.show()
(yticks
默认情况下已将右边缘与刻度线对齐,但对于xticks
,默认值似乎为" center&#34 ;.)
[1]如果您搜索短语"文字属性",您会发现xticks documentation中描述的内容。
答案 4 :(得分:4)
我显然迟到了,但有一个官方示例使用
plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor")
旋转标签,同时保持它们与刻度正确对齐,这既干净又容易。
见:https://matplotlib.org/stable/gallery/images_contours_and_fields/image_annotated_heatmap.html
答案 5 :(得分:1)
如果您不想修改xtick标签,则可以使用:
plt.xticks(rotation=45)