matplotlib-具有固定纵横比的子块

2024-05-19 11:03:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我在绘制多个子块时遇到问题。我想将子块的物理纵横比设置为固定值。 在我的示例中,在一个横向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)

Tags: default图形示例get宽度高度物理绘制
3条回答

实际上,你想要的很简单。。。您只需要确保轴上的adjustable设置为'box',并且轴的纵横比是设置好的(除了'auto'之外的任何轴)。

创建子块时,可以使用adjustablekwarg来完成此操作。或者,您可以在它们创建后通过调用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

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

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

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

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

(半对数图的改编现在应该很明显了)

相关问题 更多 >

    热门问题