我想将 2d 数据绘制为图像,并在下方和侧面显示沿 x 和 y 轴的剖面图。这是一种非常常见的显示数据的方式,因此可能有一种更简单的方法来实现这一点。我想找到最简单、最可靠的方法来正确地做到这一点,并且不使用 matplotlib 之外的任何东西(尽管我有兴趣了解其他可能特别相关的包)。特别是,如果数据的形状(纵横比)发生变化,该方法应该可以在不改变任何东西的情况下工作。
我的主要问题是让副图正确缩放,以便它们的边界与主图匹配。
示例代码:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# generate grid and test data
x, y = np.linspace(-3,3,300), np.linspace(-1,1,100)
X, Y = np.meshgrid(x,y)
def f(x,y) :
return np.exp(-(x**2/4+y**2)/.2)*np.cos((x**2+y**2)*10)**2
data = f(X,Y)
# 2d image plot with profiles
h, w = data.shape
gs = gridspec.GridSpec(2, 2,width_ratios=[w,w*.2], height_ratios=[h,h*.2])
ax = [plt.subplot(gs[0]),plt.subplot(gs[1]),plt.subplot(gs[2])]
bounds = [x.min(),x.max(),y.min(),y.max()]
ax[0].imshow(data, cmap='gray', extent = bounds, origin='lower')
ax[1].plot(data[:,w/2],Y[:,w/2],'.',data[:,w/2],Y[:,w/2])
ax[1].axis([data[:,w/2].max(), data[:,w/2].min(), Y.min(), Y.max()])
ax[2].plot(X[h/2,:],data[h/2,:],'.',X[h/2,:],data[h/2,:])
plt.show()
正如您从下面的输出中看到的那样,图像向右缩放的方式与边界不匹配。
部分解决方案:
1) 手动调整图形大小以找到正确的纵横比以使其正确显示(可以自动使用图像比率 + 填充 + 使用的宽度比率吗?)。当已经有这么多本应自动处理这些事情的包装选项时,这似乎很俗气。 编辑: plt.gcf().set_figheight(f.get_figwidth()*h/w)
如果未更改填充,则似乎有效。
2) 添加 ax[0].set_aspect('auto')
,然后使边界对齐,但图像不再具有正确的纵横比。
最佳答案
您可以使用 sharex
和 sharey
来执行此操作,将您的 ax=
行替换为:
ax = [plt.subplot(gs[0]),]
ax.append(plt.subplot(gs[1], sharey=ax[0]))
ax.append(plt.subplot(gs[2], sharex=ax[0]))
关于python - 如何使用适合的图像和剖面图创建 Matplotlib 图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31882840/