基于7x7稀疏概率矩阵调用matplotlib pcolormesh绘图时报解包类ValueError
报错核心原因
- 触发当前ValueError的直接原因:传给
pcolormesh的颜色值数组不是合法的二维矩阵。你写的nprob[x,y]是对scipy稀疏矩阵做花式索引的错误操作——稀疏矩阵不支持用两个同形状的坐标数组直接做二维取值,这类操作最终会返回一个长度为49的一维扁平数组,没有二维结构。当matplotlib尝试执行nrows, ncols = C.shape拆分这个数组的维度时,发现一维数组的shape只有1个元素,根本没法拆成行、列两个值,就抛出了“expected 2, got 0”的解包错误。 - 代码里还藏了两处会引发后续报错的问题:
- 坐标维度不匹配:
pcolormesh在默认的shading='flat'模式下,代表色块边界的x/y坐标需要比颜色矩阵的行/列数多1个点(每个色块由相邻两个边界点确定)。你用np.arange(0,7,1)生成的7个坐标点,和7x7的概率矩阵维度不对齐,哪怕修正了索引问题,也会触发新的维度匹配报错。 - 归一化逻辑笔误:原代码
nprob = prob/sum里的sum是Python内置函数,没有对prob矩阵做整体求和,正确的归一化写法应该是对prob自身求所有元素的和,也就是prob.sum()。
- 坐标维度不匹配:
修正后可直接运行的代码
import numpy as np import matplotlib.pyplot as plt # 归一化生成概率密度矩阵,转成常规numpy数组规避稀疏矩阵索引问题 nprob = (prob / prob.sum()).toarray() # 生成7个方块对应的边界坐标:共8个点 x_edges = np.arange(0, 8, 1) y_edges = np.arange(0, 8, 1) fig, dens = plt.subplots() dens.set_title('probability density for...') dens.set_xlabel('i') dens.set_ylabel('t') # 直接传入二维nprob矩阵作为颜色值,不需要手动做坐标索引 m = dens.pcolormesh(x_edges, y_edges, nprob, cmap='Blues', shading='flat') cbar = plt.colorbar(m) plt.show()
常用操作澄清
- 完全不需要用
np.meshgrid生成二维坐标传给pcolormesh:pcolormesh支持直接传入一维的边界坐标向量,内部会自动匹配对应关系,手动生成二维网格反而容易引发维度计算错误。 - 不需要手动按坐标对概率矩阵做取值:pcolormesh会自动按二维矩阵的行列顺序,把每个矩阵元素对应到坐标范围内的一个色块上,手动索引只会把规整的二维矩阵压成一维,引发维度错误。
- 如果想用7个坐标点对应7个方块的中心位置,只需要把
shading参数改成'nearest',坐标用0到6的整数序列即可,这种模式下坐标和颜色矩阵的维度是完全相等的。
内容的提问来源于stack exchange,提问作者qmstatmech
相关产品推荐
相关产品推荐

