如何在matplotlib

时间:2015-05-21 05:12:50

标签: python matplotlib plot 3d

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

提前致谢

拉​​吉

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

我有两个问题:

  1. 如何从streamplot中提取箭头并将其绘制在3d中,就像之前的post

  2. 一样
  3. 如何提取imshow()数据并将其绘制在3d中。使用imshow()的2d流线型是here

2 个答案:

答案 0 :(得分:3)

这个例子应该让你开始:

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')

这会生成一个中间临时数字: enter image description here

从中提取线条。然后将2d应用于您喜欢的3d点变换,并在新的3d图中绘制相同的线:enter image description here

答案 1 :(得分:2)

pyplot.streamplot返回“lines”和“arrows”。

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

“箭头”实际上是关于贴片对象的信息,其边缘点由图(gca)测量,与“线”不同。这就是为什么你得到res.arrows.get_paths() 并绘制它的顶点,它从零到(figsize [0] -2)* dpi和(figsize [1] -2)* dpi。

原则上,可以将逻辑反转并获得箭头。但我认为那将是乏味的。所以更好的方法是,从“线”获得特定流线的所有部分。映射到3d并使用一个或多个段绘制三维箭头,具体取决于您想要的箭头密度。

从“行”获得个别流线的条件是。 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)