Matplotlib 2d剧情在3d剧情的面孔

时间:2014-11-18 17:14:53

标签: python matplotlib plot 3d 2d

我正在轨道中的特定点生成航天器轨迹。 我有一段代码在3dMatplotlib中产生一个3d线图(这里显示了我的代码和图形的一部分(我已经大大减少了X,Y,Z中的点数到每个阵列~20个以简化它更容易复制和粘贴原理相同):

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D
from numpy import *

XdS=[14.54156005,  14.53922242,  14.53688586,  14.53454823, 14.5322106 ,  14.52987297, 14.52753426,  14.52519555, 14.52285792,  14.52051922,  14.51818051, 14.51584073, 14.51350095, 14.51116117, 14.5088214 , 14.50648162, 14.50414076,  14.50179991,  14.49945906,  14.49711821]
YdS=[31.13035144,  31.12920087,  31.12805245,  31.12690188, 31.12575131,  31.12460073,  31.12345016,  31.12229745, 31.12114473,  31.11999201,  31.1188393 , 31.11768443, 31.11652957,  31.11537471, 31.11421984, 31.11306283, 31.11190582,  31.11074882,  31.10959181,  31.1084348]
ZdS=[3.94109446,  3.94060316,  3.94011186,  3.93962083,  3.93912926, 3.93863796,  3.93814639,  3.93765482,  3.93716325,  3.93667169, 3.93617985,  3.93568828,  3.93519618,  3.93470434,  3.9342125 , 3.9337204 ,  3.93322829,  3.93273592,  3.93224382,  3.93175144]

fig=plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(XdS,YdS,ZdS,c='black',linewidth=2)
ax.set_xlabel('XKSM (Saturn Radii)')
ax.set_ylabel('YKSM (Saturn Radii)')
ax.set_zlabel('ZKSM (Saturn Radii)')
plt.show()

我想要做的是能够在该图的边缘/平面上绘制2d图X对Y,X对Z和Y对Z,即显示3轨迹在3中看起来如何2d平面并在当前图的每个轴上显示它们。 (它实际上并不像听起来那么复杂,因为我已经有了轨迹的X,Y,Z值)。在这里我找到了一个类似的例子来实现这一点,但是利用了所有的3d绘图函数,可以在http://matplotlib.org/1.3.1/examples/mplot3d/contour3d_demo3.html获得:如果你看看检查链接,它将显示我想要实现的图像类型。

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import cm

fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3)
cset = ax.contour(X, Y, Z, zdir='z', offset=-100, cmap=cm.coolwarm)
cset = ax.contour(X, Y, Z, zdir='x', offset=-40, cmap=cm.coolwarm)
cset = ax.contour(X, Y, Z, zdir='y', offset=40, cmap=cm.coolwarm)

ax.set_xlabel('X')
ax.set_xlim(-40, 40)
ax.set_ylabel('Y')
ax.set_ylim(-40, 40)
ax.set_zlabel('Z')
ax.set_zlim(-100, 100)

plt.show()

理论上这正是我所需要的,就像它对3d情况的平面视图一样。但是我不能在3d轴上实现2d线图,也不能在2d图中使用offset命令(得到错误:TypeError:没有线属性"偏移")。

是否有2d相当于3d“offset”命令,是否可以按照我的要求在3d图的平面上绘制2d值?还有一种方法可以绘制初始化3d投影的2d线吗?任何人都可以提出任何想法/指向我一般的任何方向来帮助我实现这个目标吗?

如果这篇文章的任何部分出现故障,请提前致以诚挚的谢意,这是我的第一个!

1 个答案:

答案 0 :(得分:2)

试试这个:

xmin = min(XdS)
ymax = max(YdS)
zmin = min(ZdS)
length_of_array = len(XdS)
xmin_array = [xmin] * length_of_array
ymax_array = [ymax] * length_of_array
zmin_array = [zmin] * length_of_array
fig=plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(XdS,YdS,ZdS,zdir='z', c='r')
ax.plot(XdS,YdS,zmin_array, zdir='z', c='g')
ax.plot(xmin_array, YdS, ZdS, 'y')
ax.plot(XdS,ymax_array,ZdS,'b')
ax.set_xlabel('XKSM (Saturn Radii)')
ax.set_ylabel('YKSM (Saturn Radii)')
ax.set_zlabel('ZKSM (Saturn Radii)')
plt.show()

enter image description here