python中特定几何体的二维等值线图

python中特定几何体的二维等值线图,python,numpy,matplotlib,Python,Numpy,Matplotlib,我想绘制特定几何体(多边形)的轮廓图。我有这个多边形内的角点和许多点的坐标,有一维参数,我想插值到轮廓图上。我能够绘制参数的分布,但图像显示为正方形(因为我不知道如何指定几何体)。 不用说我是Python初学者 我现在使用以下代码 import numpy as np import matplotlib.pyplot as plt import scipy.interpolate r = np.array([[0, 0, 1.0000], [0, 1.0000, 0], [1.0000, 0,

我想绘制特定几何体(多边形)的轮廓图。我有这个多边形内的角点和许多点的坐标,有一维参数,我想插值到轮廓图上。我能够绘制参数的分布,但图像显示为正方形(因为我不知道如何指定几何体)。 不用说我是Python初学者

我现在使用以下代码

import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate

r = np.array([[0, 0, 1.0000], [0, 1.0000, 0], [1.0000, 0, 0], [0, 0.7071, 0.7071],
[0, -0.7071, 0.7071],[0.7071, 0, 0.7071], [-0.7071, 0, 0.7071], [0.7071, 0.7071, 0], 
[-0.7071, 0.7071, 0], [0.8361,  0.3879, 0.3879], [-0.8361, 0.3879, 0.3879], 
[0.8361, -0.3879, 0.3879], [-0.8361, -0.3879, 0.3879], [0.3879, 0.8361, 0.3879],
[-0.3879, 0.8361, 0.3879], [0.3879, -0.8361, 0.3879], [-0.3879, -0.8361, 0.3879],
[0.3879, 0.3879, 0.8361], [-0.3879, 0.3879, 0.8361], [0.3879, -0.3879, 0.8361],
[-0.3879, -0.3879, 0.8361], [-1.0000, 0, 0], [-0.7071, -0.7071, 0], [0, -1.0000, 0],
[0.7071, -0.7071, 0]])

xx = r[:,0]
yy = r[:,1]
zz = r[:,2]

xxi, yyi = np.linspace(xx.min(), xx.max(), 100), np.linspace(yy.min(), yy.max(), 100)
xxi, yyi = np.meshgrid(xxi, yyi)

rbff = scipy.interpolate.Rbf(xx, yy, zz, function='linear')
zzi = rbff(xxi, yyi)
plt.imshow(zzi, vmin=zz.min(), vmax=zz.max(), origin='lower',
       extent=[xx.min(), xx.max(), yy.min(), yy.max()])
plt.scatter(xx, yy, c=zz)
plt.colorbar()
plt.show()   

这是作弊,但无论如何,你可以加上类似的东西

zzi = rbff(xxi, yyi)
zzi[zzi<0.1]=nan
zzi=rbff(xxi,yyi)

zzi[zzi这是作弊,但不管怎样:你可以添加类似的内容

zzi = rbff(xxi, yyi)
zzi[zzi<0.1]=nan
zzi=rbff(xxi,yyi)

zzi[zzi如果多边形是凸的,可以使用
scipy.interpolate.griddata
获取遮罩区域:

import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate

r = np.array([[0, 0, 1.0000], [0, 1.0000, 0], [1.0000, 0, 0], [0, 0.7071, 0.7071],
[0, -0.7071, 0.7071],[0.7071, 0, 0.7071], [-0.7071, 0, 0.7071], [0.7071, 0.7071, 0], 
[-0.7071, 0.7071, 0], [0.8361,  0.3879, 0.3879], [-0.8361, 0.3879, 0.3879], 
[0.8361, -0.3879, 0.3879], [-0.8361, -0.3879, 0.3879], [0.3879, 0.8361, 0.3879],
[-0.3879, 0.8361, 0.3879], [0.3879, -0.8361, 0.3879], [-0.3879, -0.8361, 0.3879],
[0.3879, 0.3879, 0.8361], [-0.3879, 0.3879, 0.8361], [0.3879, -0.3879, 0.8361],
[-0.3879, -0.3879, 0.8361], [-1.0000, 0, 0], [-0.7071, -0.7071, 0], [0, -1.0000, 0],
[0.7071, -0.7071, 0]])

xx = r[:,0]
yy = r[:,1]
zz = r[:,2]

xxi, yyi = np.linspace(xx.min(), xx.max(), 100), np.linspace(yy.min(), yy.max(), 100)
xxi, yyi = np.meshgrid(xxi, yyi)

rbff = scipy.interpolate.Rbf(xx, yy, zz, function='linear')
zzi = rbff(xxi, yyi)
mask = np.isnan(scipy.interpolate.griddata(np.c_[xx, yy], zz, (xxi, yyi)))
zzi[mask] = np.nan
plt.imshow(zzi, vmin=zz.min(), vmax=zz.max(), origin='lower',
       extent=[xx.min(), xx.max(), yy.min(), yy.max()])
plt.scatter(xx, yy, c=zz)
plt.colorbar()
plt.show() 
输出:


如果多边形是凸多边形,可以使用
scipy.interpolate.griddata
获取遮罩区域:

import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate

r = np.array([[0, 0, 1.0000], [0, 1.0000, 0], [1.0000, 0, 0], [0, 0.7071, 0.7071],
[0, -0.7071, 0.7071],[0.7071, 0, 0.7071], [-0.7071, 0, 0.7071], [0.7071, 0.7071, 0], 
[-0.7071, 0.7071, 0], [0.8361,  0.3879, 0.3879], [-0.8361, 0.3879, 0.3879], 
[0.8361, -0.3879, 0.3879], [-0.8361, -0.3879, 0.3879], [0.3879, 0.8361, 0.3879],
[-0.3879, 0.8361, 0.3879], [0.3879, -0.8361, 0.3879], [-0.3879, -0.8361, 0.3879],
[0.3879, 0.3879, 0.8361], [-0.3879, 0.3879, 0.8361], [0.3879, -0.3879, 0.8361],
[-0.3879, -0.3879, 0.8361], [-1.0000, 0, 0], [-0.7071, -0.7071, 0], [0, -1.0000, 0],
[0.7071, -0.7071, 0]])

xx = r[:,0]
yy = r[:,1]
zz = r[:,2]

xxi, yyi = np.linspace(xx.min(), xx.max(), 100), np.linspace(yy.min(), yy.max(), 100)
xxi, yyi = np.meshgrid(xxi, yyi)

rbff = scipy.interpolate.Rbf(xx, yy, zz, function='linear')
zzi = rbff(xxi, yyi)
mask = np.isnan(scipy.interpolate.griddata(np.c_[xx, yy], zz, (xxi, yyi)))
zzi[mask] = np.nan
plt.imshow(zzi, vmin=zz.min(), vmax=zz.max(), origin='lower',
       extent=[xx.min(), xx.max(), yy.min(), yy.max()])
plt.scatter(xx, yy, c=zz)
plt.colorbar()
plt.show() 
输出:


是,或
zzm=np.ma.masked_where(zziYes),或
zzm=np.ma.masked_where(zzi