如何控制图中的子图位置

时间:2018-03-06 23:04:33

标签: python matplotlib

我使用from typing import * from inspect import signature TYPE_A = Callable[[int, int], int] TYPE_B = Callable[[int], int] def my_func(x: Union[TYPE_A, TYPE_B]): sig = signature(x) if len(sig.parameters.values()) == 1: x = cast(TYPE_B, x) x(1) else: x = cast(TYPE_A, x) x(1, 2) # Set your secret key: remember to change this to your live secret key in production # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = "sk_test_BQokikJOvBiI2HlWgH4olfQ2" subscription = stripe.Subscription.retrieve('sub_49ty4767H20z6a') stripe.Subscription.modify('sub_49ty4767H20z6a', items=[{ 'id': subscription['items']['data'][0].id, 'plan': 'plan_CBb6IXqvTLXp3f', }] ) 绘制多个数字,其中轴尺寸在数字之间变化。这是一个演示文稿,所以我希望图形最终与图形边缘左对齐(因此左轴在每张幻灯片上落在同一点上)。相反,会发生的是轴在imshow分配的空间内居中。这是一个例子:

aspect='equal'

example figure, narrow grid

example figure, medium grid

example figure, wide grid

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

1 个答案:

答案 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()
    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绘制图形,让轴自行重新缩放,然后再次设置轴位置等,使得它最终会在{{1位置。

x=0.1

请注意,这会重绘大约50倍左右。因此,根据所需的准确性,可以选择稍大的条件,例如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() 左右。

两种方法都会产生以下图片。

enter image description here
enter image description here
enter image description here