Вы можете использовать plot_surface
, как предложено в в этом ответе , в такой функции:
import numpy as np
import scipy.interpolate
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# Plot slices of the data at the given coordinates
def plot_slices(x, y, z, data, xslice, yslice, zslice, ax=None):
if ax is None:
ax = plt.figure().add_subplot(111, projection='3d')
# Normalize data to [0, 1] range
vmin, vmax = data.min(), data.max()
data_n = (data - vmin) / (vmax - vmin)
# Take slices interpolating to allow for arbitrary values
data_x = scipy.interpolate.interp1d(x, data, axis=0)(xslice)
data_y = scipy.interpolate.interp1d(y, data, axis=1)(yslice)
data_z = scipy.interpolate.interp1d(z, data, axis=2)(zslice)
# Pick color map
cmap = plt.cm.plasma
# Plot X slice
xs, ys, zs = data.shape
xplot = ax.plot_surface(xslice, y[:, np.newaxis], z[np.newaxis, :],
rstride=1, cstride=1, facecolors=cmap(data_x), shade=False)
# Plot Y slice
yplot = ax.plot_surface(x[:, np.newaxis], yslice, z[np.newaxis, :],
rstride=1, cstride=1, facecolors=cmap(data_y), shade=False)
# Plot Z slice
zplot = ax.plot_surface(x[:, np.newaxis], y[np.newaxis, :], np.atleast_2d(zslice),
rstride=1, cstride=1, facecolors=cmap(data_z), shade=False)
return xplot, yplot, zplot
Затем вы можете использовать ее следующим образом:
import numpy as np
np.random.seed(0)
x = np.linspace(0, 10, 10)
y = np.linspace(20, 50, 30)
z = np.linspace(-10, 5, 15)
t = np.random.random((10, 30, 15))
ax = plt.figure().add_subplot(111, projection='3d')
plot_slices(x, y, z, t, 5, 35, 0, ax=ax)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
Вывод:
К сожалению, Matplotlib плохо обрабатывает пересекающиеся 3D-объекты, и отсечение некорректно, но этодругой тип вопроса.