发布于 2015-05-21 17:52:35
这个例子应该让您开始:
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图形中画出相同的线条:

发布于 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对相同,则为流线结束。
一个天真的解决方案可能是
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)https://stackoverflow.com/questions/30365069
复制相似问题