2010-02-19 127 views
21

我使用matplotlib这样做Python:如何使用Python绘制三维图形?

from mpl_toolkits.mplot3d import Axes3D 
import numpy as np 
import matplotlib 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = Axes3D(fig) 

x = [6,3,6,9,12,24] 
y = [3,5,78,12,23,56] 

ax.plot(x, y, zs=0, zdir='z', label='zs=0, zdir=z') 

plt.show() 

现在这个建立一个图表,是在三维空间中的水平。我如何使图形垂直以便它面向用户?

我想要做的是构建多个这样的垂直图,它们之间有一定的距离并且面向用户。

+0

想一想,使用3D图形来绘制2D数据不是很傻吗? – badp 2010-02-19 09:16:31

+2

我正在改变一个特定的参数阿尔法(不是x和y),并观察图形中各种alpha值的变化 – Bruce 2010-02-19 09:25:06

回答

11

BP的答案可能工作得很好,但有一个更简单的方法。

您当前的图形在z轴上是'平面',这就是为什么它是水平的。您希望它是垂直的,这意味着您希望它在y轴上“平坦”。这涉及到最微小的修改代码:

from mpl_toolkits.mplot3d import Axes3D 
import numpy as np 
import matplotlib 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = Axes3D(fig) 

x = [6,3,6,9,12,24] 
y = [3,5,78,12,23,56] 
# put 0s on the y-axis, and put the y axis on the z-axis 
ax.plot(xs=x, ys=[0]*len(x), zs=y, zdir='z', label='ys=0, zdir=z') 
plt.show() 

然后你就可以很容易地通过使用不同的值的YS参数有多个这样的图形(例如,ys=[2]*len(x)反而会把图形稍微落后)。

3

根据您要使用ax.plot_surface(x,y,z)方法的文档。更多信息和图表类型here

下面应该工作:

x = [1,2,3] 
y = [4,5,6] 
z = [7,8,9] 
data = zip(x,y,z) 

#map data on the plane 
X, Y = numpy.meshgrid(arange(0, max(x), 1), arange(0, max(y), 1)) 
Z = numpy.zeros((len(Y), len(X)), 'Float32') 
for x_,y_,z_ in data: 
    Z[x_, y_] = z_ #this should work, but only because x and y are integers 
       #and arange was done with a step of 1, starting from 0 
fig = p.figure() 
ax = p3.Axes3D(fig) 
ax.plot_surface(X, Y, Z) 
7

Mayavi,特别是mlab模块,提供强大的3D绘图功能,可处理大型或复杂数据,并且应该易于在numpy阵列上使用。

7

您可以使用view_init()函数设置3d绘图的视角。下面的例子适用于matplotlib的1.1版本。

from mpl_toolkits.mplot3d import axes3d 
import numpy as np 
import matplotlib 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

x = [6,3,6,9,12,24] 
y = [3,5,78,12,23,56] 

ax.plot(x, y, zs=0, zdir='z', label='zs=0, zdir=z') 
ax.view_init(90, -90) 
plt.show()