如何用Contour、Contourf绘制L0范数与Inf范数的等高图?
如何用contourf和contour绘制L0范数与Inf范数的等高线图
嗨,很高兴你已经搞定了其他范数的可视化!针对L0和Inf范数的特殊性质,咱们得稍微调整下实现方式,我来给你详细说说:
一、绘制Inf范数(L∞)的等高线图
Inf范数的定义很直观:对于二维向量(x,y),L∞范数是max(|x|, |y|),它的等高线是轴对齐的正方形。这个函数是分段线性的,直接用常规网格计算就能得到清晰的图形,注意保证网格分辨率足够高,再加上等比例轴就能避免图形拉伸。
示例代码:
import numpy as np import matplotlib.pyplot as plt # 创建网格 x = np.linspace(-3, 3, 100) y = np.linspace(-3, 3, 100) X, Y = np.meshgrid(x, y) # 计算每个网格点的Inf范数 L_inf = np.maximum(np.abs(X), np.abs(Y)) # 绘制等高线 plt.figure(figsize=(6,6)) contourf_plot = plt.contourf(X, Y, L_inf, levels=10, cmap='viridis') # 高亮标注范数为1的边界 plt.contour(X, Y, L_inf, levels=[1], colors='red', linewidths=2) plt.colorbar(contourf_plot) plt.title('L∞ (Inf) Norm Contour Plot') plt.xlabel('x') plt.ylabel('y') plt.axis('equal') # 保证正方形不被拉伸 plt.show()
二、绘制L0范数的等高线图
L0范数的性质比较特殊:它代表向量中非零元素的个数。对于二维(x,y)来说,取值只有三个离散值:
- 0:仅原点
(0,0)一个点; - 1:x轴或y轴(排除原点);
- 2:平面上除坐标轴和原点外的所有区域。
因为contour系列函数基于连续数值场,所以我们需要手动构造离散的数值区域,再结合特殊标注来呈现:
示例代码:
import numpy as np import matplotlib.pyplot as plt # 创建高分辨率网格,避免浮点精度问题 x = np.linspace(-3, 3, 200) y = np.linspace(-3, 3, 200) X, Y = np.meshgrid(x, y) # 构造L0范数的数值场 L0 = np.zeros_like(X) # 标记"非零元素个数为1"的区域:x轴或y轴(排除原点) mask_single_nonzero = (np.isclose(X, 0) | np.isclose(Y, 0)) & ~(np.isclose(X, 0) & np.isclose(Y, 0)) L0[mask_single_nonzero] = 1 # 标记"非零元素个数为2"的区域:x和y都不为0 mask_two_nonzero = ~np.isclose(X, 0) & ~np.isclose(Y, 0) L0[mask_two_nonzero] = 2 # 绘制可视化 plt.figure(figsize=(6,6)) # 用contourf填充三个离散区域 contourf_plot = plt.contourf(X, Y, L0, levels=[-0.5, 0.5, 1.5, 2.5], colors=['white', 'lightblue', 'lightgreen']) # 手动标注范数为1的边界(坐标轴) plt.axvline(0, color='red', linewidth=2) plt.axhline(0, color='red', linewidth=2) # 标注范数为0的原点 plt.scatter(0, 0, color='black', s=50, zorder=10) # 调整颜色条刻度 plt.colorbar(contourf_plot, ticks=[0,1,2]) plt.title('L0 Norm Contour Plot') plt.xlabel('x') plt.ylabel('y') plt.axis('equal') plt.show()
这样就能准确呈现L0和Inf范数的特征图形啦,你可以根据需求调整颜色、网格分辨率或者标注样式~
内容的提问来源于stack exchange,提问作者maril
相关产品推荐
相关产品推荐

