首页 文章

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

提问于
浏览
21

我在绘制多个子图时遇到问题 . 我想将子图的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)

3 回答

  • 4

    实际上,你想要的是非常简单的...你只需要确保 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()
    

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


    初始情节
    alt text

    调整为垂直布局:
    alt text

    调整为水平布局:
    alt text

  • 16

    您的解决方法适合我 . 绘制数据后,我调用以下函数:

    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')
    
  • 2

    在回复关于原始问题编辑中不适用于对数图的解决方案的评论时 - 您需要调整如下:

    def fixed_aspect_ratio_loglog(ratio):
        '''
        Set a fixed aspect ratio on matplotlib loglog plots 
        regardless of axis units
        '''
        xvals,yvals = gca().axes.get_xlim(),gca().axes.get_ylim()
    
        xrange = log(xvals[1])-log(xvals[0])
        yrange = log(yvals[1])-log(yvals[0])
        gca().set_aspect(ratio*(xrange/yrange), adjustable='box')
    

    (半融合地块的适应现在应该是显而易见的)

相关问题