2012-02-09 73 views
3

我需要生成一堆二维极坐标图(3D圆柱图),以便我可以查看扭曲圆柱体。我想使用matplotlib,因为我已经安装了它并且希望将我的代码分发给其他只有matplotlib的人。例如,假设我有一堆二维数组。有没有什么办法可以做到这一点,而无需下载外部软件包?这是我的代码。使用Matplotlib/Python创建极地图的堆栈

#!usr/bin/env python 
import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(-180.0,190.0,10) 
theta = (np.pi/180.0)*x # in radians 

A0 = 55.0 
offset = 60.0 

R = [116.225,115.105,114.697,115.008,115.908,117.184,118.61,119.998,121.224,122.216,\ 
122.93,123.323,123.343,122.948,122.134,120.963,119.575,118.165,116.941,116.074,115.66\ 
,115.706,116.154,116.913,117.894,119.029,120.261,121.518,122.684,123.594,124.059,\ 
123.917,123.096,121.661,119.821,117.894,116.225] 

fig = plt.figure() 
ax = fig.add_axes([0.1,0.1,0.8,0.8],polar=True)  # Polar plot 
ax.plot(theta,R,lw=2.5) 
ax.set_rmax(1.5*(A0)+offset) 
plt.show() 

我有10个更相似的2D极地情节,我想堆叠起来很好。如果有更好的方式来以3D形式显示扭曲的圆柱体,我完全接受建议。任何帮助,将不胜感激。谢谢!

回答

5

如果要使用matplotlib来堆叠极坐标图,一种方法是使用Axes3D模块。你会注意到我先使用了极坐标,然后在准备绘制它们时将它们转换回笛卡儿。

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

n = 1000 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

for k in linspace(0, 5, 5): 
    THETA = linspace(0, 2*pi, n) 
    R  = ones(THETA.shape)*cos(THETA*k) 

    # Convert to Cartesian coordinates 
    X = R*cos(THETA) 
    Y = R*sin(THETA) 

    ax.plot(X, Y, k-2) 

plt.show() 

enter image description here

如果你用ax.plot最后一个参数玩,它控制每个片的高度。例如,如果要将所有数据投影到单个轴上,则可以使用ax.plot(X, Y, 0)。对于一个更奇特的例子,你可以将数据的高度映射到一个函数上,比如一个马鞍ax.plot(X, Y, -X**2+Y**2)。通过玩颜色,你可以在理论上代表多个4维数据集(尽管我不确定这是多么清晰)。示例如下:

enter image description here

+0

非常感谢!我想我根本没有做笛卡尔转换的极地。情节堆积看起来很棒。 – prrao 2012-02-09 16:40:34

+0

一个快速问题。我可以渲染一个表面到堆积的地块吗?这将使它看起来更好 – prrao 2012-02-09 17:14:26

+0

@prrao是的,开始寻找的好地方是'contour3D'(见http://www.scipy.org/Cookbook/Matplotlib/mplot3D)。如果您需要等高线图的帮助,可能需要提出一个新问题。 – Hooked 2012-02-09 17:28:39