Python 如何控制图中的子批次位置

Python 如何控制图中的子批次位置,python,matplotlib,Python,Matplotlib,我正在使用imshow和aspect='equal'绘制多个图形,其中图形之间的轴尺寸不同。这是为了演示,所以我希望图形最终与图形边缘左对齐(这样左轴在每张幻灯片上落在同一点上)。相反,所发生的情况是轴在子地块\u adjust分配的空间内居中。下面是一个例子: import numpy as np import matplotlib.pyplot as plt for width in [7, 10, 13]: data = np.random.rand(10 * width).re

我正在使用
imshow
aspect='equal'
绘制多个图形,其中图形之间的轴尺寸不同。这是为了演示,所以我希望图形最终与图形边缘左对齐(这样左轴在每张幻灯片上落在同一点上)。相反,所发生的情况是轴在
子地块\u adjust
分配的空间内居中。下面是一个例子:

import numpy as np
import matplotlib.pyplot as plt

for width in [7, 10, 13]:
    data = np.random.rand(10 * width).reshape(10, width)
    fig, ax = plt.subplots(figsize=(3, 2))
    fig.subplots_adjust(left=0.1, right=0.9, bottom=0.2, top=0.8)
    ax.imshow(data)
    ax.set_title('10 × {}'.format(width))
    fig.savefig('10_rows_x_{}_columns.png'.format(width), facecolor='0.7',
                edgecolor='none')


如何使所有三个轴的y轴与每个图形的左边缘保持相同的距离?

由于图像的固定方向,轴的大小会发生变化,因此会重新定位,使其位于图形的中心,即使子地块参数指定了更大的空间

缩小可用空间 您可以绘制图形,使轴的位置固定,获得轴的实际宽度,并将“右”子批次参数设置为“左”和“宽度”的总和

import numpy as np
import matplotlib.pyplot as plt

for width in [7, 10, 13]:
    data = np.random.rand(10 * width).reshape(10, width)
    fig, ax = plt.subplots(figsize=(6, 4))
    fig.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9)
    ax.imshow(data)
    ax.set_title(u'10 × {}'.format(width))
    
    fig.canvas.draw()
    pos=ax.get_position()
    fig.subplots_adjust(right=0.1+pos.width)
    
    fig.savefig('10_rows_x_{}_columns.png'.format(width), facecolor='0.7',
                edgecolor='none')
plt.show()
迭代变换位置 一种方法是迭代地将轴的左位置设置为
0.1
绘制图形,让轴自身重新缩放,然后再次设置轴的位置等。这样它将均匀地结束在
x=0.1
位置

import numpy as np
import matplotlib.pyplot as plt

for width in [7, 10, 13]:
    data = np.random.rand(10 * width).reshape(10, width)
    fig, ax = plt.subplots(figsize=(6, 4))
    fig.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9)
    ax.imshow(data)
    ax.set_title(u'10 × {}'.format(width))
    fig.canvas.draw()
    while ax.get_position().x0 > 0.1:
        pos=ax.get_position()
        pos.x0=0.1
        ax.set_position(pos)
        fig.canvas.draw()
    fig.savefig('10_rows_x_{}_columns.png'.format(width), facecolor='0.7',
                edgecolor='none')
plt.show()
请注意,这会将图形重绘约50次。因此,根据所需的精度,可以选择稍大的条件,例如
而ax.get_position().x0>0.105:
等等

两种方法的结果如下图




您是否需要在所有情况下都具有相同的体形尺寸,还是可以选择更改体形宽度以使图像在彼此下方对齐?@ImportanceOfBeingErnest理想情况下,在所有情况下都具有相同的体形尺寸,但我可以处理通过编程更改体形宽度的情况。谢谢!虽然我认为你的第一句话可以改进;重新定位并不是严格地由于相等的纵横比——任何硬编码的纵横比(即除
aspect='auto'
以外的任何东西)都会发生这种情况,而不仅仅是一对一的纵横比。您可以自己编辑这些小东西。我用一个更简单的解决方案更新了答案。