如何在matplotlib中将矩阵绘制为3D imshow图?

a6b3iqyw  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(102)

我试图在matplotlib中绘制一个4x4数组作为3D图,但我遇到了plot_surface函数的问题。生成的图形仅显示具有3x3颜色栅格的曲面,而不是4x4颜色栅格。我怀疑plot_surface可能不是可视化完整矩阵的合适方法。我想实现类似于“3D imshow”的可视化,但我不确定这是否可以在matplotlib中实现。
我在下面提供了一个最小的可重复示例:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.meshgrid(range(0, 4), range(0, 4))
z = -0.5 * x + 0.5 * y

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.plot_surface(x, y, z, cstride=1, rstride=1, shade=False, cmap='plasma')
ax.plot_wireframe(x, y, z)
ax.set_aspect('equal', adjustable='box')
plt.show()

字符串


的数据
有没有办法修改这段代码,将完整的4x4矩阵绘制成3D图?或者,matplotlib中是否有一种替代方法,可以让我可视化曲面图中的所有值?我将非常感谢任何见解或建议。谢谢你,谢谢

ryhaxcpt

ryhaxcpt1#

此答案将创建3D条形图作为表示数据的替代方法。这将允许您可视化曲面,其中每个列表示单个z值。还可以通过旋转图以显示“底部”来查看阵列的展平的热图。
NOTE:我使用了一个不同的、更大的样本集来创建示例。这只是为了表明该方法适用于更复杂的输入。

输出示例


的数据
这是一个更大样本集的条形图。您可以清楚地看到所表示的数据,即使数据的“表面”并不平坦。



这是该图的自底向上视图。它表示输入数据的热图。

代码

from matplotlib import cbook
from matplotlib import cm
import matplotlib.colors as colors
import matplotlib.pyplot as plt
import numpy as np

# Load and format data
dem = cbook.get_sample_data('jacksboro_fault_dem.npz', np_load=True)
z = dem['elevation']
nrows, ncols = z.shape
x = np.linspace(dem['xmin'], dem['xmax'], ncols)
y = np.linspace(dem['ymin'], dem['ymax'], nrows)
x, y = np.meshgrid(x, y)

region = np.s_[5:50, 5:50]
x, y, z = x[region].ravel(), y[region].ravel(), z[region].ravel()

# parameters for bar3d(...) func
bottom = np.full_like(z, np.min(z))
width = (np.max(x)-np.min(x))/np.sqrt(np.shape(x)[0])
depth = (np.max(y)-np.min(y))/np.sqrt(np.shape(y)[0])

# creating color_values for the figure
offset = z + np.abs(z.min())
fracs = offset.astype(float)/offset.max()
norm = colors.Normalize(fracs.min(), fracs.max())
color_values = cm.jet(norm(fracs.tolist()))

# Set up and display the plot
fig, ax = plt.subplots(subplot_kw=dict(projection='3d'))
ax.bar3d(x,y,bottom,width,depth,z, color=color_values, shade=True)

## Used to view the figure from the bottom
# ax.view_init(270, 0)

plt.show()

字符串
这样有用吗

文档

3D Bar Charts from Matplotlib
Another example using the sample data from Matplotlib

相关问题