如何用Matplotlib为多索引DataFrame的每个时间区间生成横向子条形图?
实现方案
当然可以实现,以下是基于Matplotlib的具体代码方案:
核心思路
- 提取所有唯一的
5min_intervals时间区间 - 创建垂直排列的子图布局,每个子图对应一个时间区间
- 遍历每个区间,在对应子图绘制横向条形图,并优化样式提升可读性
完整代码示例
import matplotlib.pyplot as plt import pandas as pd # 构造示例DataFrame(如果已有实际数据可跳过此段) data = [ ("2023-07-27 17:40:00", 172.20, 330), ("2023-07-27 17:40:00", 172.19, 1), ("2023-07-27 17:45:00", 172.25, 4), ("2023-07-27 17:45:00", 172.24, 59), ("2023-07-27 17:45:00", 172.23, 101), ("2023-07-27 17:45:00", 172.22, 224), ("2023-07-27 17:45:00", 172.21, 64), ("2023-07-27 17:45:00", 172.20, 303), ("2023-07-27 17:45:00", 172.19, 740), ("2023-07-27 17:45:00", 172.18, 26), ("2023-07-27 17:50:00", 172.17, 30), ("2023-07-27 17:50:00", 172.16, 2), ("2023-07-27 17:50:00", 172.15, 1014), ("2023-07-27 17:50:00", 172.14, 781), ("2023-07-27 17:50:00", 172.13, 1285), ] df = pd.DataFrame(data, columns=["5min_intervals", "price", "quantity"]) df.set_index(["5min_intervals", "price"], inplace=True) # 获取所有唯一的时间区间 time_intervals = df.index.levels[0] n_intervals = len(time_intervals) # 创建垂直排列的子图布局,共享横轴方便对比 fig, axes = plt.subplots(nrows=n_intervals, ncols=1, figsize=(10, 2*n_intervals), sharex=True) # 遍历每个时间区间绘制横向条形图 for ax, interval in zip(axes, time_intervals): # 获取当前区间的子数据 sub_df = df.loc[interval] # 绘制横向条形图:y轴为价格,x轴为成交量 ax.barh(sub_df.index, sub_df["quantity"], height=0.6) # 设置子图标题为当前时间区间 ax.set_title(f"{interval}", fontsize=10) # 设置y轴标签 ax.set_ylabel("Price", fontsize=8) # 优化y轴刻度显示 ax.set_yticks(sub_df.index) ax.set_yticklabels(sub_df.index, fontsize=8) # 添加横向网格线,提升可读性 ax.grid(axis='x', linestyle='--', alpha=0.7) # 设置整体横轴标签 axes[-1].set_xlabel("Quantity", fontsize=10) # 自动调整子图间距,避免重叠 plt.tight_layout() plt.show()
关键细节优化
sharex=True:让所有子图共享横轴,便于直接对比不同区间的成交量规模- 动态子图高度:根据时间区间数量自动调整子图高度,避免图表拥挤
- 刻度与标签优化:缩小字体尺寸,保证所有价格刻度清晰显示
- 网格线:仅添加横轴网格线,辅助读取成交量数值
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

