如何重新格式化数据以制作4维热图(3个空间维度+强度)

0 投票
1 回答
989 浏览
提问于 2025-04-18 06:21

我想做一个像这样的图:

在这里输入图片描述

关于怎么做的代码可以在这里找到:

如何在Matplotlib中绘制3D热图颜色

不过,我的数据格式和例子中的有点不同。具体来说,我有一个3x3x3的矩阵,表示一个三参数空间的数据(我把这三个参数叫做'sigma'、'mu'和'accuracy'),每个矩阵元素代表该位置(i,j,k)的数据强度,像这样:

>>> defect_averaged
array([[[ 15.81818182,  16.90909091,   6.72727273],
        [ 15.63636364,  19.81818182,   6.        ],
        [  1.09090909,  15.63636364,   6.        ]],

       [[ 16.36363636,  16.        ,   5.45454545],
        [ 11.81818182,  15.09090909,   5.27272727],
        [  1.09090909,  16.72727273,   5.81818182]],

       [[ 11.27272727,  18.36363636,   5.63636364],
        [ 10.36363636,  17.27272727,   6.        ],
        [  0.        ,  17.09090909,   8.18181818]]])

所以defect_averaged[0,0,0]的强度是15.81,等等。

还有一个问题是,我想要一个正确缩放的图,刻度标签显示为.001、.01、.1,而不是显示数组的索引(比如0、1、2)。这是因为这些参数只在某些特定的值上进行了评估。例如,强度只在sigma = [.001, .01, .1]mu = [.001, .01, .1]accuracy = [.51,.6,.9]上进行了评估。因此我得到了这个3x3x3的数据数组。

有没有什么好的方法可以处理我的数据,以便能轻松绘制成热图呢?非常感谢你的时间!

1 个回答

0

你需要输入具体的数值,然后把所有东西转换成简单的数组。

defect = defect_averaged.flatten()
sigma_flat = np.tile(sigma, 9)    # This gives you [.001, .01, .1, .001, .01, .1...]
mu_flat = np.tile(np.repeat(sigma, 3), 3)     # This is to get [.001, .001, .001, .1, .1....001, .001, .001, .1, .1...]
accuracy_flat = np.repeat(accuracy, 9)   # This gives you [.51, .51, .51, .51,....

接着就可以用你喜欢的方法来绘制图形了:

plt.scatter(sigma_flat, mu_flat, accuracy_flat, defect)

撰写回答