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

如何移除Matplotlib bar3d绘图中的深色阴影?

解决Matplotlib bar3d移除深色阴影的问题

嘿,这个问题我之前也踩过坑!确实bar3d不像其他3D绘图函数那样支持直接的shade=False参数,但有几个实用的办法能消除阴影,让你在柱状图顶部的文本清晰显示,我给你详细拆解:

方法一:统一柱子所有面的颜色(最直接有效)

bar3d返回的是Poly3DCollection对象,默认情况下柱子的不同面会因为光照产生明暗阴影。我们可以给所有面设置完全相同的颜色,同时让边框颜色和填充色一致,彻底消除阴影感:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 示例数据
x_coords = [1, 2, 3]
y_coords = [1, 2, 3]
z_base = [0, 0, 0]
dx = dy = 0.6
heights = [4, 2, 5]

# 创建3D柱状图并获取对象
bars = ax.bar3d(x_coords, y_coords, z_base, dx, dy, heights)

# 移除阴影:设置统一的填充色和边框色
solid_color = '#2ca02c'  # 你可以替换成任意想要的颜色
bars.set_facecolor(solid_color)
bars.set_edgecolor(solid_color)
bars.set_shading('flat')  # 强制使用flat着色模式,避免渐变

# 在柱子顶部添加文本
for idx in range(len(x_coords)):
    # 定位到柱子中心顶部
    ax.text(
        x_coords[idx] + dx/2, 
        y_coords[idx] + dy/2, 
        heights[idx], 
        f'{heights[idx]}',
        ha='center', va='bottom', fontsize=10
    )

plt.show()

方法二:调整光源角度减少阴影

如果还是想要一点微弱的立体感但不想阴影太明显,可以调整光源的照射角度,让光线从正上方或正面照射,减少面与面之间的明暗差异:

from matplotlib.colors import LightSource

# 接上面的代码,创建bars之后:
# 设置光源从正上方照射(altdeg=90),方位角0度
ls = LightSource(azdeg=0, altdeg=90)
# 生成无明显阴影的颜色
flat_colors = ls.shade([solid_color]*len(heights), plt.cm.viridis, blend_mode='flat')
bars.set_facecolor(flat_colors)
bars.set_edgecolor(solid_color)

方法三:关闭3D轴的光照效果(极端情况)

如果完全不需要任何光照效果,可以直接关闭轴的光照:

# 关闭3D轴的面板填充和边框色
ax.xaxis.pane.fill = False
ax.yaxis.pane.fill = False
ax.zaxis.pane.fill = False
ax.xaxis.pane.set_edgecolor('w')
ax.yaxis.pane.set_edgecolor('w')
ax.zaxis.pane.set_edgecolor('w')
# 再配合统一颜色设置,就能得到完全无阴影的柱子
bars.set_facecolor(solid_color)
bars.set_edgecolor(solid_color)

这些方法里,我最推荐第一种,操作简单且效果稳定,能完美解决阴影遮挡文本的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:01:11