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

如何设置matplotlib bar3d()的阴影投射面?

好问题!matplotlib的bar3d()默认的阴影机制确实比较死板,没法直接指定阴影投射面,但咱们有几种变通方法来解决顶部被阴影覆盖、文本看不清的问题,下面给你详细说说:

解决bar3d()顶部阴影遮挡文本的方法

默认情况下,bar3d()的shadow=True参数只是给条形的底部和侧面添加固定的阴影效果,没法直接选择投射面,但我们可以通过以下几种方式实现类似需求:

1. 用LightSource自定义面颜色,精准控制光照/阴影区域

LightSource确实能帮我们实现更灵活的光照效果,虽然bar3d()不直接支持传入LightSource,但我们可以手动计算每个面的颜色,让顶部保持明亮,侧面/底部呈现阴影感。

具体思路是:创建一个光源对象,调整光照的方位角和高度角,然后给条形的六个面(左、右、前、后、底、顶)分别设置不同的亮度——把顶面设为最亮,其他面根据光照方向设置较暗的阴影色。

示例代码:

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

# 准备测试数据
x_coords = [0, 1, 2]
y_coords = [0, 1, 2]
z_base = [0, 0, 0]
widths = [0.8, 0.8, 0.8]
depths = [0.8, 0.8, 0.8]
heights = [3, 5, 4]

# 初始化3D绘图环境
fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111, projection='3d')

# 创建光源,调整azdeg(方位角)和altdeg(高度角)让顶部受光充足
light_source = LightSource(azdeg=135, altdeg=45)
base_color = '#1f77b4'  # 条形的基础颜色

# 定义六个面的颜色:左、右、前、后、底、顶
# 顶面设置最大亮度,其他面降低亮度模拟阴影
face_colors = [
    light_source.shade(base_color, fraction=0.2),  # 左面
    light_source.shade(base_color, fraction=0.3),  # 右面
    light_source.shade(base_color, fraction=0.2),  # 前面
    light_source.shade(base_color, fraction=0.3),  # 后面
    light_source.shade(base_color, fraction=0.1),  # 底面(最暗)
    light_source.shade(base_color, fraction=1.0)   # 顶面(最亮,无阴影)
]

# 绘制3D条形图,使用自定义面颜色
ax.bar3d(x_coords, y_coords, z_base, widths, depths, heights, facecolors=face_colors)

# 添加顶部文本,确保清晰可见
for x, y, h in zip(x_coords, y_coords, heights):
    ax.text(x + widths[0]/2, y + depths[0]/2, h, f'{h}', 
            ha='center', va='center', fontweight='bold', fontsize=10)

# 调整视角让效果更直观
ax.view_init(elev=30, azim=45)

plt.tight_layout()
plt.show()

2. 调整视角避开阴影遮挡

如果不想自定义颜色,也可以通过调整3D轴的视角(elev和azim参数),让条形顶部尽可能朝向镜头,减少阴影对顶部文本的遮挡。比如把elev(仰角)调大一些:

ax.view_init(elev=45, azim=30)

3. 关闭默认阴影,手动绘制定向阴影

如果需要更精准的阴影投射方向,可以关闭bar3d()的默认阴影,然后手动绘制一个稍微偏移的深色条形作为阴影(比如只给侧面添加阴影),这种方法更繁琐,但灵活性最高。

比如,先绘制一个深色的、稍微偏移的“阴影条形”,再绘制正常的条形:

# 绘制阴影(稍微向下、向左偏移)
ax.bar3d([x+0.05 for x in x_coords], [y+0.05 for y in y_coords], z_base, 
         widths, depths, heights, color='#666666', alpha=0.3)
# 绘制正常条形
ax.bar3d(x_coords, y_coords, z_base, widths, depths, heights, color='#1f77b4')

内容的提问来源于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:09:55