matplotlib - 具有固定宽高比的子图

Pet*_*ons 22 python matplotlib

我在绘制多个子图时遇到问题.我想将子图的PHYSICAL纵横比设置为固定值.在我的例子中,我在横向A4图上有12个子图(4行和3列).所有子图都很好地放在整个图上,对于所有子图,高度几乎等于宽度.

但是,如果我将图形的布局更改为纵向,则子图将垂直拉伸.而这正是应该发生的事情.我希望子图的高度和宽度与景观图相同.子图的纵横比是否可能保持不变?

彼得,先谢谢你

编辑:我找到了一个解决方法.但这只适用于非对数轴......

aspectratio=1.0
ratio_default=(ax.get_xlim()[1]-ax.get_xlim()[0])/(ax.get_ylim()[1]-ax.get_ylim()[0])
ax.set_aspect(ratio_default*aspectratio)
Run Code Online (Sandbox Code Playgroud)

Joe*_*ton 18

实际上,你想要的是非常简单的...你只需要确保在轴上adjustable设置'box',并且你有一个轴的设定纵横比(除了之外'auto').

您可以adjustable在创建子图时使用kwarg 执行此操作.或者,您可以在创建之后通过调用ax.set_adjustable('box')或通过调用ax.set_aspect(aspect, adjustable='box')(其中aspect是一个'equal'或多个数字)来执行此操作.

现在,无论图形如何调整大小,子图将保持相同的宽高比.

例如:

import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(2,1,1, adjustable='box', aspect=0.3)
ax2 = fig.add_subplot(2,1,2)

ax1.plot(range(10))
ax2.plot(range(10))

plt.show()
Run Code Online (Sandbox Code Playgroud)

现在,比较顶部子图响应调整大小的方式,以及底部子图响应的方式:


最初的情节 替代文字

调整为垂直布局: 替代文字

调整为水平布局: 替代文字

  • 嗨!感谢您的回复。不幸的是,这仅设置了子图的轴的纵横比。由于我的轴有许多不同的范围,因此必须为每个子图单独设置此宽高比。因此,我要做的是将子图的高度和宽度(而不仅仅是轴)设置为特定的纵横比。 (2认同)

wil*_*il3 6

你的解决方法对我有用。绘制数据后,我调用以下函数:

def fixed_aspect_ratio(ratio):
    '''
    Set a fixed aspect ratio on matplotlib plots 
    regardless of axis units
    '''
    xvals,yvals = gca().axes.get_xlim(),gca().axes.get_ylim()

    xrange = xvals[1]-xvals[0]
    yrange = yvals[1]-yvals[0]
    gca().set_aspect(ratio*(xrange/yrange), adjustable='box')
Run Code Online (Sandbox Code Playgroud)