基于网格

时间:2018-04-16 17:26:39

标签: python matplotlib

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

scatterplot

我使用以下代码生成网格并插入数据以绘制这样的等高线图。我试图掩盖插值数据 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()

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

colorbar plot

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

1 个答案:

答案 0 :(得分:0)

问题出在meshgrid生成中。 y中的值从0到40超过十几次。因此,生成的xiyi将是非直观的矩阵。

生成meshgrid的正确方法如下:

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看起来像:

sawtooth

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

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()

bad contourf

获取网格数据的插值会产生意外和不正确的结果,从而导致获得contourf。实际上,绘制plt.imshow(mask)会在矩阵中显示平方(y > 0) & (y < 25) & (x > -53) & (x < -25)内的值放置在矩阵中的位置。

mask imshow

当meshgrid被定义为建议时,结果是这一个:

enter image description here