【问题标题】:Contour plot masked on the basis of grid以网格为基础掩蔽的等高线图
【发布时间】:2018-09-26 12:46:54
【问题描述】:

我正在尝试基于 (x,y) 坐标表面生成等高线图,其中包含任何数据 z 的立方体。以下是它的散点图。

我使用以下代码生成网格并插入数据以绘制这样的等高线图。我尝试屏蔽插值数据 Zi 但它仍然给了我一个未屏蔽的等高线图。我还尝试掩盖 x 和 y 坐标,但这样做有什么好处。

x = centre_unadj['X [mm]']
y = centre_unadj['Y [mm]']
z = centre_unadj['LDA1-RMS [m/s]']

plt.figure(num=None, figsize=(20, 15), dpi=80, facecolor='w', edgecolor='k')
xi,yi = np.meshgrid(x,y)
mask =(yi> 0) & (yi< 25) & (xi > -53) & (xi < -25) 
#mask_xi = (xi > -53) & (xi < -25) 
#mask_yi = (yi> 0) & (yi< 25)
#yi = ma.masked_array(yi,mask =(yi> 0) & (yi< 25) )
#xi = ma.masked_array(xi,mask=((xi > -53) & (xi < -25) ))
zi = scipy.interpolate.griddata((x,y), z, (xi, yi) , method='cubic')
zi = ma.masked_array(zi, mask = ((yi> 0) & (yi< 25) & (xi > -53) & (xi < -25)) )

#zi[mask]=np.nan

plt.contourf( xi,yi,zi,100)

plt.colorbar()
plt.show()

这是我运行上述代码后得到的情节。

我只是不想在没有数据点的立方区域内进行任何轮廓插值。

【问题讨论】:

  • 请阅读How to create a Minimal, Complete, and Verifiable example 并相应地编辑您的问题。我们怎么知道centre_unadj 是什么?
  • 感谢您的建议。我只是在寻找一些我错过的技术或其他人可以指出的愚蠢错误。所以我觉得不需要一个可重现的例子。
  • 第一个图显示 x=centre_unadj['X [mm]'] vs y=centre_unadj['Y [mm]'] 对吧?
  • 是的,没错。它表示缺少正方形的网格。
  • 我认为我提出的建议可以解决您的问题。然而,在未来,提供一个最小、完整和可验证的示例将是一个非常好的做法,以确保任何想要回答的人都能够重现(并因此解决)相同问题你有,而不是回答者定义的版本试图猜测你的数据

标签: python matplotlib


【解决方案1】:

问题出在网格网格生成中。 y 中的值从 0 到 40 十多次。因此,生成的xiyi 将是非常不直观的矩阵。

生成网格的正确方法如下:

xi,yi = np.meshgrid(np.linspace(x.min(),x.max(),200),np.linspace(y.min(),y.max(),200))

示例

我已经生成了一些形状相似的数据:

import scipy.signal as sgn
import scipy.interpolate as intr
import numpy.ma as ma
x = np.linspace(-100,0,500)
y = sgn.sawtooth(2 * np.pi * .2 * x)
mask = (x>-50) & (x<-25)
y[mask] = (sgn.sawtooth(2 * np.pi * .2 * x[mask])+1)/2
y = (y+1)*25
plt.plot(x,y)
z = np.sin(2*np.pi*.1*x)+np.sin(2*np.pi*.1*y)

使得 x vs y 的图看起来像:

您实际使用的代码会生成以下图:

xi,yi = np.meshgrid(x,y)
mask =(yi> 0) & (yi< 25) & (xi > -53) & (xi < -25) 
zi = intr.griddata((x,y), z, (xi, yi) , method='cubic')
zi = ma.masked_array(zi, mask = mask )
plt.contourf( xi,yi,zi,100); plt.colorbar()

获取网格数据的插值产生了意想不到的错误结果,导致获得contourf。事实上,绘制plt.imshow(mask) 揭示了矩阵中的位置,其中正方形(y &gt; 0) &amp; (y &lt; 25) &amp; (x &gt; -53) &amp; (x &lt; -25) 内的值被放置在矩阵中。

当网格被定义为提议时,结果是这个:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-28
    • 2018-07-29
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2013-06-23
    相关资源
    最近更新 更多