【发布时间】:2021-07-22 23:45:15
【问题描述】:
我有两个要在 3D 视图中叠加显示的热图。热图是用 imshow() 绘制的,它正确地将数据的每个元素设置为图中的彩色方块。但是,当使用 plot_surface() 绘制相同的热图时,现在每个角都代表每个元素。请注意,第一个图有 15x15 的方格,每个方格的中间都有刻度,第二个图只有 14x14 的方格,每个方格的角落都有刻度。由于我正在处理离散数据并且对每个 (x,y) 组合感兴趣,因此第二种表示没有意义。
如何使 3D 热图以与 2D 热图相同的方式显示?也就是说,我如何绘制一个 3D 图,在每个正方形的中间设置 x 和 y 刻度,并正确绘制 15x15 元素? (请注意,当前热图中的颜色与 2D 到 3D 的情况不同,这很好)
代码
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# Dummy data
X = range(2, 16+1)
Y = range(2, 16+1)
xs, ys = np.meshgrid(X, Y)
zs1 = np.random.rand(15,15)
zs2 = np.random.rand(15,15)
# Imshow 2D plot
_, (ax1, ax2) = plt.subplots(2,1)
plot = ax1.imshow(np.flip(zs1, 0), cmap=plt.cm.RdYlGn, interpolation='none', extent=[1.5, 16.5, 1.5, 16.5])
plot = ax2.imshow(np.flip(zs2, 0), cmap=plt.cm.RdYlGn, interpolation='none', extent=[1.5, 16.5, 1.5, 16.5])
plt.draw()
# Surface 3D plot
fig = plt.figure()
ax2 = Axes3D(fig)
plot = ax2.plot_surface(xs, ys, zs1, rstride=1, cstride=1,
antialiased=False, linewidth=0, cmap=plt.cm.RdYlGn)
plot = ax2.plot_surface(xs, ys, zs2 + 1000, rstride=1, cstride=1,
antialiased=False, linewidth=0, cmap=plt.cm.RdYlGn)
plt.show()
2D 热图。请注意,每个正方形的中间有 15x15 个元素和刻度。
3D 热图。请注意,每个正方形的角上只有 14x14 个元素和刻度。我希望这些以与 2D 热图相同的方式显示!!
【问题讨论】:
标签: python matplotlib plot heatmap