2016-06-28 7 views
2

を使用して、シリンダの個々の顔に色を追加する私は、しかし、私はそれについて移動する方法がわからないです、私は次のことを試してみました、シリンダーの個々の顔に色をしようとしています:方法matplotlibの

for i in range(10): 
    col.append([]) 


for i in range(10): 
    for j in range(20): 

     col[i].append(plt.cm.Blues(0.4)) 

ax.plot_surface(X, Y, Z,facecolors = col,edgecolor = "red") 

私は各面に独自の色を割り当てたいので、2次元配列の各面に色の配列を指定すると思います。 しかし、これはエラーを与える:ここで

in plot_surface 
    colset.append(fcolors[rs][cs]) 
IndexError: list index out of range 

は完全なコードです:

import numpy as np 
from matplotlib import cm 
from matplotlib import pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
from scipy.linalg import norm 
from mpl_toolkits.mplot3d.art3d import Poly3DCollection 


fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
origin = np.array([0, 0, 0]) 

#axis and radius 
p0 = np.array([1, 3, 2]) 
p1 = np.array([8, 5, 9]) 
R = 5 

#vector in direction of axis 
v = p1 - p0 

#find magnitude of vector 
mag = norm(v) 

#unit vector in direction of axis 
v = v/mag 

#make some vector not in the same direction as v 
not_v = np.array([1, 0, 0]) 
if (v == not_v).all(): 
not_v = np.array([0, 1, 0]) 

#make vector perpendicular to v 
n1 = np.cross(v, not_v) 
#normalize n1 
n1 /= norm(n1) 

#make unit vector perpendicular to v and n1 
n2 = np.cross(v, n1) 

#surface ranges over t from 0 to length of axis and 0 to 2*pi 
t = np.linspace(0, mag, 200) 
theta = np.linspace(0, 2 * np.pi, 100) 

#use meshgrid to make 2d arrays 
t, theta = np.meshgrid(t, theta) 

#generate coordinates for surface 
X, Y, Z = [p0[i] + v[i] * t + R * np.sin(theta) * n1[i] + R * np.cos(theta) *  n2[i] for i in [0, 1, 2]] 
col = [] 
for i in range(10): 
    col.append([]) 
for i in range(10): 
    for j in range(20): 

     col[i].append(plt.cm.Blues(0.4)) 

ax.plot_surface(X, Y, Z,facecolors = col,edgecolor = "red") 

#plot axis 
ax.plot(*zip(p0, p1), color = 'red') 
ax.set_xlim(0, 10) 
ax.set_ylim(0, 10) 
ax.set_zlim(0, 10) 
plt.axis('off') 
ax.axes.get_xaxis().set_visible(False) 
ax.axes.get_yaxis().set_visible(False) 
plt.show() 

答えて

4

あなたZ配列のサイズが100x200であり、まだあなただけ10x20色を指定しています。生成

col1 = plt.cm.Blues(np.linspace(0,1,200)) # linear gradient along the t-axis 
col1 = np.repeat(col1[np.newaxis,:, :], 100, axis=0) # expand over the theta-axis 

col2 = plt.cm.Blues(np.linspace(0,1,100)) # linear gradient along the theta-axis 
col2 = np.repeat(col2[:, np.newaxis, :], 200, axis=1) # expand over the t-axis 

ax=plt.subplot(121, projection='3d') 
ax.plot_surface(X, Y, Z, facecolors=col1) 

ax=plt.subplot(122, projection='3d') 
ax.plot_surface(X, Y, Z, facecolors=col2) 

:(右寸法)colを作るための迅速な方法のようなものかもしれない

enter image description here

+0

なぜそれが私がCOL1 = PLTへの最初の行を変更した場合ということです。 cm.Blues(np.ones(200))シェーディングが違うのですか?それはすべて同じではないはずですか? – fosho

+1

私は色が同じだと思う、matplotlibが追加する陰影効果のためちょっと違って見える – Bart

+0

これをどうやって削除できますか? – fosho

関連する問題