Matplotlib:基于两组数组绘制高斯等高线图遇TypeError问题求助
解决contour要求z为二维数组的问题
这个问题太常见啦!咱们先搞懂为啥contour会报错:
contour函数是用来画二维平面上的等高线的,它需要知道平面上一系列规则网格点对应的数值(也就是密度值),这样才能连接出不同数值的闭合曲线。你现在的z是和X里239个零散数据点一一对应的一维数组,它没有覆盖整个平面的网格信息,自然没法生成等高线。
所以解决思路很明确:把零散的点和对应的密度值,插值成覆盖整个数据范围的二维网格数据。具体步骤如下:
步骤1:拆分X的维度并生成网格
首先把X里的x和y分量分开,然后用numpy.meshgrid生成规则的网格矩阵,这个网格要覆盖你所有数据点的范围:
import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import griddata # 拆分X的x和y分量 x = X[:, 0] y = X[:, 1] # 生成网格:先确定网格密度(比如100x100,数值越大等高线越精细) xi = np.linspace(x.min(), x.max(), 100) yi = np.linspace(y.min(), y.max(), 100) xx, yy = np.meshgrid(xi, yi)
步骤2:将z插值到网格上
用scipy.interpolate.griddata把零散的z值插值到刚才生成的网格点上,得到二维的zz数组:
# 插值方法可选'linear'(线性插值)、'nearest'(最近邻)、'cubic'(三次插值),按需选择 zz = griddata((x, y), z, (xx, yy), method='linear')
步骤3:正确调用contour并绘图
注意contour的参数顺序是(x网格, y网格, z网格),你之前的参数顺序写错了!然后把散点图和等高线图结合起来:
fig, ax = plt.subplots() # 你原来重复写了两次scatter,保留一次即可 ax.scatter(x, y, c='green') # 绘制等高线,还可以通过levels指定要画的等高线数值,cmap设置颜色映射 ax.contour(xx, yy, zz, cmap='viridis') plt.show()
另外补充个小技巧:如果你的z是二元高斯密度值,且知道高斯分布的均值和协方差,也可以直接用高斯函数计算网格点的密度值,这样就不需要插值,结果会更准确哦。
内容的提问来源于stack exchange,提问作者cookiedealer
相关产品推荐
相关产品推荐

