我有一组子图,如下图所示,但我想将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数组形式。
这是我目前正在制作的图像,很难从我正在使用的数据库中制作出最小的示例,但基本上我想将所有这些子图格式化为一个图。
1条答案
按热度按时间btxsgosb1#
您可以通过
np.histogram2d
计算ax.hist2d
的信息,然后使用这些值为可在3D中定位的网格着色。下面是一些代码来演示这个想法。这个代码还反转了x轴,并使用顺序
X, -Z, Y
来绘制散点图,就像在原始问题中一样。由于散点图看起来非常忙碌,所以可以忽略它。