import matplotlib.pyplot as pltimport numpy as npplt.style.use('_mpl-gallery-nogrid')# make data:np.random.seed(1)x = np.random.uniform(-3, 3, 256)y = np.random.uniform(-3, 3, 256)z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)levels = np.linspace(z.min(), z.max(), 7)# plot:fig, ax = plt.subplots()ax.plot(x, y, 'o', markersize=2, color='grey')ax.tricontourf(x, y, z, levels=levels)ax.set(xlim=(-3, 3), ylim=(-3, 3))plt.show()
# 1、导入库和设置样式import matplotlib.pyplot as pltimport numpy as npplt.style.use('_mpl-gallery-nogrid')# 2、生成随机数据np.random.seed(1) # 固定随机种子,保证每次运行生成的随机数相同,便于结果重现。x = np.random.uniform(-3, 3, 256)y = np.random.uniform(-3, 3, 256)# x 和 y 分别从 [-3, 3] 的均匀分布中抽取 256 个点,构成不规则分布的散点。# 3、计算函数值 zz = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)# 这是一个经典的二维测试函数,由多项式项和指数衰减项组成,能产生起伏的曲面。# 对每个点 (x, y) 计算对应的 z 值,用于后续等高线填充。# 4、定义等高线层级levels = np.linspace(z.min(), z.max(), 7)# 在 z 的最小值和最大值之间等间隔生成 7 个数值,作为等高线填充的层级。# 7 层意味着填充区域被划分为 6 个色带。# 5、创建画布和坐标轴fig, ax = plt.subplots() # 生成一个图形 (fig) 和一个坐标轴对象 (ax),后续绘图都基于这个 ax。# 6、绘制原始散点ax.plot(x, y, 'o', markersize=2, color='grey')# 用灰色小圆点标出所有数据点的位置,标记大小为 2,这样既能看清点的分布,又不会遮挡等高线。# 7、绘制填充等高线ax.tricontourf(x, y, z, levels=levels)# tricontourf 是专为不规则散点设计的函数:它先对散点进行 Delaunay 三角剖分,# 然后在每个三角形内进行线性插值,生成连续曲面并绘制填充等高线。# 参数 levels 指定了等高线的层级,决定了填充颜色的变化。# 8、设置坐标轴范围ax.set(xlim=(-3, 3), ylim=(-3, 3))# 将 x 轴和 y 轴的范围固定在 [-3, 3],与数据生成区间一致,确保图形完整展示。# 显示图形plt.show()
- 可视化一个基于随机散点数据的二维函数,并用填充等高线展示其分布
- 图中灰色散点代表原始数据位置,彩色填充区域展示了函数 z 在二维平面上的变化趋势。
- 通过不规则点直接生成等高线,能直观地观察函数在随机采样下的分布形态。
- 与 contourf 不同(后者需要规则网格数据),tricontourf 可以直接处理随机分布的点,非常适合这种情形。