首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在matplotlib中绘制三维视图中的二维流线

如何在matplotlib中绘制三维视图中的二维流线
EN

Stack Overflow用户
提问于 2015-05-21 05:12:50
回答 2查看 5.4K关注 0票数 1

我需要绘制像这样的3d视图中的2d流线。正如帖子所建议的,我需要从2d图中提取流线和箭头,然后将其转换为3d数据。如何利用mplot3d将二维流线型数据转换为三维数据和绘图?

提前感谢

拉杰

编辑:@gg349,在你的帮助下,我可以在3d视图中绘制流线型图。情节是这里

我有两个问题:

  1. 如何从流图中提取箭头并将其绘制为3d,就像您在早期的帖子中所做的那样
  2. 如何提取imshow()数据并将其绘制为3d。带有imshow()的2d流线是这里
EN

回答 2

Stack Overflow用户

发布于 2015-05-21 17:52:35

这个例子应该让您开始:

代码语言:javascript
复制
import matplotlib.pyplot as plt
import numpy as np

fig_tmp, ax_tmp = plt.subplots()
x, y = np.mgrid[0:2.5:1000j, -2.5:2.5:1000j]
vx, vy = np.cos(x - y), np.sin(x - y)
res = ax_tmp.streamplot(x.T, y.T, vx, vy, color='k')
fig_tmp.show()
# extract the lines from the temporary figure
lines = res.lines.get_paths()
#for l in lines:
#    plot(l.vertices.T[0],l.vertices.T[1],'k')

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for line in lines:
    old_x = line.vertices.T[0]
    old_y = line.vertices.T[1]
    # apply for 2d to 3d transformation here
    new_z = np.exp(-(old_x ** 2 + old_y ** 2) / 4)
    new_x = 1.2 * old_x
    new_y = 0.8 * old_y
    ax.plot(new_x, new_y, new_z, 'k')

这将产生一个中间的临时数字:

从中提取线条。然后,将你的2d应用到你喜欢的3d点变换中,并在一个新的3d图形中画出相同的线条:

票数 5
EN

Stack Overflow用户

发布于 2015-05-22 19:11:39

pyplot.streamplot返回“行”和“箭头”。

“线”由流图函数中的一对插值点( x,y)组成。一个特定的流线从一个种子点开始(我猜是均匀分布的),当流线内的积分器给出相同的点超过5次时就结束了。然后选择下一个种子并重复这个过程。

“箭头”实际上是关于由图(Gca)测量的边缘点的补丁对象的信息,而不是“线条”。这就是为什么如果得到res.arrows.get_paths()和它的绘图顶点,它从0到(figsize-2)*dpi和(图1-2)*dpi。

原则上,我们可以反转逻辑并得到箭头。但我觉得那会很乏味。所以更好的方法是,从“线”中获取一个特定流线的所有部分。映射到3d并使用一个或多个段绘制3D箭头,具体取决于所需箭头的密度。

从“线条”中获取单个流线的条件是。1.如果连续两个部分的所有四个点都不同,则采用新的流线。2.如果连续两段的所有四个点对超过5对相同,则为流线结束。

一个天真的解决方案可能是

代码语言:javascript
复制
    fig = figure(figsize=(8,6), dpi =160)

    ax = fig.add_subplot(111, projection='3d' )
    i = 0
    for line in lines:
        i += 1
        old_x = line.vertices.T[0]
        old_y = line.vertices.T[1]
        # apply for 2d to 3d transformation here
        new_z = np.exp(-(old_x ** 2 + old_y ** 2) / 4)
        new_x = 1.2 * old_x
        new_y = 0.8 * old_y
        ax.plot(new_x, new_y, new_z, 'k')

        if i%10 ==1:
            ax.quiver(new_x[0],new_y[0],new_z[0],new_x[0]-new_x[1],new_y[0]-new_y[1],new_z[0]-new_z[1], length=0.2)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30365069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档