Python matplotlib如何绘制同时指定底部与顶部值的垂直柱状图
实现方法
完全可以绘制这类自定义每个柱体上下限的柱状图,这类图也常被称为范围柱状图/浮动柱状图,直接使用matplotlib的bar接口即可实现,核心是利用接口的bottom参数单独指定每个柱的起始基线。
针对你给出的DataFrame示例,实现逻辑如下:
- 柱体的实际绘制高度为对应行的
SYS(顶部值)减去DIA(底部值) - 将
bottom参数传入DIA列的数值,指定每个柱的起始位置 - X轴刻度直接对应
Seconds字段的取值定位柱体位置
完整可运行代码:
import pandas as pd import matplotlib.pyplot as plt # 示例数据 data={'Seconds':[10,20,30,40],'SYS':[95,103,99,112],'DIA':[56,75,62,70]} df = pd.DataFrame(data) # 计算每个柱的绘制高度 bar_height = df['SYS'] - df['DIA'] # 绘制浮动柱状图 plt.figure(figsize=(8, 5)) plt.bar( x=df['Seconds'], height=bar_height, bottom=df['DIA'], width=5, # 可根据展示需求调整柱宽 color='#4c72b0', edgecolor='black' ) # 基础图表配置 plt.xlabel('Seconds') plt.ylabel('Value') plt.title('Custom Baseline Bar Chart') plt.xticks(df['Seconds']) # 强制X轴展示所有Seconds取值 plt.grid(axis='y', linestyle='--', alpha=0.7) plt.show()
如果需要给每个柱标注上下限数值,可以在plt.show()前追加如下代码:
# 标注每个柱的底部DIA、顶部SYS值 for x, dia, sys in zip(df['Seconds'], df['DIA'], df['SYS']): plt.text(x, dia-2, f'{dia}', ha='center', fontsize=10) plt.text(x, sys+2, f'{sys}', ha='center', fontsize=10)
补充:如果使用pandas自带的绘图接口,同样支持传入
bottom参数,写法为df.plot.bar(x='Seconds', y=bar_height, bottom=df['DIA']),实现效果和matplotlib原生接口一致。
内容的提问来源于stack exchange,提问作者Robert Alexander
相关产品推荐
相关产品推荐

