我有一个 2D numpy 数组,我想用 3D 绘制它。我听说过 mplot3d,但我无法正常工作
这是我想做的一个例子。我有一个尺寸为(256,1024)的数组。它应该绘制一个 3D 图形,其中 x 轴从 0 到 256,y 轴从 0 到 1024,图形的 z 轴显示每个条目的数组值。
我该怎么做?
听起来您正在尝试创建一个曲面图(或者您可以绘制一个线框图或填充的平面图。
根据问题中的信息,您可以尝试以下方式:
import numpy
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# Set up grid and test data
nx, ny = 256, 1024
x = range(nx)
y = range(ny)
data = numpy.random.random((nx, ny))
hf = plt.figure()
ha = hf.add_subplot(111, projection='3d')
X, Y = numpy.meshgrid(x, y) # `plot_surface` expects `x` and `y` data to be 2D
ha.plot_surface(X, Y, data)
plt.show()
显然,您需要选择比使用更合理numpy.random
的数据才能获得合理的表面。
您可以使用函数bar3d尝试 3D 条形图。
假设你有一个维度为 (25, 10) 的数组 A,索引为 (i, j) 的值是 A[i][j]。以下代码示例可以为您提供 3D 条形图,其中每个条形的高度为 A[i][j]。
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
np.random.seed(1234)
fig = plt.figure()
ax1 = fig.add_subplot(111, projection='3d')
A = np.random.randint(5, size=(25, 10))
x = np.array([[i] * 10 for i in range(25)]).ravel() # x coordinates of each bar
y = np.array([i for i in range(10)] * 25) # y coordinates of each bar
z = np.zeros(25*10) # z coordinates of each bar
dx = np.ones(25*10) # length along x-axis of each bar
dy = np.ones(25*10) # length along y-axis of each bar
dz = A.ravel() # length along z-axis of each bar (height)
ax1.bar3d(x, y, z, dx, dy, dz)
但是,为您的维度 (256, 1024) 问题绘制图可能会很慢。
您可以在Matplotlib 库的示例之一中找到答案;3D 示例即将结束。
更一般地说,Matplotlib 库是一个很好的第一站资源,用于查找如何做一些绘图。
我查看的示例基本上适用于三个二维数组:一个包含所有 x 值,一个包含所有 y 值,最后一个包含所有 z 值。因此,一种解决方案是创建 x 和 y 值的数组(meshgrid()
例如,使用 )。
您还可以使用oct2py模块,它实际上是一个 python-octave 桥。使用它你可以利用八度音程的功能,你可以得到你需要的东西,而且它也很容易。
查看此文档:https ://www.gnu.org/software/octave/doc/v4.0.1/Three_002dDimensional-Plots.html
例如:
from oct2py import octave as oc
tx = ty = oc.linspace (-8, 8, 41)
[xx, yy] = oc.meshgrid (tx, ty)
r = oc.sqrt (xx * xx + yy * yy) + oc.eps()
tz = oc.sin (r) / r
oc.mesh (tx, ty, tz)
上面是 python 代码,与上面文档中以 octave 实现的第一个示例相同。