python - 如何使用适合的图像和剖面图创建 Matplotlib 图?

标签 python matplotlib plot 2d

我想将 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') ,然后使边界对齐,但图像不再具有正确的纵横比。

上面代码示例的输出: Example output

最佳答案

您可以使用 sharexsharey 来执行此操作,将您的 ax= 行替换为:

ax = [plt.subplot(gs[0]),]
ax.append(plt.subplot(gs[1], sharey=ax[0]))
ax.append(plt.subplot(gs[2], sharex=ax[0]))

enter image description here

关于python - 如何使用适合的图像和剖面图创建 Matplotlib 图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31882840/

相关文章:

python - Seaborn:设置 distplot bin 范围?

python - pandas boxplot 包含之前保存的绘图内容

python - 如何使用 pylab.imshow() 显示 np.array

Python - 基于值绘制网格

python - 绘制颜色条时强制方形子图

python - aiohttp.ClientSession 未使用 'expires' 键设置 cookie

python - 在 django 后端为新发票自动增加发票号

python - 静态方法和线程安全应用程序

python - 给 openid 用户额外的信息

matlab - x 轴和 y 轴刻度标签的不同字体大小