0

我正在尝试生成一个matplotlib具有特定纵横比、2 个 x 轴和 2 个具有不同比例的 y 轴以及重新格式化的刻度标签的图形,如下图所示:

在此处输入图像描述

matplotlib我得到尽可能

x_power_min = -2
x_power_max =  3
y_power_min = -5
y_power_max =  2
fig_ratio = 1.2

fig, axy = plt.subplots()

axy.set(xscale='log', xlim=[10**x_power_min,10**x_power_max], xlabel='X1')
axy.set(yscale='log', ylim=[10**y_power_min,10**y_power_max], ylabel='Y1')

axy.set_aspect(float(x_power_max-x_power_min) / float(y_power_max-y_power_min) * fig_ratio)

axy.xaxis.set_major_formatter(matplotlib.ticker.FuncFormatter(lambda x, pos: '{:0d}'.format(int(math.log10(x)))))
axy.yaxis.set_major_formatter(matplotlib.ticker.FuncFormatter(lambda y, pos: '{:0d}'.format(int(math.log10(y)))))

这给了我

在此处输入图像描述

但是当我引入额外的轴时,我得到一个错误:ValueError: math domain error - dL_width = math.log10(dL.x1) - math.log10(dL.x0)所以我只能通过注释掉这一set_aspect行来继续

fig, axy = plt.subplots()
ay2 = axy.twinx()
ax2 = axy.twiny()

axy.set(xscale='log', xlim=[10**x_power_min,10**x_power_max], xlabel='X1')
axy.set(yscale='log', ylim=[10**y_power_min,10**y_power_max], ylabel='Y1')
ay2.set(yscale='log', ylim=[317.83*10**y_power_min,317.83*10**y_power_max], ylabel='Y2')
ax2.set(xscale='log', xlim=[10**(3*x_power_min/2.0),10**(3*x_power_max/2.0)], xlabel='X2')

#axy.set_aspect(float(x_power_max-x_power_min) / float(y_power_max-y_power_min) * fig_ratio)

axy.xaxis.set_major_formatter(matplotlib.ticker.FuncFormatter(lambda x, pos: '{:0d}'.format(int(math.log10(x)))))
axy.yaxis.set_major_formatter(matplotlib.ticker.FuncFormatter(lambda y, pos: '{:0d}'.format(int(math.log10(y)))))
ay2.yaxis.set_major_formatter(matplotlib.ticker.FuncFormatter(lambda y, pos: '{:0d}'.format(int(math.log10(y)))))
ax2.xaxis.set_major_formatter(matplotlib.ticker.FuncFormatter(lambda x, pos: '{:0d}'.format(int(math.log10(x)))))

这会导致图形的纵横比错误:

在此处输入图像描述

4

1 回答 1

1

aspect设置沿 x 轴的一个单位的轴空间长度与沿 y 轴的一个单位的长度之比。这对于对数刻度没有意义,因为它们是非线性的,并且比率取决于您沿轴查看的位置。

你想用它fig.set_size_inches来制作你想要的纵横比。

于 2013-12-20T20:01:44.287 回答