使用matplotlib的fig.canvas.tostring_rgb()时图像重复问题排查
问题原因与修正方案
问题根源
你在同一个3D坐标轴ax上执行了两次重复的绘图操作:
- 先用
ax.voxels()绘制了3D体素图 - 接着调用
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
相关产品推荐
相关产品推荐

