在python2.7中绘制4D图

Jan*_*ora 3 python plot numpy matplotlib scipy

我想在三个轴上绘制红色,蓝色和绿色的颜色,并在python2.7中存储对每种颜色组合进行修改的值的数组....当我运行我的程序要么24小时没有响应或者它给了我记忆错误.这是我的代码:

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()
Run Code Online (Sandbox Code Playgroud)

请帮忙.我已经阅读了之前的帖子,并且已经使用过它们,但我仍然遇到内存错误.这里p是包含红色,绿色和蓝色组合的值.为简单起见,我已将其初始化为零...它给出以下错误..colset.append(fcolors [rs] [cs])IndexError:index out of bounds

mat*_*att 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()
Run Code Online (Sandbox Code Playgroud)

其次,更重要的是,你没有正确使用plot_surface().根据文档,X,Y和Z应该是2D数组.X和Y放下2D网格,Z为2D网格上的每个点提供"高度".如果要手动设置facecolor,它也应该是2D数组.您应该查看文档中的示例以获取工作示例.

编辑:

我不确定你的情节是什么样的,所以让我们来看看MPL演示.

进行必要的导入并创建一个轴对象(您的正确执行此操作):

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')
Run Code Online (Sandbox Code Playgroud)

接下来,制作一个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)
Run Code Online (Sandbox Code Playgroud)

让我们首先绘制最简单的事情.没有颜色,默认消除锯齿,线条等

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在添加颜色.请注意,颜色来自Z组件.

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在手动控制颜色(MPL灵感).

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果要根据其他指标进行着色,可以创建自己的颜色表.关于如何做到这一点,有很多回答的问题.

编辑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,)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述