2012-01-26 116 views
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是包含紅色,綠色和藍色組合的值。爲簡單起見,我已將其初始化爲零...它給出以下錯誤..colset.append(fcolors [rs] [cs]) IndexError:index out of bounds

+0

究竟是什麼錯誤消息? – kmote 2012-01-27 00:00:40

+0

回溯(最近呼叫最後): 文件「C:/Python27/try2.py」,第22行,在 N.append(prob_Skin [i,j,k]) MemoryError ---是錯誤消息 – 2012-01-27 00:01:28

+0

程序的哪個部分會出現內存錯誤?是在你追加到N的時候嗎?如果是這樣,可以通過cm.jet()生成器而不是整個列表N.例如取下線N.append(P [i,j,k]),取而代之,在下一行有N =(p [i,j,k]代表i代表X代表j代表Y代表Z代表K) – 2012-01-27 00:05:18

回答

8

首先,您的程序很慢,因爲您我們正在做大量不必要的工作,建設N。您正在構建一個70 MB的列表,每次只有幾個字節(256 * 256 * 256 = 16,777,216個附加!)。一個更好的(更快,內存使用效率)的方式來建立p是使用numpy的字節數組廣播,然後再用p,使N

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應該是二維數組。 X和Y放置2D網格,Z爲該2D網格上的每個點提供「高度」。如果你想手動設置facecolor,它也應該是一個二維數組。您應該查看文檔中的示例以查找示例。

編輯:

我不知道你的陰謀的目的是什麼樣子,所以讓我們通過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序列。對於一些像X你紅,綠Y上的描述,你可以這樣做:

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

感謝您的幫助。根據你的建議,我已經對這個問題進行了修改。仍然是給我錯誤,請幫助 – 2012-01-27 08:11:55

+0

有人可以請幫助...我已經嘗試過各種形式,但仍然沒有得到所需的答案 – 2012-01-27 08:48:22