如何使Matplotlib 3D曲面图的edgecolors随z值变化?
解决方案
需求1:根据z值阈值设置边缘颜色
通过np.where根据z的取值生成对应颜色矩阵,实现z<0.5时边缘为白色、z≥0.5时边缘为黑色的效果:
import numpy as np import matplotlib.pyplot as plt from matplotlib import cm, colors from mpl_toolkits.mplot3d import Axes3D x = np.linspace(-1, 1, 20) y = np.linspace(-1, 1, 20) x, y = np.meshgrid(x, y) z = np.sin(x**2 + y**2) fig = plt.figure() ax = fig.add_subplot(projection='3d') # 根据z值生成边缘颜色矩阵 edge_colors = np.where(z < 0.5, 'w', 'k') ax.plot_surface(x, y, z, cmap=cm.coolwarm, edgecolors=edge_colors) plt.show()
需求2:边缘颜色随z值平滑过渡
先将z值归一化到0-1区间,再基于灰度色盘生成从白色(z=0)到黑色(z=1)的平滑过渡颜色:
import numpy as np import matplotlib.pyplot as plt from matplotlib import cm, colors from mpl_toolkits.mplot3d import Axes3D x = np.linspace(-1, 1, 20) y = np.linspace(-1, 1, 20) x, y = np.meshgrid(x, y) z = np.sin(x**2 + y**2) fig = plt.figure() ax = fig.add_subplot(projection='3d') # 归一化z值到0-1区间 norm = colors.Normalize(z.min(), z.max()) # 生成从白到黑的平滑过渡颜色:灰度值1对应白色,0对应黑色,因此用1减去归一化后的值 edge_colors = plt.cm.gray(1 - norm(z)) ax.plot_surface(x, y, z, cmap=cm.coolwarm, edgecolors=edge_colors) plt.show()
内容的提问来源于stack exchange,提问作者feetwet
相关产品推荐
相关产品推荐

