arg*_*m2f 5 python plot 2d matplotlib
我想将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()
Run Code Online (Sandbox Code Playgroud)
从下面的输出中可以看到,事物向右缩放的方式与边界没有正确匹配。
部分解决方案:
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]))
Run Code Online (Sandbox Code Playgroud)