是否可以使用 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 表面?