是否有一种简单可靠的方法来确定axes
其方面设置'auto'
为何时的当前宽高比?
要检查的显而易见的事情是ax.get_aspect()
,但这只是回归'auto'
.我可以将它设置为任意常量值ax.set_aspect(aspect)
,之后返回相同的常量ax.get_aspect()
.默认情况下(非常有用)我们有aspect = 'auto'
,在这种情况下,自动计算和调整宽高比以匹配数据限制和轴大小.
如何获得自动选择的数字宽高比?
为了澄清,这既不是返回的数据限制ax.get_data_ratio()
的宽高比,也不是由(图中)返回的图形或子图的显示尺寸的宽高比fig.get_figheight() / fig.get_figwidth()
.它有点微妙,因为它取决于显示尺寸和数据限制.(这可能导致混淆不同的比率,以及我认为让它易于访问很重要的原因.)
从文档中,纵横比是x轴和y轴中数据到显示比例单位的比率.即,如果在y方向上每个显示器有10个数据单元,在x方向上每个显示单元有1个数据单元,则该比率为1/10.圆圈的宽度比它高10倍.这对应于num
以下方面的声明:
将拉伸圆圈,使得高度是宽度的num倍.aspect = 1与aspect ='equal'相同.
基于您所看到的相同原始代码(matplotlib.axes._base.adjust_aspect
从1405行开始),我认为只要您只需要线性笛卡尔坐标轴的这个比率,我们就可以得到一个简化的公式.极点和对数轴的事情变得复杂,所以我会忽略它们.
重申公式:
(x_data_unit / x_display_unit) / (y_data_unit / y_display_unit)
这恰好与
(y_display_unit / x_display_unit) / (y_data_unit / x_data_unit)
最后一个公式只是两个方向上的显示尺寸除以x和y限制的比率.请注意,ax.get_data_ratio
不不,因为返回的实际数据边界,而不是在所有的轴限的结果适用于这里:
from operator import sub def get_aspect(ax): # Total figure size figW, figH = ax.get_figure().get_size_inches() # Axis size on figure _, _, w, h = ax.get_position().bounds # Ratio of display units disp_ratio = (figH * h) / (figW * w) # Ratio of data units # Negative over negative because of the order of subtraction data_ratio = sub(*ax.get_ylim()) / sub(*ax.get_xlim()) return disp_ratio / data_ratio
现在让我们测试一下:
from matplotlib import pyplot as plt fig, ax = plt.subplots() ax.set_aspect('equal') print('{} == {}'.format(ax.get_aspect(), get_aspect(ax))) ax.set_aspect(10) print('{} == {}'.format(ax.get_aspect(), get_aspect(ax)))