python-3.x - 使用 matplotlib 的颤动图中的错误向量(电压梯度)
问题描述
我编辑了一些例子来模拟2点电荷的电压叠加,并制作了一个3D曲面图,代码如下:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
q1 = 2e-9
q2 = -2e-9
K = 9e9
#Charge1 position
x1 = 2.0
y1 = 4.0
#Charge2 position
x2 = 6.0
y2 = 4.0
x = np.linspace(0,8,50)
y = np.linspace(0,8,50)
x, y = np.meshgrid(x,y)
r1 = np.sqrt((x - x1)**2 + (y - y1)**2)
r2 = np.sqrt((x - x2)**2 + (y - y2)**2)
V = K*(q1/r1 + q2/r2)
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(x, y, V, rstride=1, cstride=1, cmap=cm.rainbow,
linewidth=0, antialiased=False)
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()
现在我想做的是一个等高线图,上面有一个向量(箭袋)图。我尝试了下面的代码,但是我得到了一堆错误的向量,这两种电荷都来自于两种电荷,甚至是负电荷:
fig2, ax2 = plt.subplots(1,1)
cp = ax2.contourf(x, y, V, cmap=cm.coolwarm)
fig2.colorbar(cp)
v,u = np.gradient(-V, 0.2, 0.2) #E = -∇V
ax2.quiver(x, y, u, v)
ax2.set_title("Point Charges")
plt.show()
我怀疑长向量与除以零有关。向量应该来自正电荷并进入负电荷。但是我将如何修复它们?提前致谢。
解决方案
欢迎来到 SO,非常好的 MWE。一种选择是通过将所有向量设置为 NaN 来排除超过一定长度的所有向量。这里我使用第 95 个百分位。
r = np.sqrt(u**2 + v**2)
is_valid = r < np.percentile(r, 95)
u[~is_valid] = np.nan
v[~is_valid] = np.nan
x[~is_valid] = np.nan
y[~is_valid] = np.nan
fig2, ax2 = plt.subplots(1,1)
cp = ax2.contourf(x, y, V, cmap=cm.coolwarm)
fig2.colorbar(cp)
ax2.quiver(x, y, u, v)
ax2.set_title("Point Charges")
ax2.set_xlim(0, 8)
ax2.set_ylim(0, 8)
plt.show()
推荐阅读
- c# - 如何仅将旧 DataTable 的所需行复制到具有不同结构的新 DataTable 行?
- node.js - 使用不同的用户角色在passport-jwt中设置身份验证很热门?
- python - 变量和字符串浓度混淆
- powershell - 我可以将两个参数传递给管道吗?
- amazon-web-services - 如何为 Java SDK 查询执行指定 Athena 查询结果文件的 Content-Type?
- c# - 删除子文档mongodb c#的问题
- spring - Spring JTA Atomikos 仅消耗 7 条消息并全部出列
- javascript - 在输入框中输入时如何在字符串中插入换行符
- godot - 如何在 Godot 中的按钮上设置“StyleBoxEmpty”?
- r - 如何通过在 R 中迭代列名来对 rJAGS MCMC 后验分布进行子集化?