如何用Matplotlib绘制按loc_source&loc_target分组的count-day折线图?
高效绘制DataFrameGroupBy多折线图的Matplotlib方案
嘿,我完全理解你不想用逐行迭代这种麻烦方式的心情——其实用pandas配合Matplotlib有非常优雅的解决方案,根本不需要手动循环每个位置组合!下面我就给你一步步演示最优的实现方法:
第一步:准备与整理数据
首先我们先把你的示例数据转换成DataFrame(如果你的数据源已经是DataFrameGroupBy,只需要先把它转换成完整的DataFrame即可,比如用grouped.apply(lambda x: x).reset_index(drop=True)):
import pandas as pd import matplotlib.pyplot as plt # 你的单日示例数据 data = { 'day': [1.566691e+09]*6, 'loc_source': ['east', 'east', 'unknown', 'unknown', 'west', 'west'], 'loc_target': ['east', 'west', 'east', 'west', 'east', 'west'], 'count': [1768, 559, 73, 160, 53, 1563] } df = pd.DataFrame(data)
接下来是核心:把数据转换成宽格式,让每个loc_source-loc_target组合成为单独的列,行对应日期(day)。这里用pivot方法就能一键完成:
# 透视数据,将位置组合转为列,行是日期 pivot_df = df.pivot(index='day', columns=['loc_source', 'loc_target'], values='count') # 把多层列名合并成易读的字符串(比如"east-east"),方便图例显示 pivot_df.columns = ['-'.join(col) for col in pivot_df.columns.values]
第二步:绘制多折线图
现在只需要调用pandas的plot方法,Matplotlib会自动为每一列(也就是每个位置组合)绘制一条折线,完全不用手动循环:
# 创建画布 plt.figure(figsize=(10, 6)) # 绘制折线图,指定用当前的Axes对象 pivot_df.plot(kind='line', ax=plt.gca()) # 设置图表细节(按你的需求调整) plt.ylabel('count') plt.xlabel('day') plt.ylim(0, 2000) # 纵轴范围设为0-2000 plt.title('Daily Traffic Count by Source-Target Location') plt.legend(title='Location Pair') # 设置图例标题 plt.tight_layout() # 自动调整布局,避免标签被截断 plt.show()
为什么这是最优方案?
- 完全避免了逐行迭代,代码简洁易维护
- 当你扩展到数年数据时,只要
day列有多个时间戳,折线会自动延伸,不需要修改核心逻辑 - pandas会自动处理所有
loc_source和loc_target的唯一组合,哪怕后续新增了新的位置对,代码也能自动适配 - 如果觉得时间戳横轴不够友好,可以把
day转换成日期格式:df['day'] = pd.to_datetime(df['day'], unit='s'),这样横轴会显示可读性更强的日期
内容的提问来源于stack exchange,提问作者pfnuesel
相关产品推荐
相关产品推荐

