如何绘制单Y变量且分组分离的时间序列图?
分组分离的时间序列图实现方案
核心实现思路
要满足分组视觉分离且每个序列仅在自身索引范围内绘制的需求,我们可以通过两种方式实现:同一画布内垂直偏移分离,或多子图完全分离。以下是针对两种场景的修改后代码:
方案1:同一画布内垂直偏移分离
适合需要在单图中对比所有分组趋势的场景,通过为每个分组添加垂直偏移实现视觉区分,同时保留各自的索引范围。
import pandas as pd import matplotlib.pyplot as plt # 模拟你的DataFrame结构(替换为实际数据即可) data = { 'Festzelt': ['Zelt A', 'Zelt A', 'Zelt A', 'Zelt B', 'Zelt B', 'Zelt C', 'Zelt C', 'Zelt C', 'Zelt C'], 'Biermenge': [50, 65, 72, 40, 55, 80, 90, 75, 85] } df = pd.DataFrame(data) plt.figure(figsize=(10, 6)) offset = 20 # 分组间的垂直偏移量,可根据Biermenge的数值范围调整 colors = plt.cm.tab10.colors # 用内置配色区分不同分组 # 遍历每个分组绘制序列 for idx, (group_name, group_data) in enumerate(df.groupby('Festzelt')): # 为当前分组的数值添加偏移,实现分离 shifted_values = group_data['Biermenge'] + idx * offset # 仅使用当前分组的索引绘制序列 plt.plot(group_data.index, shifted_values, marker='o', label=group_name, color=colors[idx]) # 在序列末尾添加分组名称标签(可选) plt.text(group_data.index[-1], shifted_values.iloc[-1], group_name, va='center', fontsize=10) # 修正y轴刻度,显示原始Biermenge数值 original_ticks = [tick - idx * offset for tick in plt.yticks()[0]] plt.yticks(plt.yticks()[0], [int(t) if t >=0 else 0 for t in original_ticks]) # 配置图表元素 plt.xlabel('索引') plt.ylabel('Biermenge') plt.title('分组分离的Biermenge时间序列') plt.legend() plt.grid(alpha=0.3) plt.tight_layout() plt.show()
关键细节说明
- 分组独立绘制:通过
groupby('Festzelt')遍历每个分组,确保每个序列仅使用自身的索引和数据,不会强制对齐其他分组的x轴范围 - 垂直偏移:
shifted_values为每个分组添加固定偏移,避免不同分组的序列重叠,偏移量可根据实际数据大小调整 - 刻度修正:将偏移后的y轴刻度转换回原始
Biermenge数值,避免混淆
方案2:多子图完全分离
适合需要聚焦每个分组细节的场景,每个分组独占一个子图,完全独立展示。
import pandas as pd import matplotlib.pyplot as plt # 模拟你的DataFrame结构(替换为实际数据即可) data = { 'Festzelt': ['Zelt A', 'Zelt A', 'Zelt A', 'Zelt B', 'Zelt B', 'Zelt C', 'Zelt C', 'Zelt C', 'Zelt C'], 'Biermenge': [50, 65, 72, 40, 55, 80, 90, 75, 85] } df = pd.DataFrame(data) group_count = df['Festzelt'].nunique() # 创建对应数量的子图,共享x轴以提升可读性 fig, axes = plt.subplots(group_count, 1, figsize=(10, 2*group_count), sharex=True) colors = plt.cm.tab10.colors # 为每个子图绘制对应分组的序列 for idx, (group_name, group_data) in enumerate(df.groupby('Festzelt')): ax = axes[idx] # 仅使用当前分组的索引绘制序列 ax.plot(group_data.index, group_data['Biermenge'], marker='o', color=colors[idx]) ax.set_title(f'Festzelt: {group_name}') ax.set_ylabel('Biermenge') ax.grid(alpha=0.3) # 为最后一个子图添加x轴标签 axes[-1].set_xlabel('索引') plt.tight_layout() plt.show()
关键细节说明
- 子图匹配分组数量:根据
Festzelt的唯一值数量创建对应子图,确保每个分组有独立展示空间 - 共享x轴:
sharex=True让所有子图使用同一x轴刻度,便于跨分组对比索引位置 - 独立数据范围:每个子图仅绘制对应分组的索引和数据,严格遵循自身的序列起止范围
内容的提问来源于stack exchange,提问作者Jan Schatz
相关产品推荐
相关产品推荐

