如何优化时序数据与分类列可视化?现有柱状图可读性差需转时间线
事件时间线可视化解决方案
原代码通过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
相关产品推荐
相关产品推荐

