2016-04-16 6 views
3

でシリンダー内にコードによって生成enter image description hereは、私はこのようになります数字を持っている現時点でのPython

を2次元の図を変換する:

import matplotlib.pyplot as plt 

import numpy as np 

data = np.random.rand(20,5) 
rows,cols = data.shape 

plt.imshow(data, interpolation='nearest', extent=[0.5, 0.5+cols, 0.5, 0.5+cols], cmap='bwr') 
plt.show() 

私はこれを「折る」したいと思いますが左と右の辺を結合して3D円筒にします(紙の場合と同じように)。言い換えれば、左端と右端は実際に同じ辺であるため、それらを一緒に結合して円筒を形成したいと思います。

どうすればいいですか?

+0

を? – Daniel

+0

はい、3Dシリンダーは私の後ろです – fosho

+0

3D画像を表示できるシステムはありますか? –

答えて

3

Poly3DCollectionは、mplot3dの任意の3Dポリゴンの選択方法です。

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

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

nphi,nz=12,20 
r=1 # radius of cylinder 
phi = np.linspace(0,360, nphi)/180.0*np.pi 
z= np.linspace(0,1.0,nz) 
print z 

facecolors=['r','g','b','y'] 
cols=[] 
verts2 = [] 
for i in range(len(phi)-1): 
    cp0= r*np.cos(phi[i]) 
    cp1= r*np.cos(phi[i+1]) 
    sp0= r*np.sin(phi[i]) 
    sp1= r*np.sin(phi[i+1]) 

    for j in range(len(z)-1): 
     z0=z[j] 
     z1=z[j+1] 
     verts=[] 
     verts.append((cp0, sp0, z0)) 
     verts.append((cp1, sp1, z0)) 
     verts.append((cp1, sp1, z1)) 
     verts.append((cp0, sp0, z1)) 
     verts2.append(verts) 
     value=np.random.rand() 
     print value 
     col=plt.cm.bwr(value) 
     print col 
     cols.append(col) 

poly3= Poly3DCollection(verts2, facecolor=cols ) 

poly3.set_alpha(0.8) 
ax.add_collection3d(poly3) 
ax.set_xlabel('X') 
ax.set_xlim3d(-1, 1) 
ax.set_ylabel('Y') 
ax.set_ylim3d(-1, 1) 
ax.set_zlabel('Z') 
ax.set_zlim3d(0, 1) 
plt.show() 

enter image description here

+1

これを説明するコメントを追加できますか?ありがとう – fosho

+1

また、これはカラーマップを使用していません – fosho

+0

私はカラーマップを追加しました。私の2つのforループでは、各矩形に対して手動で(x、y、z)頂点(4つは「verts」と呼ばれます)を作成しています。右上の '(i + 1、j + 1)'と左上の '(i、j + 1)'は、それぞれ左下 '(i、j)'、右下 '(i + 1、j) '頂点。 x座標は、角度φの余弦で、y座標は同じ角度の正弦となります。 z座標は12ステップ(nz = 12)で0から1に変化します。 'verts2'はすべての矩形の頂点を含むリストです。 – roadrunner66

0

あなたはplot_surface使用することができますあなたは、3D-フィギュアが欲しい

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

np.random.seed(2016) 
data = np.random.rand(12, 20) 
h, w = data.shape 
theta, z = np.linspace(0, 2 * np.pi, w), np.linspace(0, 1, h) 
THETA, Z = np.meshgrid(theta, z)  
X = np.cos(THETA) 
Y = np.sin(THETA) 

fig = plt.figure() 
ax = fig.add_subplot(1,1,1, projection='3d') 
cmap = plt.get_cmap('bwr') 
plot = ax.plot_surface(
    X, Y, Z, rstride=1, cstride=1, facecolors=cmap(data), 
    linewidth=0, antialiased=False, alpha=0.75) 

plt.show() 

利回り

enter image description here

関連する問題