Jupyter Notebook绘制Quiver图时遭遇TypeError问题求助
解决Jupyter Notebook中Quiver图的TypeError问题
我来帮你排查下这个报错的原因,主要是代码里有两处明显的问题,咱们一步步来修正:
1. 列表语法错误
你定义ug的时候用空格分隔元素,Python里列表元素必须用逗号隔开,不然解释器根本识别不了这是合法的列表,这大概率是触发TypeError的第一个原因。
原来的错误写法:
ug = [0.0 0.072 0.128 0.16800000000000004 0.19200000000000006 0.20000000000000007 0.19200000000000006 0.16800000000000004 0.128 0.07200000000000001 1.734723475976807e-17]
修正后:
ug = [0.0, 0.072, 0.128, 0.16800000000000004, 0.19200000000000006, 0.20000000000000007, 0.19200000000000006, 0.16800000000000004, 0.128, 0.07200000000000001, 1.734723475976807e-17]
2. Meshgrid维度不匹配问题
你用(Vg,Ug) = np.meshgrid(0*xg,ug)创建速度数组的方式不对,会导致Ug和之前生成的Xg、Yg维度不兼容——quiver要求四个输入数组(X,Y,U,V)的形状必须完全一致,否则就会报错。
正确的做法是:把一维的ug扩展成和Xg同形状的二维数组,因为每个y位置对应的x方向速度是固定的ug[y],需要把这个值复制到所有x位置上;而y方向速度Vg直接生成全0的同形状数组即可。
修正后的完整代码示例
假设你已经定义了l和d的具体数值(比如下面示例中的l=500、d=10),完整可运行代码如下:
import numpy as np import matplotlib.pyplot as plt # 修正后的ug列表 ug = [0.0, 0.072, 0.128, 0.16800000000000004, 0.19200000000000006, 0.20000000000000007, 0.19200000000000006, 0.16800000000000004, 0.128, 0.07200000000000001, 1.734723475976807e-17] l = 500 # 替换成你实际的l值 d = 10 # 替换成你实际的d值 xg = np.linspace(0, l, int(l/50)) yg = np.linspace(0, d, len(ug)) Xg, Yg = np.meshgrid(xg, yg) # 创建和Xg/Yg形状匹配的速度数组 Ug = np.repeat(np.array(ug)[:, np.newaxis], len(xg), axis=1) Vg = np.zeros_like(Ug) # y方向速度全为0 # 绘制Quiver图 plt.quiver(Xg, Yg, Ug, Vg) plt.xlabel('X') plt.ylabel('Y') plt.title('Velocity Field (X-component only)') plt.show()
额外小提示
如果你习惯用meshgrid,也可以用Ug = np.tile(np.array(ug)[:, np.newaxis], (1, len(xg)))来替代repeat,效果是完全一样的——核心就是保证四个数组的形状完全一致,quiver就能正常工作了。
内容的提问来源于stack exchange,提问作者mralarcon
相关产品推荐
相关产品推荐

