基于Matplotlib绘制双向汇聚堆叠条形图(材料带隙可视化)
解决Matplotlib绘制上下向中心汇聚的堆叠带隙条形图问题
核心思路
要实现从图表顶部和底部向中心带隙区域汇聚的堆叠条形图,关键是正确设置条形的bottom起始位置和height高度参数:
- 价带(VB)条形:从y轴底部(下限)延伸至VB顶,
bottom设为y轴下限,height为VB顶数值减去y轴下限 - 导带(CB)条形:从CB底延伸至y轴顶部(上限),
bottom设为CB底数值,height为y轴上限减去CB底数值
完整代码示例
import pandas as pd import matplotlib.pyplot as plt # 构造材料带隙数据 material_data = { 'Material': ['Si', 'Ge', 'GaAs'], 'VB_Top': [-5.1, -4.9, -5.4], # 价带顶能量 'CB_Bottom': [-4.05, -4.0, -4.0] # 导带底能量 } df = pd.DataFrame(material_data) # 自定义y轴范围(可根据需求调整) y_axis_min = -6 y_axis_max = 0 # 计算两个条形的高度 df['VB_Height'] = df['VB_Top'] - y_axis_min df['CB_Height'] = y_axis_max - df['CB_Bottom'] # 创建绘图对象 fig, ax = plt.subplots(figsize=(8, 6)) # 绘制价带条形(从y轴底部到VB顶) ax.bar(df['Material'], df['VB_Height'], bottom=y_axis_min, color='#2ecc71', label='Valence Band') # 绘制导带条形(从CB底到y轴顶部) ax.bar(df['Material'], df['CB_Height'], bottom=df['CB_Bottom'], color='#3498db', label='Conduction Band') # 图表样式设置 ax.set_ylabel('Energy (eV)') ax.set_title('Material Band Gap Visualization') ax.legend() ax.set_ylim(y_axis_min, y_axis_max) # 锁定y轴范围,确保条形显示完整 plt.tight_layout() plt.show()
问题排查说明
你之前的代码未达到预期,大概率是以下原因:
- 直接将VB/CB的能量数值作为
height参数,而非计算从边界到目标值的差值 bottom参数设置错误,比如CB的bottom未设为真实的导带底数值,导致条形起始位置偏移
运行上述代码后,Si的绿色VB条会从-6(y轴底部)延伸至-5.1,蓝色CB条会从-4.05延伸至0(y轴顶部),完美匹配你需要的汇聚效果。
内容的提问来源于stack exchange,提问作者sz417
相关产品推荐
相关产品推荐

