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

使用matplotlib的fig.canvas.tostring_rgb()时图像重复问题排查

问题原因与修正方案

问题根源

你在同一个3D坐标轴ax上执行了两次重复的绘图操作:

  1. 先用ax.voxels()绘制了3D体素图
  2. 接着调用ax.imshow()把当前画布渲染好的图像(已经包含刚才的体素图)再次画到这个3D坐标轴上,相当于在原3D图的平面上叠加了一层完全相同的画布图像,最终导致显示出重复内容。

修正方案

根据你的实际需求分两种情况处理:

情况1:仅需显示3D体素图

直接移除画布转数组后调用ax.imshow()的代码,保留核心绘制逻辑即可:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(15, 10))
ax = fig.gca(projection="3d")
ax.view_init(30, 0)

# facecolors是经过处理的3D体数据
ax.voxels(
    x, y, z, facecolors[:, :, :, -1] != 0, facecolors=facecolors, shade=False
)
plt.show()

情况2:需要获取渲染后的numpy数组(用于后续处理)

不需要在原3D坐标轴上绘制数组图像,可选择单独显示数组或仅保存数组:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(15, 10))
ax = fig.gca(projection="3d")
ax.view_init(30, 0)

# 绘制3D体素
ax.voxels(
    x, y, z, facecolors[:, :, :, -1] != 0, facecolors=facecolors, shade=False
)
# 渲染画布并转换为numpy数组
fig.canvas.draw()
image_flat = np.frombuffer(fig.canvas.tostring_rgb(), dtype="uint8")
image_shape = (*fig.canvas.get_width_height(), 3)
image_array = image_flat.reshape(*image_shape)

# 显示原3D体素图
plt.show()

# (可选)单独显示转换后的数组图像
plt.figure(figsize=(15,10))
plt.imshow(image_array)
plt.axis('off')  # 关闭坐标轴,避免额外元素干扰
plt.show()

内容的提问来源于stack exchange,提问作者Intrastellar Explorer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:13:15