如何移除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
相关产品推荐
相关产品推荐

