Matplotlib使子图轴的大小相同 - imshow和plot

时间:2018-01-14 21:31:07

标签: python matplotlib

我正在尝试制作一些xyz数据。我需要使用色彩图显示数据的不同区域,以及旁边的图中的集成区域。这是我的示例代码:

import matplotlib.pyplot as plt
import numpy as np

#Generate some arbitrary xyz data
def gauss(x, y, mx, my, sx, sy):
    return np.exp(-(x-mx)**2/(2*sx**2))*np.exp(-(y-my)**2/(2*sy**2))

xmin, xmax, ymin, ymax = 0.97, 1.04, 2.60, 3.05
x, y = np.meshgrid(np.linspace(xmin, xmax, 1000), np.linspace(ymin, ymax, 1000))
data = gauss(x, y, 1, 3, 0.01, 0.01) + gauss(x, y, 1, 2.7, 0.01, 0.01)

#Plot the data
fig = plt.figure()
ax1 = fig.add_subplot(121)
ax1.imshow(data, extent=[xmin, xmax, ymin, ymax], origin="lower")
ax2 = fig.add_subplot(122)
ax2.plot(np.sum(data, axis=1),y[:,0])
ax2.set_ylim(ax1.get_ylim())
ax2.set_yticklabels([])

plt.show()

这段代码产生了一个很好的数字:

Fig. 1

现在我想专注于具有显着z值的两个区域。为此,我将两个子图分成四个子图,顶行聚焦在顶峰上,底行聚焦在底峰上。使用相同的数据,这是代码:

#Plot the data
fig = plt.figure(figsize=(4,10))
ax1 = fig.add_subplot(221)
ax1.imshow(data, extent=[xmin, xmax, ymin, ymax], origin="lower")
ax1.set_ylim([2.60, 2.75])

ax2 = fig.add_subplot(222)
ax2.plot(np.sum(data, axis=1),y[:,0])
ax2.set_ylim(ax1.get_ylim())
ax2.set_yticklabels([])

ax3 = fig.add_subplot(223)
ax3.imshow(data, extent=[xmin, xmax, ymin, ymax], origin="lower")
ax3.set_ylim([2.95, 3.05])

ax2 = fig.add_subplot(224)
ax2.plot(np.sum(data, axis=1),y[:,0])
ax2.set_ylim(ax3.get_ylim())
ax2.set_yticklabels([])

产生的数字具有彼此不对齐的轴:

Fig. 2

我想要的是左边的两个子图有x轴相匹配,右边的两个子图有相同大小的x轴,在这两行中我想要的是右侧的曲线与左侧的相应图像具有相同的y轴大小。我还想保持左边的图的宽高比相等,这排除了讨论的可能解决方案here

我可以调整窗口的大小以满足其中一些条件,但是我永远无法让右边的图形的y轴保持与左边图像相同的大小。我已尝试使用GridSpecsubplot2grid,并使用左侧图像子图中的相应Bbox边界手动生成右侧的轴,但这些方法都给我相同的问题。我还尝试在创建轴时使用sharedxsharedy选项,而它似乎使左侧图像的y轴与右侧图形的y轴相匹配它是通过放大图像来实现的,这不是我想要的。

我使用Inkscape做了一个我想要的例子:Fig. 3

编辑:

有人建议我尝试使用set_aspect来调整右侧图的方面,以便y轴的大小与左侧的大小相同,但这不起作用:

asp = np.diff(ax2.get_xlim())[0]/np.diff(ax2.get_ylim())[0]
ax2.set_aspect(asp)

虽然这似乎可以防止子图大于左侧的子图,但它不会使轴的大小相同。再次调整窗口大小时,我现在可以使右上角的子图与左上角的子图相同,但是左上角和左下角的x轴不匹配。

0 个答案:

没有答案