是否可以使用 matplotlib 实现表面图的连续颜色渐变?

Posted

技术标签:

【中文标题】是否可以使用 matplotlib 实现表面图的连续颜色渐变?【英文标题】:Is it possible to achieve a continuous color gradient with surface plot using matplotlib? 【发布时间】:2022-01-20 20:05:00 【问题描述】:

我正在尝试通过绘制 3D 图表来可视化照片的像素强度。在下面的代码中,lab 是我要分析的图像。该代码将查看图像中每个像素的像素强度并绘制一个图表,其中高度表示像素强度。

这是我的代码的一部分:

import cv2
import numpy as np

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm

from skimage import io, color
import glob
from PIL import Image


plt.figure(dpi=1200)
    ax = plt.axes(projection='3d')
    y = range(lab.shape[0])
    x = range(lab.shape[1])
    X, Y = np.meshgrid(x, y)

    ax.view_init(elev=60., azim=60)

    thickness = ax.plot_surface(
        X,
        Y,
        lab[:, :, 0],  # change value here to adjust the height
        cmap=cm.coolwarm,
        antialiased=False)

    # Add a color bar which maps values to colors.
    fig.colorbar(thickness, shrink=0.5, aspect=5)

它输出:

如您所见,尽管图形有许多精细的细节和轻微的高度波动,但颜色渐变不是连续的,而这在颜色图上没有体现出来。 是否可以使用 matplotlib 实现表面图的连续颜色渐变,如下图所示?

谢谢。

【问题讨论】:

【参考方案1】:

您可以使用颜色图 hsv 来获得相同的结果。

import cv2
import numpy as np

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm

from skimage import io, color
import glob
from PIL import Image

lab = cv2.imread('Lenna.png')
lab = cv2.cvtColor(lab, cv2.COLOR_BGR2LAB)

fig = plt.figure()
ax = plt.axes(projection='3d')
y = range(lab.shape[0])
x = range(lab.shape[1])
X, Y = np.meshgrid(x, y)

ax.view_init(elev=60., azim=60)

thickness = ax.plot_surface(
        X,
        Y,
        lab[:, :, 0],  # change value here to adjust the height
        cmap=plt.get_cmap('hsv'),
        antialiased=False)

# Add a color bar which maps values to colors.
fig.colorbar(thickness, shrink=0.5, aspect=5)

plt.show()

输出:

查看the documentation 了解更多颜色图。

【讨论】:

以上是关于是否可以使用 matplotlib 实现表面图的连续颜色渐变?的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib 中 Poly3DCollection 图的透明度

有没有办法在 matplotlib 中标记多个 3d 表面?

获取描述任意 matplotlib/seaborn 图的 numpy 数组

matplotlib中的彩色线框图

matplotlib - 来自矩形高度阵列的 3d 表面

matplotlib中水平条形图的注释[重复]