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

如何优化时序数据与分类列可视化?现有柱状图可读性差需转时间线

事件时间线可视化解决方案

原代码通过groupby(['DATE', 'CODE']).size().plot.bar()生成的柱状图,在数据集较大时会出现X轴日期拥挤重叠、Y轴分类重复的问题,完全无法清晰展示事件的时间序列关系。下面提供两种基于matplotlib的时间线可视化方案,满足你展示日期事件、区分SOURCE、包含线条/日期/CODE文本的需求。

单维度时间线(无ID分组)

适合无需区分主体,仅展示所有事件时间分布的场景:

数据预处理

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# 示例数据(替换为你的数据集)
df = pd.DataFrame({
    'ID': ['P04', 'P04', 'P04', 'P04', 'P08'],
    'DATE': ['2016-08-08', '2015-05-08', '2010-07-20', '2013-12-06', '2018-03-01'],
    'CODE': ['f', 'f', 'v', 'g', 'h'],
    'SOURCE': ['m1', 'm1', 'm3', 'm4', 'm4']
})

# 转换日期格式并按时间排序
df['DATE'] = pd.to_datetime(df['DATE'])
df = df.sort_values('DATE')

绘图代码

plt.figure(figsize=(12, 6))

# 定义SOURCE与颜色的映射关系(可自定义)
color_map = {'m1': 'blue', 'm3': 'green', 'm4': 'orange'}

# 遍历数据绘制每个事件
for _, row in df.iterrows():
    # 绘制事件垂直线
    plt.vlines(x=row['DATE'], ymin=0, ymax=1, color=color_map[row['SOURCE']], alpha=0.7)
    # 绘制事件标记点
    plt.scatter(row['DATE'], 1, color=color_map[row['SOURCE']], s=100, zorder=5)
    # 标注CODE文本
    plt.text(row['DATE'], 1.02, row['CODE'], ha='center', fontsize=12)

# 格式化X轴日期
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gca().xaxis.set_major_locator(mdates.YearLocator())
plt.xticks(rotation=45)

# 隐藏冗余的Y轴元素
plt.gca().spines[['left', 'right', 'top']].set_visible(False)
plt.yticks([])

# 添加SOURCE图例
from matplotlib.patches import Patch
legend_elements = [Patch(facecolor=color_map[src], label=src) for src in color_map.keys()]
plt.legend(handles=legend_elements, loc='upper right')

plt.title('事件时间线(按SOURCE区分)', fontsize=14)
plt.xlabel('日期', fontsize=12)

plt.tight_layout()
plt.show()

多维度时间线(按ID分组)

如果需要区分不同主体(ID)的事件序列,可以用Y轴展示不同ID,实现分层时间线:

绘图代码

plt.figure(figsize=(12, 8))

# 为每个ID分配Y轴位置
unique_ids = df['ID'].unique()
id_y_mapping = {id_val: idx+1 for idx, id_val in enumerate(unique_ids)}
color_map = {'m1': 'blue', 'm3': 'green', 'm4': 'orange'}

# 遍历数据绘制每个事件
for _, row in df.iterrows():
    y_pos = id_y_mapping[row['ID']]
    # 绘制事件垂直线
    plt.vlines(x=row['DATE'], ymin=y_pos-0.2, ymax=y_pos+0.2, color=color_map[row['SOURCE']], alpha=0.7)
    # 绘制事件标记点
    plt.scatter(row['DATE'], y_pos, color=color_map[row['SOURCE']], s=100, zorder=5)
    # 标注CODE文本
    plt.text(row['DATE'], y_pos+0.2, row['CODE'], ha='center', fontsize=12)

# 设置Y轴刻度为ID
plt.yticks(list(id_y_mapping.values()), list(id_y_mapping.keys()))

# 格式化X轴日期
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gca().xaxis.set_major_locator(mdates.YearLocator())
plt.xticks(rotation=45)

# 添加SOURCE图例
legend_elements = [Patch(facecolor=color_map[src], label=src) for src in color_map.keys()]
plt.legend(handles=legend_elements, loc='upper right')

plt.title('各ID事件时间线', fontsize=14)
plt.xlabel('日期', fontsize=12)
plt.ylabel('ID', fontsize=12)

plt.tight_layout()
plt.show()

方案优势

  • 时间轴清晰展示事件的先后顺序,避免柱状图的拥挤问题
  • 通过颜色直观区分不同SOURCE的事件
  • 直接在事件位置标注CODE,无需额外对照图例
  • 可灵活扩展为单/多主体的时间线展示

内容的提问来源于stack exchange,提问作者user14269252

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:21:28