arg*_*m2f 5 plot numpy matplotlib
我想制作一个流线图,当它们靠得太近时不会停止。我宁愿在两个方向上计算每个流线,直到它碰到窗口的边缘。结果是在某些区域它们会混在一起。但这就是我想要的。
我无论如何要在matplotlib中做到这一点?如果没有,我可以使用另一个工具来与 python/numpy 交互吗?
import numpy as np
import matplotlib.pyplot as plt
Y,X = np.mgrid[-10:10:.01, -10:10:.01]
U, V = Y**2, X**2
plt.streamplot(X,Y, U,V, density=1)
plt.show(False)
Run Code Online (Sandbox Code Playgroud)
好吧,我发现我可以通过打开density大量内容并使用自定义起点来获得大部分我想要的东西。我仍然感兴趣是否有更好或替代的方法来做到这一点。
这是我的解决方案。是不是看起来好多了?
import numpy as np
import matplotlib.pyplot as plt
Y,X = np.mgrid[-10:10:.01, -10:10:.01]
y,x = Y[:,0], X[0,:]
U, V = Y**2, X**2
stream_points = np.array(zip(np.arange(-9,9,.5), -np.arange(-9,9,.5)))
plt.streamplot(x,y, U,V, start_points=stream_points, density=35)
plt.show(False)
Run Code Online (Sandbox Code Playgroud)
编辑:顺便说一句,似乎存在一些错误,streamplot使得start_points关键字仅在您使用一维数组作为网格数据时才有效。请参阅提供起点的 Python Matplotlib Streamplot
从 Matplotlib 版本 3.6.0 开始,broken_streamlines 添加了一个可选参数来禁用流线中断。
将其添加到您的代码片段中会产生以下结果:
import numpy as np
import matplotlib.pyplot as plt
Y,X = np.mgrid[-10:10:.01, -10:10:.01]
U, V = Y**2, X**2
plt.streamplot(X,Y, U,V, density=1, broken_streamlines=False)
plt.show(False)
Run Code Online (Sandbox Code Playgroud)

此参数只是扩展了最初绘制的流线(如问题中所示)。这意味着上面修改后的图中的流线比使用 custom 的其他答案中获得的结果更加不均匀start_points。任何流图上的流线密度并不代表该点的大小,U而V仅代表其方向。有关如何默认选择流线起点(当可选参数未指定流线起点时)的更多详细信息,请参阅参数的文档。densitymatplotlib.pyplot.streamplotstart_points
为了获得准确的流线密度,请考虑使用matplotlib.pyplot.contour,但请注意它contour不显示箭头。
自动选择一组好的起点可能并不总是那么容易。但是,如果您知道与要绘制的流相对应的流函数,则可以使用matplotlib.pyplot.contour生成等高线图(可以从输出中隐藏),然后从每个绘制的图中提取合适的起点轮廓。
在下面的例子中,psi_expression是流对应的streamfunction。根据您自己的需要修改此示例时,请确保更新定义 的行psi_expression以及定义U和 的行V。确保它们都对应于相同的流程。
流线的密度可以通过改变 来改变contour_levels。这里,轮廓是均匀分布的。
import numpy as np
import matplotlib.pyplot as plt
import sympy as sy
x, y = sy.symbols("x y")
psi_expression = x**3 - y**3
psi_function = sy.lambdify((x, y), psi_expression)
Y, X = np.mgrid[-10:10:0.01, -10:10:0.01]
psi_evaluated = psi_function(X, Y)
U, V = Y**2, X**2
contour_levels = np.linspace(np.amin(psi_evaluated), np.amax(psi_evaluated), 30)
# Draw a temporary contour plot.
temp_figure = plt.figure()
contour_plot = plt.contour(X, Y, psi_evaluated, contour_levels)
plt.close(temp_figure)
points_list = []
# Iterate over each contour.
for collection in contour_plot.collections:
# Iterate over each segment in this contour.
for path in collection.get_paths():
middle_point = path.vertices[len(path.vertices) // 2]
points_list.append(middle_point)
# Reshape python list into numpy array of coords.
stream_points = np.reshape(np.array(points_list), (-1, 2))
plt.streamplot(X, Y, U, V, density=1, start_points=stream_points, broken_streamlines=False)
plt.show(False)
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
3001 次 |
| 最近记录: |