我遇到过许多帖子,例如this和this,它们都在讨论如何对齐刻度标签以避免重叠。实际上,第二个链接基本上正是我要执行的操作,即将第一个和最后一个刻度(在X和Y轴上)移动到绘图区域中。不幸的是,我遇到一些奇怪的行为,希望有人可以向我解释。
下面的代码生成3个数字(也如下所示)。第一个是带有1个子图的图形,所有操作均按预期进行。所有刻度线标签均居中对齐,但每个轴上的第一个和最后一个都已居中对齐,可以将其适当调整到绘图区域内。
图2具有垂直堆叠的2个子图。在该图中,水平轴具有正确对齐的刻度标签,但是在垂直轴上,当仅最后一个标签(10)应对齐“顶部”时,所有正标签(0-10)都已对齐“底部”。所有其他事物都应保持“居中”。
图3与图2类似,仅具有水平堆叠的子图。在这种情况下,就是水平横轴上的刻度标签没有正确对齐,而只有最后一个标签应对齐“右”时,所有标签都对齐了“左”。
任何线索为何在具有多个子图的图形上未正确设置刻度标签的对齐方式?我已经制作了这些图的多个版本,包括嵌入到Tkinter窗口(我的实际应用程序)中,并且每次都得到完全相同的结果。
编辑:我已经从我的实际应用程序中添加了绘图的屏幕截图,该应用程序是使用Tkinter制作的GUI。整个窗口大小为1024x768,使用2个图形制作图形,一个图形用于顶部图形(XY),一个图形用于两个底部图形(XZ和YZ)。该屏幕截图没有调整窗口大小。
import matplotlib.pyplot as plt
import matplotlib
def stylize_plot(ax=None, fig=None):
if ax is None:
ax = plt.gca()
if fig is None:
fig = plt.gcf()
ax.axis([-10, 10, -10, 10])
ax.grid(True)
fig.set_tight_layout(True)
ax.spines['left'].set_position('zero')
ax.spines['bottom'].set_position('zero')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
# Appears to be shifting all tick labels on positive horizontal axis for Figure with 2 subplots
xTick_objects = ax.xaxis.get_major_ticks()
xTick_objects[0].label1.set_horizontalalignment('left') # left align first tick
xTick_objects[-1].label1.set_horizontalalignment('right') # right align last tick
yTick_objects = ax.yaxis.get_major_ticks()
yTick_objects[0].label1.set_verticalalignment('bottom') # bottom align first tick
yTick_objects[-1].label1.set_verticalalignment('top') # top align last tick
ax.xaxis.set_major_formatter(matplotlib.ticker.FormatStrFormatter('%0.1f'))
ax.yaxis.set_major_formatter(matplotlib.ticker.FormatStrFormatter('%0.1f'))
if __name__ == '__main__':
fig = plt.figure()
ax = fig.add_subplot(111)
stylize_plot(ax=ax, fig=fig)
fig2 = plt.figure()
ax2 = fig2.add_subplot(211)
ax3 = fig2.add_subplot(212)
stylize_plot(ax=ax2, fig=fig2)
stylize_plot(ax=ax3, fig=fig2)
fig3 = plt.figure()
ax4 = fig3.add_subplot(121)
ax5 = fig3.add_subplot(122)
stylize_plot(ax=ax4, fig=fig3)
stylize_plot(ax=ax5, fig=fig3)
plt.show()