我有点麻烦,主要是因为要为matplotlib包装到python世界中有点困难。
我有4个1D数组,如下所示:
x -> x positions
y -> y positions
u -> x velocities
v -> y velocities
我在python变量中描述如下(这些变量由我正在读取的数据填充,这些数据无关紧要,每个一维数组的长度相等)
x_points : List[float] = []
y_points : List[float] = []
x_vel : List[float] = []
y_vel : List[float] = []
而且我很难将这些一维数组转换为可用于绘制流线图的格式。 (我试图遵循this question here的回答,但仍在挠头) 目前,我的代码是这样的(我省略了数据填充)
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
import pandas as pd
x_points : List[float] = []
y_points : List[float] = []
x_vel : List[float] = []
y_vel : List[float] = []
#Data Population
#End Data Population
xi = np.linspace(-20, 20, len(x_points))
yi = np.linspace(-20, 20, len(z_points))
X, Y = np.meshgrid(xi, yi)
U = interpolate.griddata((x_points, y_points), x_vel, (X, Y), method='cubic')
V = interpolate.griddata((x_points, y_points), y_vel, (X, Y), method='cubic')
f, ax = plt.subplots(figsize=(6,6))
ax.streamplot(X,Y,U,V, density=[0.2,1])
我已经知道的无法正常工作。
请问有什么帮助我描述如何将4个1D数组转换为流图满意的内容吗?
答案 0 :(得分:1)
最后,代码可以正常工作,但是我跳过了声明列表的操作(这也是不必要的)。
我不得不更正一个较小的拼写错误-> z_points
不存在,我想您想要的是y_points
。
我使用了一些模拟数据来测试您的代码:
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
import pandas as pd
from scipy import interpolate
x_points = np.random.normal(3,5, size=1000)
y_points = np.random.normal(1,2, size=1000)
x_vel = np.random.exponential(size=1000)
y_vel = np.random.exponential(5,size=1000
xi = np.linspace(-20, 20, len(x_points))
yi = np.linspace(-20, 20, len(y_points))
X, Y = np.meshgrid(xi, yi)
U = interpolate.griddata((x_points, y_points), x_vel, (X, Y), method='cubic')
V = interpolate.griddata((x_points, y_points), y_vel, (X, Y), method='cubic')
f, ax = plt.subplots(figsize=(6,6))
ax.streamplot(X,Y,U,V, density=[0.2,1])
输出
所以最后我想您输入的数据格式不正确。您如何填充数据?也许将数据从列表重播到numpy数组已经可以解决问题。
答案 1 :(得分:0)
问题是python给了我一系列与数组大小不匹配有关的错误。
我已经弄清楚了,事实证明我离得很近,答案也很简单,但是我得到了一些相当奇怪的结果。
首先是答案: 调用np.linspace时,我需要为每个轴使用最小值/最大值,我在下面附加了正确的代码(其中min / max获取列表中的最小/最大值)
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
import pandas as pd
x_points : List[float] = []
y_points : List[float] = []
x_vel : List[float] = []
y_vel : List[float] = []
#Data Population
#End Data Population
x_min : float = min(x_vel)
y_min : float = min(y_vel)
x_max : float = max(x_vel)
y_max : float = max(y_vel)
xi = np.linspace(x_min, y_max, len(x_points))
yi = np.linspace(y_min, y_max, len(y_points))
X, Y = np.meshgrid(xi, yi)
U = interpolate.griddata((x_points, y_points), x_vel, (X, Y), method='cubic')
V = interpolate.griddata((x_points, y_points), y_vel, (X, Y), method='cubic')
f, ax = plt.subplots(figsize=(6,6))
plt.streamplot(X, Y, U, V, color=U**2+V**2, linewidth=1, cmap=plt.cm.autumn)
结果看起来大致上与我期望的一样,但分散/间隔很大 我希望流程会更加紧密分组
有什么办法可以做到这一点?