Python 如何在matplotlib的三维视图中打印二维流线

Python 如何在matplotlib的三维视图中打印二维流线,python,matplotlib,plot,3d,Python,Matplotlib,Plot,3d,我需要在3d视图中绘制一个2d流线,如。正如所建议的,我需要从2d绘图中提取流线和箭头,然后将其转换为3d数据。如何将二维流线型数据转换为三维数据并使用mplot3d打印 提前谢谢 拉吉 编辑:@gg349,在你的帮助下,我可以在3d视图中绘制流线。情节是 我有两个问题: 如何从streamplot中提取箭头,并像在早期版本中那样在3d中进行打印 如何提取imshow数据并在3d中绘制。带有imshow的二维流线型是 这个例子应该让您开始: import matplotlib.pyplot as

我需要在3d视图中绘制一个2d流线,如。正如所建议的,我需要从2d绘图中提取流线和箭头,然后将其转换为3d数据。如何将二维流线型数据转换为三维数据并使用mplot3d打印

提前谢谢

拉吉


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

我有两个问题:

如何从streamplot中提取箭头,并像在早期版本中那样在3d中进行打印

如何提取imshow数据并在3d中绘制。带有imshow的二维流线型是


这个例子应该让您开始:

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图形中绘制相同的线:

此示例应该让您开始:

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')
这将生成一个中间临时图形:


从中提取线。然后根据自己的喜好应用二维到三维点变换,并在新的三维图形中绘制相同的线:

pyplot.streamplot返回线和箭头

直线由流线图函数中流线图中给定的一对插值点sinx,y组成。一个特定的流线从一个均匀分布的种子点开始,当流线内部的积分器给出同一对点超过5次时结束。然后选择下一个种子并重复该过程

箭头实际上是关于面片对象的信息,具有由figgca测得的边点。这就是为什么如果你得到res.arrows.get_路径 绘制它的顶点,从0到figsize[0]-2*dpi和figsize[1]-2*dpi

原则上,我们可以将逻辑颠倒过来,得到箭头。但我认为那会很乏味。所以更好的方法是,从直线获取特定流线的所有线段。根据所需的箭头密度,使用一个或多个线段映射到三维并绘制三维箭头

从管线中获取单个流线的条件为。 1.如果两个连续线段的所有四点不同,则为新流线。 2.如果两个连续段的所有四个点在超过5个连续对中相同,则流线结束

一个简单的解决方案可能是

    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)

pyplot.streamplot返回直线和箭头

直线由流线图函数中流线图中给定的一对插值点sinx,y组成。一个特定的流线从一个均匀分布的种子点开始,当流线内部的积分器给出同一对点超过5次时结束。然后选择下一个种子并重复该过程

箭头实际上是关于面片对象的信息,具有由figgca测得的边点。这就是为什么如果你得到res.arrows.get_路径 绘制它的顶点,从0到figsize[0]-2*dpi和figsize[1]-2*dpi

原则上,我们可以将逻辑颠倒过来,得到箭头。但我认为那会很乏味。所以更好的方法是,从直线获取特定流线的所有线段。根据所需的箭头密度,使用一个或多个线段映射到三维并绘制三维箭头

从管线中获取单个流线的条件为。 1.如果两个连续线段的所有四点不同,则为新流线。 2.如果两个连续段的所有四个点在超过5个连续对中相同,则流线结束

一个简单的解决方案可能是

    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)

在你的帮助下,我可以在三维视图中绘制流线。如何从streamplot和3d绘图中提取箭头?是否有任何方法可以提取imshow数据和3d绘图?在您的帮助下,我可以在3d视图中绘制streamline。如何从streamplot和3d绘图中提取箭头?是否有任何方法可以提取imshow数据和3d绘图?