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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 08:37:54