3D 中的 2D 圖像#

這個範例示範如何將 2D 色碼圖像(類似於 Axes.imshow)繪製為 3D 中的平面。

Matplotlib 沒有用於此目的的原生函數。以下我們藉助於 Axes3D.plot_surface 來建構一個。為了簡單起見,與 Axes.imshow 有一些差異:此函數不會設定軸的縱橫比,因此像素不一定是正方形。此外,像素邊緣位於整數值上,而不是像素中心。此外,Axes.imshow 的許多可選參數尚未實作。

預設情況下,多次呼叫 imshow3d 會使用獨立的常態,因此會使用不同的顏色刻度。如果您想要單一的通用顏色刻度,您需要事先建構合適的常態,並將其傳遞給所有 imshow3d 呼叫。

3D 繪圖引擎的基本限制是無法正確繪製相交的物件。一個物件總是在另一個物件之後繪製。因此,如本範例所示,多個影像平面可以很好地用作背景。但如果平面相交,則此方法不適用。

import matplotlib.pyplot as plt
import numpy as np

from matplotlib.colors import Normalize


def imshow3d(ax, array, value_direction='z', pos=0, norm=None, cmap=None):
    """
    Display a 2D array as a  color-coded 2D image embedded in 3d.

    The image will be in a plane perpendicular to the coordinate axis *value_direction*.

    Parameters
    ----------
    ax : Axes3D
        The 3D Axes to plot into.
    array : 2D numpy array
        The image values.
    value_direction : {'x', 'y', 'z'}
        The axis normal to the image plane.
    pos : float
        The numeric value on the *value_direction* axis at which the image plane is
        located.
    norm : `~matplotlib.colors.Normalize`, default: Normalize
        The normalization method used to scale scalar data. See `imshow()`.
    cmap : str or `~matplotlib.colors.Colormap`, default: :rc:`image.cmap`
        The Colormap instance or registered colormap name used to map scalar data
        to colors.
    """
    if norm is None:
        norm = Normalize()
    colors = plt.get_cmap(cmap)(norm(array))

    if value_direction == 'x':
        nz, ny = array.shape
        zi, yi = np.mgrid[0:nz + 1, 0:ny + 1]
        xi = np.full_like(yi, pos)
    elif value_direction == 'y':
        nx, nz = array.shape
        xi, zi = np.mgrid[0:nx + 1, 0:nz + 1]
        yi = np.full_like(zi, pos)
    elif value_direction == 'z':
        ny, nx = array.shape
        yi, xi = np.mgrid[0:ny + 1, 0:nx + 1]
        zi = np.full_like(xi, pos)
    else:
        raise ValueError(f"Invalid value_direction: {value_direction!r}")
    ax.plot_surface(xi, yi, zi, rstride=1, cstride=1, facecolors=colors, shade=False)


fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.set(xlabel="x", ylabel="y", zlabel="z")

nx, ny, nz = 8, 10, 5
data_xy = np.arange(ny * nx).reshape(ny, nx) + 15 * np.random.random((ny, nx))
data_yz = np.arange(nz * ny).reshape(nz, ny) + 10 * np.random.random((nz, ny))
data_zx = np.arange(nx * nz).reshape(nx, nz) + 8 * np.random.random((nx, nz))

imshow3d(ax, data_xy)
imshow3d(ax, data_yz, value_direction='x', cmap='magma')
imshow3d(ax, data_zx, value_direction='y', pos=ny, cmap='plasma')

plt.show()
imshow3d

標籤: 繪圖類型:3D 樣式:色圖 程度:進階

腳本的總執行時間: (0 分鐘 1.042 秒)

由 Sphinx-Gallery 產生圖庫