2017-02-01 123 views
2

有沒有對允許3軸的極座標投影進行調整?我想可能是一個3D散點圖傾斜到2D,所以它排成這樣?pyplotlib/plotly/bokeh中的3軸極座標投影? (蜂巢圖)

我最近發現了約Hive Plots,我想嘗試編碼一個,所以我可以有更多的自由放養的美學,使其看起來更像these guys。我開始嘗試製作一個,但我能想到的唯一方法就是使用這種極座標。

我的問題: 有沒有辦法在matplotlib,plotly或bokeh中獲得3軸極座標? 或者如果不是的話 有沒有辦法修復一個3D情節有這種類型的結構?

fig = plt.figure(figsize=(10,10)) 
ax = plt.subplot(111, polar=True) 
ax.plot(2*[np.pi/2], [0,1], color="black", linewidth=3) 
ax.plot(2*[5*np.pi/4], [0,1], color="black", linewidth=3) 
ax.plot(2*[7*np.pi/4], [0,1], color="black", linewidth=3) 

enter image description here

回答

0

也許一個開始,但我想看看matplotlib 2.0,看3D不如現在

import numpy as np 

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

def Lin3dSeg(a,b): 
    ''' 
    if a, b are spherical coordinate vector tuples, then it 
    returns list of spherical coordinate points of a linear in r, theta, phi 
    3D spiral segment connecting them 
    ''' 
    return [np.linspace(start, stop) for start, stop in zip(a,b)] 

def Sphere2Cart(sphere_pt): # no particular convention, just thrown together 
    x = sphere_pt[0] * np.sin(sphere_pt[1]) 
    y = sphere_pt[0] * np.cos(sphere_pt[1]) 
    z = sphere_pt[0] * np.cos(sphere_pt[2]) 
    return (x, y, z) 

def SphereSegCarts(seg): 
    return [Sphere2Cart(pt) for pt in zip(*Lin3dSeg(*seg))] 

seg_a =((10, 0, 0),(5, np.pi/2, 0)) 
seg_b =((10, np.pi/2, 0),(1, 0, np.pi/2)) 
seg_c =((3, 0, np.pi/2),(10, np.pi/2, np.pi/2)) 


fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.view_init(elev=45, azim=45) 

ax.plot(*zip(*SphereSegCarts(seg_a)), c='r') 
ax.plot(*zip(*SphereSegCarts(seg_b)), c='g') 
ax.plot(*zip(*SphereSegCarts(seg_c)), c='b') 

plt.show() 

enter image description here