You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:37:23