使用mplot3d绘制二维数组的图表

24

我有一个2D的numpy数组,想要在3D中进行绘制。我听说过mplot3d,但无法使其正常工作。

这是我想要做的示例。我有一个尺寸为(256,1024)的数组。应该绘制一个3D图形,其中x轴从0到256,y轴从0到1024,而图形的z轴显示每个条目处数组的值。

我该怎么做呢?

4个回答

30

听起来你想创建一个surface图(或者你可以绘制一个wireframe图或一个filled countour plot)。

从问题中的信息来看,你可以尝试以下方法:

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更明智的数据。

1
谢谢你的回答 ;) 也许我有点傻,但我真的不知道如何将我的二维数组分成两个二维数组和一个列表 :o - Fourier
2
你的二维数组在上面的代码中被简单地称为 data,它的大小被称为 nxny。希望这可以让你开始工作。 - Eric O. Lebigot
14
在Python 3.6中执行你的代码会导致错误:"b = np.broadcast(*args[:32]) ValueError: shape mismatch: objects cannot be broadcast to a single shape"。 - Karlo
你会如何为此添加一个颜色条和坐标轴标签? - ALUW
3
我不确定这个答案适用于哪个版本的Python,因此我不会编辑你的回答。但是对于至少使用Python 3.6的用户,请将plot_surface命令更改为:ha.plot_surface(X.T, Y.T, data)。然后您将得到一个正确的结果。 - zwep
显示剩余5条评论

3
您可以尝试使用函数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)

在我设定种子为1234的电脑上,我得到了以下图表:

enter image description here

但是,如果你的问题维度为(256,1024),制作这张图可能会很慢。


2
你可以在Matplotlib画廊的示例中找到答案; 3D示例在最后面。
更一般地说,Matplotlib画廊是一个很好的第一站资源,用于查找如何绘制某些图形。
我查看的示例基本上使用三个二维数组:一个包含所有x值,一个包含所有y值,最后一个包含所有z值。 因此,一种解决方案是创建x和y值的数组(例如使用meshgrid())。

0
你也可以使用oct2py模块,它实际上是一个Python-Octave桥接。使用它,你可以利用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中实现的第一个示例相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接