3D дискретная тепловая карта в матплотлибе

У меня есть список кортежей в Python, содержащий 3-мерные данные, где каждый кортеж имеет форму: (x, y, z, data_value), то есть, у меня есть значения данных по каждой координате (x, y, z). Я хотел бы сделать трехмерный дискретный график тепловой карты, где цвета представляют значение data_values ​​в моем списке кортежей. Здесь я приведу пример такой тепловой карты для набора 2D-данных, где у меня есть список (x, y, data_value) кортежей:

import matplotlib.pyplot as plt
from matplotlib import colors
import numpy as np
from random import randint

# x and y coordinates
x = np.array(range(10))
y = np.array(range(10,15))
data = np.zeros((len(y),len(x)))

# Generate some discrete data (1, 2 or 3) for each (x, y) pair
for i,yy in enumerate(y):
    for j, xx in enumerate(x):
        data[i,j] = randint(1,3)

# Map 1, 2 and 3 to 'Red', 'Green' qnd 'Blue', respectively
colormap = colors.ListedColormap(['Red', 'Green', 'Blue'])
colorbar_ticklabels = ['1', '2', '3']

# Use matshow to create a heatmap
fig, ax = plt.subplots()
ms = ax.matshow(data, cmap = colormap, vmin=data.min() - 0.5, vmax=data.max() + 0.5, origin = 'lower')

# x and y axis ticks
ax.set_xticklabels([str(xx) for xx in x])
ax.set_yticklabels([str(yy) for yy in y])
ax.xaxis.tick_bottom()

# Put the x- qnd y-axis ticks at the middle of each cell 
ax.set_xticks(np.arange(data.shape[1]), minor = False)
ax.set_yticks(np.arange(data.shape[0]), minor = False)

# Set custom ticks and ticklabels for color bar
cbar = fig.colorbar(ms,ticks = np.arange(np.min(data),np.max(data)+1))
cbar.ax.set_yticklabels(colorbar_ticklabels)

plt.show()

Это создает сюжет, как это:

Как я могу сделать аналогичный график в 3D-пространстве (то есть, имея ось Z), если мои данные имеют третье измерение. Например, если

# x and y and z coordinates
x = np.array(range(10))
y = np.array(range(10,15))
z = np.array(range(15,20))
data = np.zeros((len(y),len(x), len(y)))

# Generate some random discrete data (1, 2 or 3) for each (x, y, z) triplet. 
# Am I defining i, j and k correctly here?
for i,yy in enumerate(y):
    for j, xx in enumerate(x):
        for k, zz in enumerate(z):
            data[i,j, k] = randint(1,3)

Я звучу какplot_surface в mplot3d должно быть в состоянии сделать это, но z на входе этой функции по существу является значением данных в координате (x, y), т. е. (x, y, z = data_value), которое отличается от того, что у меня есть, т.е. (x, y, z, data_value).

Ответы на вопрос(1)

Ваш ответ на вопрос