没有浮动伪影的轮廓

Contour without float artifacts

我线性插值然后是轮廓数据。对于计算我使用 float 类型,因为我不知道输入数据中会有多少小数。有时可能没有小数,有时是一位或十位以上。

不幸的是,由于在相同值的插值和等高线之后使用浮点数,我得到了不需要的伪像。我怎样才能修复我的代码,使其在不应该出现的地方不产生轮廓伪像?

简单代码示例:

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

interval_in = np.linspace(1, 100, 10)
interval_out = np.linspace(1, 100, 100)
xin, yin = np.meshgrid(interval_in, interval_in)
zin = np.ones((10, 10))*10
xout, yout = np.meshgrid(interval_out, interval_out)
zout = griddata((xin.flatten(),yin.flatten()),zin.flatten(),(xout,yout),method='linear')

contours = plt.contour(xout, yout, zout, levels=[10])
plt.show()

对于您的示例,zout 应该全部为 10。但实际上在 9.9999999999999982 和 10.000000000000002 之间变化,因此 contour 试图绘制此图。您可以使用 numpy 舍入到给定的精度,

zout_ = np.round_(zout, decimals=3)
contours = plt.contour(xout, yout, zout_, levels=[10])
plt.show()

尽管如此,如果您的数据范围很大,轮廓应该可以正常工作...