Matplotlib中bar3d如何隐藏高度为0的柱子以提升3D交互渲染速度
报错原因
你触发TypeError的核心原因是zpos被定义为整数0,dx、dy是基于这个整数生成的标量,三者都不是数组,无法使用布尔掩码做下标筛选。
修正代码
只需将zpos、dx、dy调整为和高度数组dz长度一致的数组,再用掩码过滤零高度项即可,修改后的完整代码如下:
import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(projection='3d') x = y = np.concatenate([np.array([5,4,3,2,1]), np.zeros(35)]) hist, xedges, yedges = np.histogram2d(x, y, bins=40, range=[[0, 40], [0, 40]]) # 生成柱子锚点坐标 xpos, ypos = np.meshgrid(xedges[:-1] + 0.25, yedges[:-1] + 0.25, indexing="ij") xpos = xpos.ravel() ypos = ypos.ravel() # 调整zpos为和dz长度一致的全0数组 zpos = np.zeros_like(hist.ravel()) # 调整dx、dy为对应长度的数组 dx = dy = 0.5 * np.ones_like(zpos) dz = hist.ravel() # 过滤零高度的柱子 mask_dz = dz == 0 ax.bar3d(xpos[~mask_dz], ypos[~mask_dz], zpos[~mask_dz], dx[~mask_dz], dy[~mask_dz], dz[~mask_dz], zsort='average') plt.show()
修改后运行不会报错,仅渲染高度不为0的柱子,3D交互旋转的流畅度会大幅提升,显示效果和原图完全一致,仅去掉了无意义的零高度柱子。
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

