停止 contourf 插值
Stop contourf interpolating values
我正在尝试使用 contourf (matplotlib) 在底图中绘制一些二维值。
但是,默认情况下,contourf 会插入中间值并提供更平滑的数据图像。
有没有办法让 contourf 停止在值之间插值?
我尝试添加关键字参数 interpolation='nearest' 但 contourf 不使用它。
其他选项是使用 imshow,但 contourf 的某些功能不适用于 imshow。
我正在使用 python 3.6.3 和 matplotlib 2.1.2
鉴于问题还没有更新明确实际问题,我就简单回答问题吧:
不,contour
不可能不进行插值,因为等值线图的整个概念就是对值进行插值。
试试 'pcolormesh',
您可以使用它来绘制二维值而无需在它们之间进行插值。
'pcolormesh'(来自 matplotlib 文档):
Create a pseudocolor plot with a non-regular rectangular grid.
代码示例:
import matplotlib.pyplot as plt
plt.pcolormesh(data)
plt.show()
在这里你可以看到如何以类似于'contourf'的方式使用'pcolormesh'(还有一个示例图):
https://matplotlib.org/examples/images_contours_and_fields/pcolormesh_levels.html
我在绘制 class 不确定的决策边界(颜色)(将颜色混合为白色)时遇到了同样的问题。由于插值,在两个边界之间我有其他 classes 的颜色。这些界限是错误的。看看从蓝色到红色的过渡:
我通过一次只绘制一个 class 解决了这个问题。这可以通过 masked arrays:
来完成
# C contains classes 0, 1, 2 as mesh
# CU contains classes with uncertainty, CU = 2 * C + U, where 0 <= U <= 1
# xx and yy are the mesh variables
for cl in np.unique(C): # iterate over red, green, blue classes
mask = C != cl
xx_ma = np.ma.MaskedArray(xx, mask)
yy_ma = np.ma.MaskedArray(yy, mask)
CU_ma = np.ma.MaskedArray(CU, mask)
cnt = plt.contourf(xx_ma, yy_ma, CU_ma, vmin=0, vmax=5,
cmap=cmap, levels=len(np.unique(CU)))
这是结果:
使用pcolormesh时,不需要单独绘制classes,但数据必须采用不同的格式。基本上你需要一个 xy-mesh 用于角(网格)和另一个 xy-mesh 用于中心(值):
(X[i+1, j], Y[i+1, j]) (X[i+1, j+1], Y[i+1, j+1])
+--------+
| C[i,j] |
+--------+
(X[i, j], Y[i, j]) (X[i, j+1], Y[i, j+1]),
结果看起来像这样(现在有精确的角):
我正在尝试使用 contourf (matplotlib) 在底图中绘制一些二维值。
但是,默认情况下,contourf 会插入中间值并提供更平滑的数据图像。
有没有办法让 contourf 停止在值之间插值?
我尝试添加关键字参数 interpolation='nearest' 但 contourf 不使用它。 其他选项是使用 imshow,但 contourf 的某些功能不适用于 imshow。
我正在使用 python 3.6.3 和 matplotlib 2.1.2
鉴于问题还没有更新明确实际问题,我就简单回答问题吧:
不,contour
不可能不进行插值,因为等值线图的整个概念就是对值进行插值。
试试 'pcolormesh', 您可以使用它来绘制二维值而无需在它们之间进行插值。
'pcolormesh'(来自 matplotlib 文档):
Create a pseudocolor plot with a non-regular rectangular grid.
代码示例:
import matplotlib.pyplot as plt
plt.pcolormesh(data)
plt.show()
在这里你可以看到如何以类似于'contourf'的方式使用'pcolormesh'(还有一个示例图):
https://matplotlib.org/examples/images_contours_and_fields/pcolormesh_levels.html
我在绘制 class 不确定的决策边界(颜色)(将颜色混合为白色)时遇到了同样的问题。由于插值,在两个边界之间我有其他 classes 的颜色。这些界限是错误的。看看从蓝色到红色的过渡:
我通过一次只绘制一个 class 解决了这个问题。这可以通过 masked arrays:
来完成# C contains classes 0, 1, 2 as mesh
# CU contains classes with uncertainty, CU = 2 * C + U, where 0 <= U <= 1
# xx and yy are the mesh variables
for cl in np.unique(C): # iterate over red, green, blue classes
mask = C != cl
xx_ma = np.ma.MaskedArray(xx, mask)
yy_ma = np.ma.MaskedArray(yy, mask)
CU_ma = np.ma.MaskedArray(CU, mask)
cnt = plt.contourf(xx_ma, yy_ma, CU_ma, vmin=0, vmax=5,
cmap=cmap, levels=len(np.unique(CU)))
这是结果:
使用pcolormesh时,不需要单独绘制classes,但数据必须采用不同的格式。基本上你需要一个 xy-mesh 用于角(网格)和另一个 xy-mesh 用于中心(值):
(X[i+1, j], Y[i+1, j]) (X[i+1, j+1], Y[i+1, j+1])
+--------+
| C[i,j] |
+--------+
(X[i, j], Y[i, j]) (X[i, j+1], Y[i, j+1]),
结果看起来像这样(现在有精确的角):