Python 绝对比例相等但限制不同的Pyplot子地块

Python 绝对比例相等但限制不同的Pyplot子地块,python,matplotlib,subplot,Python,Matplotlib,Subplot,我不确定我的措辞是否正确,但我正在尝试创建一个包含两个子地块的图形,其中两个地块有不同的限制,但它们的大小使得物理比例(例如,每厘米图形高度的y距离)相同。为了澄清,假设子地块1显示了-3到3的数据,子地块2显示了-1到1的数据。我想让它们彼此位于下方,这样子地块2的高度(不包括记号,只是帧内的所有东西)正好是子地块1的三分之一 我的尝试如下: from matplotlib import gridspec from matplotlib import pyplot as plt import

我不确定我的措辞是否正确,但我正在尝试创建一个包含两个子地块的图形,其中两个地块有不同的限制,但它们的大小使得物理比例(例如,每厘米图形高度的y距离)相同。为了澄清,假设子地块1显示了-3到3的数据,子地块2显示了-1到1的数据。我想让它们彼此位于下方,这样子地块2的高度(不包括记号,只是帧内的所有东西)正好是子地块1的三分之一

我的尝试如下:

from matplotlib import gridspec
from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(0,2, 101)
y1 = 3*np.cos(x*np.pi)
y2 = np.cos(x*np.pi)

fig = plt.figure(figsize=(4, 6)) 
gs = gridspec.GridSpec(8, 1)
ax1 = plt.subplot(gs[0:6,0])
ax1.plot(x, y1, c='orange')
ax1.set_ylim(-3, 3)
ax1.set_xticks([], [])
ax2 = plt.subplot(gs[6:,0])
ax2.plot(x, y2, c='green')
ax2.set_ylim(-1,1)
ax2.set_xticks([0, 1, 2])
ax2.set_xticklabels([r'0', r'0.5', r'1'])
ax2.set_xlabel(r'$n_g$ (2e)')
plt.tight_layout()
fig.text(-0.025, 0.5, 'Frequency (GHz)', ha='center', va='center', rotation='vertical', size=18)
这产生了下图,但正如您所看到的(尽管您必须仔细观察),第二个子图中的范围-1到1被压缩(占用的高度小于子图1中的范围-1到1)。我猜这是因为两个子地块之间的空间

请注意,我使用gridspec是因为我计划添加另一列具有有趣的纵横比及其自己的标签和限制的子图。如果有人想知道,我不知道如何以更优雅的方式添加全局ylabel


您可以设置gridspec的
高度比
,以匹配限制范围

from matplotlib import gridspec
from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(0,2, 101)
y1 = 3*np.cos(x*np.pi)
y2 = np.cos(x*np.pi)

ylim1 = -3,3
ylim2 = -1,1

fig = plt.figure(figsize=(4, 6), constrained_layout=True) 
gs = gridspec.GridSpec(2, 1, height_ratios=[np.diff(ylim1)[0], 
                                            np.diff(ylim2)[0]], figure=fig)
ax1 = plt.subplot(gs[0,0])
ax1.plot(x, y1, c='orange')
ax1.set_ylim(ylim1)
ax1.set_xticks([], [])

ax2 = plt.subplot(gs[1,0])
ax2.plot(x, y2, c='green')
ax2.set_ylim(ylim2)
ax2.set_xticks([0, 1, 2])
ax2.set_xticklabels([r'0', r'0.5', r'1'])
ax2.set_xlabel(r'$n_g$ (2e)')

plt.show()

它是否需要是动态的(即,如果放大任一子地块,它占据的图形部分会发生变化)?@Leporello它不需要是动态的!