我正在尝试制作一些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()
这段代码产生了一个很好的数字:
现在我想专注于具有显着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([])
产生的数字具有彼此不对齐的轴:
我想要的是左边的两个子图有x轴相匹配,右边的两个子图有相同大小的x轴,在这两行中我想要的是右侧的曲线与左侧的相应图像具有相同的y轴大小。我还想保持左边的图的宽高比相等,这排除了讨论的可能解决方案here。
我可以调整窗口的大小以满足其中一些条件,但是我永远无法让右边的图形的y轴保持与左边图像相同的大小。我已尝试使用GridSpec
,subplot2grid
,并使用左侧图像子图中的相应Bbox
边界手动生成右侧的轴,但这些方法都给我相同的问题。我还尝试在创建轴时使用sharedx
和sharedy
选项,而它似乎使左侧图像的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轴不匹配。