seaborn散点图如何按hue分组连接同色起止日期标记点
Seaborn同hue分组起止点配对连线实现方案
需求说明
数据集包含Start_Date(开始日期)、End_Date(结束日期)两个日期字段,需按Conf_Num字段分组(对应seabornhue参数配色规则),将同组同色的开始、结束日期散点用直线连接,实现配对连线效果。
当前已完成散点绘制的代码如下:
sns.scatterplot(data=df, y=df.index, x='Start_Date', hue='Conf_Num', legend=False) sns.scatterplot(data=df, y=df.index, x='End_Date', hue='Conf_Num', legend=False)
使用的示例数据结构:
| Conf_Num | Start_Date | End_Date |
|---|---|---|
| 0 | 2/8/2021 | 3/1/2021 |
| 1 | 2/15/2021 | 12/31/2021 |
| 2 | 3/1/2021 | 8/29/2021 |
当前未连线的输出效果:
实现步骤
核心逻辑:逐行遍历数据集,用matplotlib原生plot方法绘制每行起止点的水平连线,提前匹配seaborn hue的配色映射保证连线和散点颜色一致,最后叠画散点保证点层级高于连线。
- 预处理日期格式,避免坐标轴解析异常
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 把日期列转为标准datetime格式 df['Start_Date'] = pd.to_datetime(df['Start_Date']) df['End_Date'] = pd.to_datetime(df['End_Date']) - 生成配色映射,保证连线和散点颜色完全匹配
# 生成和Conf_Num一一对应的调色板,和seaborn默认hue配色规则对齐 color_palette = sns.color_palette(n_colors=df['Conf_Num'].nunique()) conf_color_map = dict(zip(sorted(df['Conf_Num'].unique()), color_palette)) - 绘制连线+散点
plt.figure(figsize=(10, 6)) # 先绘制底层连线 for row_idx, row_data in df.iterrows(): # 每条线的x轴为起止日期,y轴固定为当前行的索引值,和原散点y轴逻辑一致 plt.plot( [row_data['Start_Date'], row_data['End_Date']], [row_idx, row_idx], color=conf_color_map[row_data['Conf_Num']], linewidth=2 ) # 叠画上层散点,设置zorder保证点不被连线遮挡 sns.scatterplot( data=df, y=df.index, x='Start_Date', hue='Conf_Num', palette=conf_color_map, legend=False, s=80, zorder=5 ) sns.scatterplot( data=df, y=df.index, x='End_Date', hue='Conf_Num', palette=conf_color_map, legend=False, s=80, zorder=5 ) # 自动调整日期标签角度,避免重叠 plt.gcf().autofmt_xdate() plt.show()
注意事项
- 不需要将宽表转为长表,直接适配现有数据结构,改动量小
- 显式传入
palette参数给散点绘制方法,避免seaborn自动分配颜色和连线颜色不匹配 zorder=5参数强制散点显示在连线之上,避免视觉上点被线覆盖
内容的提问来源于stack exchange,提问作者vincenzo Scotto Di Uccio
相关产品推荐
相关产品推荐

