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
相关产品推荐
相关产品推荐

