You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何绘制单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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:49:53