如何基于Pandas DataFrame绘制多值堆叠时间序列柱状图
解决方案
1. 数据预处理
你的数据包含多层索引结构,先将其整理为标准格式的DataFrame:
import pandas as pd # 模拟读取你的数据(实际使用时可直接从文件读取) data = """ value cumsum price 0 2021-02-01 00:00:00 164.6136 164.6136 0.0216 2021-02-01 00:00:00 163.8085 328.4221 0.0215 2021-02-01 00:00:00 163.0466 491.4687 0.0214 2021-02-01 00:00:00 14999.9925 15491.4612 0.0213 1 2021-02-01 00:00:10 164.6136 164.6136 0.0216 8634 2021-02-01 23:59:00 14999.9993 14999.9993 0.0221 8635 2021-02-01 23:59:10 14999.9993 14999.9993 0.0221 8636 2021-02-01 23:59:20 14999.9993 14999.9993 0.0221 8637 2021-02-01 23:59:30 0.0000 0.0000 0.0221 2021-02-01 23:59:30 14999.9993 14999.9993 0.0221""" # 解析数据并处理索引 df = pd.read_csv(pd.compat.StringIO(data), sep='\s+', header=0) df['datetime'] = df.index.get_level_values(1) df.reset_index(drop=True, inplace=True) # 转换为时间格式 df['datetime'] = pd.to_datetime(df['datetime'])
2. 绘制匹配目标的图表
从你提供的示例图来看,核心是展示价格与对应累计量/数值的关联分布,以下是两种适配场景的实现:
场景1:时间维度下的价格-数值堆叠图
如果目标图是按时间展示不同价格对应的数值分布,可以用堆叠面积图:
import matplotlib.pyplot as plt import matplotlib.dates as mdates # 设置画布 fig, ax = plt.subplots(figsize=(12, 6)) # 按10分钟聚合,拆分不同价格的数值 minute_df = df.groupby([pd.Grouper(key='datetime', freq='10min'), 'price'])['value'].sum().unstack() # 绘制堆叠面积图 minute_df.plot(kind='area', stacked=True, ax=ax, alpha=0.7) # 格式化时间轴 ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M')) plt.xticks(rotation=45) # 添加标签与标题 ax.set_xlabel('时间') ax.set_ylabel('总数值') ax.set_title('各时段不同价格对应的数值分布') plt.tight_layout() plt.show()
场景2:价格与累计量的关联图
如果目标图是展示价格和累计量的对应关系,可以用柱状+折线组合图:
fig, ax = plt.subplots(figsize=(10, 6)) # 按价格排序数据 sorted_df = df.sort_values('price') # 绘制柱状图展示累计量 ax.bar(sorted_df['price'], sorted_df['cumsum'], width=0.0001, color='steelblue') # 叠加折线图突出趋势 ax.plot(sorted_df['price'], sorted_df['cumsum'], color='darkred', linestyle='--') # 添加标签与标题 ax.set_xlabel('价格') ax.set_ylabel('累计量') ax.set_title('价格与累计量对应关系') plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者junglekim
相关产品推荐
相关产品推荐

