gpt4 book ai didi

python - 在 python2.7 中绘制 4D 图

转载 作者:太空宇宙 更新时间:2023-11-03 13:04:24 25 4
gpt4 key购买 nike

我想在三个轴上绘制红色、蓝色和绿色,以及一个数组,该数组存储与 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()

请帮忙。我已经阅读了以前的帖子,并使用了它们,但我仍然遇到内存错误。这里 p 是一个包含红、绿、蓝组合的值。为简单起见,我将其初始化为零...它给出了以下错误...colset.append(fcolors[rs][cs])IndexError:索引越界

最佳答案

首先,您的程序很慢,因为您在构建 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是一维的。它们描述的是 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

关于python - 在 python2.7 中绘制 4D 图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9027266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com