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

Matplotlib实现重叠柱状图及多子图绘制技术咨询

解决方案与代码实现
import matplotlib.pyplot as plt
import pandas as pd

# 原始数据集
data = {
    "PEOI": [100,129,203,406,92,69,69,51,55,34,371],
    "PCHOI":[-3,-3,-4,10,37,2,-6,16,7,2,-44],
    "STKS":[4800,4810,4820,4840,4850,4860,4880,4900,4910,4920,4940],
    "CCHOI":[50,74,45,617,54,2,35,3,3,10,13],
    "CEOI":[177,182,67,562,118,135,112,30,32,15,184]
}     
df = pd.DataFrame(data)

# 创建1行2列的子图布局
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(20, 6))

# 需求1:堆叠柱状图+网格线设置
df.plot.bar(x="STKS", y=["CEOI","PEOI"], rot=90, width=0.9, 
            title="OPEN INTEREST BUILDUP", fontsize=12,
            stacked=True, ax=ax1)
ax1.set_xlabel("STRIKES", fontweight='bold', fontsize=15)
ax1.set_ylabel("CHANGE IN OI", fontweight='bold', fontsize=15)
# 设置网格线样式:y轴虚线网格,半透明灰色
ax1.grid(axis='y', linestyle='--', alpha=0.7, color='gray')

# 需求2(b):第二个子图,PCHOI和CCHOI的柱状图
df.plot.bar(x="STKS", y=["PCHOI","CCHOI"], rot=90, width=0.9, 
            title="CHANGE IN OI", fontsize=12, ax=ax2)
ax2.set_xlabel("STRIKES", fontweight='bold', fontsize=15)
ax2.set_ylabel("CHANGE IN OI", fontweight='bold', fontsize=15)
ax2.grid(axis='y', linestyle='--', alpha=0.7, color='gray')

# 调整子图间距,避免标题、标签重叠
plt.tight_layout()
plt.show(block=True)

问题1解决说明

  • 堆叠柱状图实现:在df.plot.bar()中添加stacked=True参数,即可让CEOI和PEOI的柱状图上下叠加(完全重叠堆叠)。
  • 网格线样式设置:通过ax.grid()方法指定axis='y'(仅显示y轴网格),搭配linestyle='--'(虚线样式)、alpha=0.7(半透明)、color='gray'(灰色)来实现示例图的网格效果。

问题2解决说明

  • 子图布局创建:使用plt.subplots(nrows=1, ncols=2)创建1行2列的子图容器,得到两个坐标轴对象ax1和ax2。
  • 子图1绘制:在ax1上绘制以STKS为横轴,CEOI、PEOI为纵轴的堆叠柱状图(对应需求2(a))。
  • 子图2绘制:在ax2上绘制以STKS为横轴,PCHOI、CCHOI为纵轴的普通柱状图(对应需求2(b))。
  • 布局优化:调用plt.tight_layout()自动调整子图间距,避免标题、标签互相遮挡。

内容的提问来源于stack exchange,提问作者Python Learner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:58:17