Matplotlib使用轴向散点图和轴表面上的二维直方图绘制三维数字密度图?

ppcbkaq5  于 2023-03-03  发布在  其他
关注(0)|答案(1)|浏览(147)

我有一组子图,如下图所示,但我想将3个ax.hist2d()图应用于曲面上的3d投影,有办法吗?我的数据是一系列x,y,z与相应的kde值计算从scipy.stats.gaussian_kde()给予密度波动。hist2d没有'偏移'参数,我把它添加到第一个图?我需要使用ax.surface_plot()吗?

import numpy as np
import matplotlib.pyplot as plt

X = np.random.normal(5, 2, size=(100,))
Y = np.random.normal(5, 2, size=(100,))
Z = np.random.normal(5, 2, size=(100,))
kde  = np.random.normal(1e-6, 1e-7, size=(100,))

fig = plt.figure(figsize=(12,12))

ax = fig.add_subplot(2, 2, 1, projection='3d')
ax.scatter(X, -Z, Y, c=kde, alpha=1, s=1)
ax.invert_xaxis()
ax.set_xlabel('x (cm)')
ax.set_ylabel('z (cm)')
ax.set_zlabel('y (cm)')

ax1 = fig.add_subplot(2, 2, 2)
ax1.hist2d(X, Y, bins=(50,50))
ax1.invert_xaxis()
ax1.set_xlabel('x (cm)')
ax1.set_ylabel('y (cm)')

ax2 = fig.add_subplot(2, 2, 3)
ax2.hist2d(X, -Z, bins=(50,50))
ax2.invert_xaxis()
ax2.set_xlabel('x (cm)')
ax2.set_ylabel('z (cm)')

ax3 = fig.add_subplot(2, 2, 4)
ax3.hist2d(-Z, Y, bins=(50,50))
ax3.set_xlabel('z (cm)')
ax3.set_ylabel('y (cm)')

plt.show()

^最小工作示例^
我尝试过surface_plot方法,但是没有一个数据是z参数的2D数组形式。
这是我目前正在制作的图像,很难从我正在使用的数据库中制作出最小的示例,但基本上我想将所有这些子图格式化为一个图。

btxsgosb

btxsgosb1#

您可以通过np.histogram2d计算ax.hist2d的信息,然后使用这些值为可在3D中定位的网格着色。
下面是一些代码来演示这个想法。这个代码还反转了x轴,并使用顺序X, -Z, Y来绘制散点图,就像在原始问题中一样。由于散点图看起来非常忙碌,所以可以忽略它。

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(20230223)
M, N = 2000, 6
X = np.random.normal(0, 2, size=(M, N)).cumsum(axis=0).ravel() + 5
Y = np.random.normal(0, 2, size=(M, N)).cumsum(axis=0).ravel() + 5
Z = np.random.normal(0, 2, size=(M, N)).cumsum(axis=0).ravel() + 5

fig = plt.figure(figsize=(12, 12))

ax = fig.add_subplot(1, 1, 1, projection='3d')
ax.scatter(X, -Z, Y, alpha=0.9, s=2)
ax.invert_xaxis()
ax.set_xlabel('x (cm)')
ax.set_ylabel('z (cm)')
ax.set_zlabel('y (cm)')

cmap = plt.cm.YlOrRd

counts, xbins, ybins = np.histogram2d(-Z, Y, bins=(50, 50))
yg, xg = np.meshgrid(ybins, xbins)
norm = plt.Normalize(vmin=1, vmax=counts.max())
counts[counts == 0] = np.nan
ax.plot_surface(np.full_like(xg, X.max()), xg, yg, facecolors=cmap(norm(counts)), rstride=1, cstride=1, shade=False)

counts, xbins, ybins = np.histogram2d(X, Y, bins=(50, 50))
yg, xg = np.meshgrid(ybins, xbins)
norm = plt.Normalize(vmin=1, vmax=counts.max())
counts[counts == 0] = np.nan
ax.plot_surface(xg, np.full_like(xg, -Z.min()), yg, facecolors=cmap(norm(counts)), rstride=1, cstride=1, shade=False)

counts, xbins, ybins = np.histogram2d(X, -Z, bins=(50, 50))
yg, xg = np.meshgrid(ybins, xbins)  # bins as a 2D grid
norm = plt.Normalize(vmin=1, vmax=counts.max())
counts[counts == 0] = np.nan  # make 0 transparent
ax.plot_surface(xg, yg, np.full_like(xg, Y.min()), facecolors=cmap(norm(counts)), rstride=1, cstride=1, shade=False)

plt.show()

相关问题