没有浮动伪影的轮廓
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()
尽管如此,如果您的数据范围很大,轮廓应该可以正常工作...
我线性插值然后是轮廓数据。对于计算我使用 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()
尽管如此,如果您的数据范围很大,轮廓应该可以正常工作...