Matplotlib:如何修改单个体素的面颜色以重现目标图像?
给Matplotlib体素的不同面自定义颜色的高效方法
嘿,我懂你想重现目标图像的需求——官方numpy logo示例里所有体素颜色一致,单独画曲面来改面颜色确实太折腾了!其实Matplotlib的voxels函数本身就支持给每个体素的每个面单独设置颜色,完全不用额外画曲面,这才是最实用的方案。
核心思路:利用voxels的facecolors参数
voxels函数的facecolors参数可以接收一个多维数组,这个数组的形状是(nx, ny, nz, 6, 4),其中:
nx, ny, nz对应体素网格的三个维度6对应每个体素的6个面,顺序是x轴负方向(左)、x轴正方向(右)、y轴负方向(后)、y轴正方向(前)、z轴负方向(下)、z轴正方向(上)4对应RGBA颜色通道(每个值0-1)
你可以先初始化一个默认颜色的facecolors数组,然后针对性地修改特定体素的特定面颜色。
基于官方numpy logo代码的修改示例
先保留官方示例的体素结构逻辑,再添加颜色定制的部分:
import matplotlib.pyplot as plt import numpy as np # 构建numpy logo的体素结构(官方示例核心逻辑) n = 10 x, y, z = np.indices((n+1, n+1, n+1)) cube1 = (x >= 3) & (x <= 7) & (y >= 3) & (y <= 7) & (z >= 3) & (z <= 7) cube2 = (x >= 1) & (x <= 5) & (y >= 1) & (y <= 5) & (z >= 1) & (z <= 5) cube3 = (x >= 5) & (x <= 9) & (y >= 1) & (y <= 5) & (z >= 5) & (z <= 9) cube4 = (x >= 1) & (x <= 5) & (y >= 5) & (y <= 9) & (z >= 5) & (z <= 9) cube5 = (x >= 5) & (x <= 9) & (y >= 5) & (y <= 9) & (z >= 1) & (z <= 5) numpy_logo = cube1 | cube2 | cube3 | cube4 | cube5 # 初始化facecolors:所有面默认设为浅灰色(RGBA) facecolors = np.full(numpy_logo.shape + (6, 4), [0.8, 0.8, 0.8, 1.0]) # 自定义特定面的颜色:比如把中间大立方体的前面(y+方向)设为深蓝色 # 定位中间立方体区域,y+方向对应facecolors的第3个索引(顺序:x-,x+,y-,y+,z-,z+) facecolors[3:8, 7, 3:8, 3] = [0.0, 0.2, 0.8, 1.0] # 再把中间立方体的上面(z+方向)设为橙红色 facecolors[3:8, 3:8, 7, 5] = [0.9, 0.3, 0.1, 1.0] # 绘制体素 fig = plt.figure() ax = fig.add_subplot(projection='3d') ax.voxels(numpy_logo, facecolors=facecolors, edgecolor='black') plt.show()
关键细节说明
- 你需要根据目标图像的需求,定位到要修改的体素位置和对应的面索引,直接修改
facecolors数组的对应位置即可 - 如果需要批量修改多个面,可以用numpy的布尔索引快速定位,不用逐个调整
edgecolor参数可以保留体素边框,让整体结构更清晰
这个方法比单独画曲面高效太多,代码也更简洁,完全能满足你给不同面定制颜色的需求!
内容的提问来源于stack exchange,提问作者mTesseracted
相关产品推荐
相关产品推荐

