matplotlib刻度标签锚点-右对齐刻度标签(在右侧轴上)并将刻度标签的左(西)侧"剪切"到轴

mwkjh3gx  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(318)

我想在twinx(右侧)坐标轴的刻度标签上使用“西”锚。例如,看下面的图,我想刻度标签的左侧与右侧坐标轴对齐。
我尝试了下面的几件事,但都无济于事。

import matplotlib.pyplot as plt
X = [1,2,3]
fig, ax = plt.subplots()
ax.plot(X)
ax.set_ylim([1,3])
ax.set_yticks(X)
axR = ax.twinx()
axR.set_ylim(ax.get_ylim())
axR.set_yticks(ax.get_yticks())
axR.set_yticklabels(['-1.00', '2.00', '3.00'], ha='right')
# axR.set_yticklabels(['-1.00', '2.00', '3.00'], ha='right', bbox_to_anchor='W')
# axR.set_yticklabels(['-1.00', '2.00', '3.00'], ha='right', bbox=dict(bbox_to_anchor='W'))
# bbox can have args from: https://matplotlib.org/stable/api/_as_gen/matplotlib.patches.FancyBboxPatch.html#matplotlib.patches.FancyBboxPatch
fig.show()

ff29svar

ff29svar1#

所以我遇到了同样的问题,偶然发现了这个问题。我尝试了相当多,我基本上决定我将需要找到标签的右侧,当它们在右侧左对齐时,然后从这一点右对齐它们。
我尝试了几种方法,但经验不足,所以并不完美,但似乎可以通过bbox找到坐标。我来回转换,得到一个数组(可能是一个更短的方法,我不知道)。然后我把最大的一个差距,并把它添加到间距。
注意事项:我在子图上执行此操作,因此使用ax2。我还使用ax2.yaxis.tick_right()将轴刻度标签移动到右侧

r = plt.gcf().canvas.get_renderer()
coord = ax2.yaxis.get_tightbbox(r)

ytickcoord = [yticks.get_window_extent() for yticks in ax2.get_yticklabels()]

inv = ax2.transData.inverted()

ytickdata = [inv.transform(a) for a in ytickcoord]
ytickdatadisplay = [ax2.transData.transform(a) for a in ytickdata]
                
gap = [a[1][0]-a[0][0] for a in ytickdatadisplay]

for tick in ax2.yaxis.get_majorticklabels():
    tick.set_horizontalalignment("right")

ax2.yaxis.set_tick_params(pad=max(gap)+1)}

更新:我最近收到了一个类似问题的解决方案,左侧左对齐。从这个解决方案,我相信这可以简化为:

import matplotlib as mpl
import matplotlib.pyplot as plt

fig = plt.figure(figsize =(5,3))
ax = fig.add_axes([0,0,1,1])
plt.plot([0,100,200])
ax.yaxis.tick_right()

# Draw plot to have current tick label positions
plt.draw()
# Read max width of tick labels
ytickcoord = max([yticks.get_window_extent(renderer = plt.gcf().canvas.get_renderer()).width for yticks in ax.get_yticklabels()])
# Change ticks to right aligned
ax.axes.set_yticklabels(ax.yaxis.get_majorticklabels(),ha = "right")
# Add max width of tick labels
ax.yaxis.set_tick_params(pad=ytickcoord+1)

plt.show()
plt.close("all")

相关问题