2012-01-26 33 views
3

私は3軸上に赤、青、緑の色をプロットし、python2.7で各色の組み合わせに対応する値を格納する配列を作成したい。 24時間応答しなくなるか、メモリエラーが発生します。ここに私のコードです:python2.7でプロット4Dグラフ

import pylab 
import math 
from itertools import product 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
import matplotlib.pyplot as plt 
import numpy as np 

N=[] 
p=np.zeros((256,256,256)) 
S=[] 
fig=plt.figure() 
ax=fig.gca(projection='3d') 
X=np.arange(0,256,1) #for one of the features either red, blue or green 
Y=np.arange(0,256,1) 
X,Y = np.meshgrid(X,Y) 
R=np.sqrt(X**2 + Y**2) 
Z=R/np.sqrt(2) 
N=p.flatten(); 
N=(p[i,j,k] for k in Z)    
surf=ax.plot_surface(X,Y,Z, rstride=1, cstride=1, 
        facecolors=cm.jet(N), 
        linewidth=0, antialiased=False, shade=False) 
plt.show() 

助けてください。私は以前の投稿を読んだことがありますが、まだ私はメモリエラーが発生しています。ここで、pは赤、緑、青の組み合わせの値を含む。わかりやすくするために、私は0に初期化しました。次のエラーが発生しました。... colset.append(fcolors [rs] [cs])IndexError:インデックスが範囲外です。

+0

エラーメッセージは正確には何ですか? – kmote

+0

トレースバック(直前の最後の呼び出し): ファイル "C:/Python27/try2.py"、行22、 N.append(prob_Skin [i、j、k]) MemoryErrorはエラーメッセージです –

+0

プログラムのどの部分にメモリエラーがありますか?あなたがNに追加している間ですか?もしそうなら、リスト全体の代わりにジェネレータをcm.jet()に渡すことが可能です。次の行に、N.append(P [i、j、k])を取り、代わりに、ZのKについて、YのjについてXのiのN =(p [i、j、k)] –

答えて

8

まず、不必要な作業をたくさんやっているN。一度に数メガバイトのリストを作成しています(256 * 256 * 256 = 16,777,216追加!)。 pを構築するためのより良い(より速く、メモリ効率的な)方法は、numpyのの配列放送を使用して、Nを作るためにpを再利用することです:

import numpy as np 
a = np.arange(256) 
p = a[:,np.newaxis,np.newaxis] * a[np.newaxis,:,np.newaxis] * a[np.newaxis,np.newaxis,:] 
N = p.flatten() 

もっと重要なのは第二と、あなたは正確に)(plot_surfaceを使用していません。 docsによると、X、Y、Zは2D配列でなければなりません。 XとYは2Dグリッドをレイアウトし、Zはその2Dグリッド上の各ポイントの「高さ」を提供します。 Facecolorを手動で設定する場合は、2D配列である必要があります。実際の例については、ドキュメントの例を参照する必要があります。

EDIT:

私はそうMPL demoを歩くことができます、あなたのプロットが見えるように意図されているものはよく分かりません。

必要なインポートを実行すると、軸オブジェクトを作成します(あなたはこれを正しく行います):

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
from matplotlib.ticker import LinearLocator, FormatStrFormatter 
import matplotlib.pyplot as plt 
import numpy as np 

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

次に、X/Yグリッドを作成し、あなたのプログラムではZ.対応する、X、YおよびZは1Dです。それらはサーフェスではなく3D空間内の線を記述します。

X = np.arange(-5, 5, 0.25) 
Y = np.arange(-5, 5, 0.25) 
X, Y = np.meshgrid(X, Y) # <-- returns a 2D grid from initial 1D arrays 
R = np.sqrt(X**2 + Y**2) 
Z = np.sin(R) 

最初に最も簡単なことをプロットします。何色、デフォルトのアンチエイリアシング、ラインなど

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1) 
plt.show() 

enter image description here

は今色を追加しません。色はZ成分から来ていることに注意してください。

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet) 
plt.show() 

enter image description here

今手動色(MPL inspiration)を制御します。

colortuple = ('y', 'k') # only use two colors: yellow and black 
xlen, ylen = X.shape # get length of 
colors = np.empty(X.shape, dtype=str) # make a 2D array of strings 
for i in range(xlen): 
    for j in range(ylen): 
     index = (i + j) % 2 # alternating 0's and 1's 
     colors[i,j] = colortuple[index] 
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, 
     facecolors=colors) 

enter image description here

あなたには、いくつかの他のメトリックに基づいた色にしたい場合は、独自のカラーマップを作成することができます。それを行う方法には多くの答えがあります。

編集2:

色もRGB配列として指定することができます。Yの説明に緑のX上の赤、のようなもののためにあなたがこれを行うことができます:

xlen, ylen = X.shape 
colors = np.zeros((xlen,ylen,3)) 
jspan = np.linspace(0., 1., ylen) 
ispan = np.linspace(0., 1., xlen) 
for i in range(xlen): 
    colors[i,:,0] = jspan 
for j in range(ylen): 
    colors[:,j,1] = ispan 

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=colors,) 

enter image description here

+0

助けてくれてありがとう。私はあなたの提案に基づいて質問の変更を行いました。まだそれは私にエラーを与えている、助けてください –

+0

誰かが助けてください...私は様々な形式を試みたが、まだ私は必要な答えを得ていない –

関連する問題