Seaborn histplot绘制日期数据时bins参数不生效问题
问题结论
Seaborn的histplot并非完全不支持日期时间类型数据绘制直方图,只是对日期类数据的分箱逻辑存在特殊默认规则,会直接忽略传入的整数型bins参数,这是截至v0.13.x版本的既定行为,不属于代码编写错误。
触发原因
当histplot检测到输入轴数据为日期/时间类型时,会默认调用Matplotlib的日期刻度定位器自动生成分箱规则,不会使用传入的整数bins值做等宽分箱。无论传入的数据源是datetime对象构成的Series、datetime对象列表,还是可被自动解析为日期的字符串列表,都会触发这套特殊处理逻辑,最终出现bins=5这类参数设置不生效的问题。
本次测试使用的示例数据片段:
[datetime.date(2022, 5, 18), datetime.date(2022, 1, 31), datetime.date(2022, 1, 21), datetime.date(2022, 1, 20), datetime.date(2022, 4, 22), datetime.date(2022, 2, 22),...]
使用的绘图命令:
sns.histplot(data=t_data, bins=5)
运行后得到的不符合预期的绘图结果:
可行解决方案
方案1:传入明确的日期分箱边界替代整数bins值
整数分箱设置对日期类型无效,但直接传入自定义的日期分箱边界列表可以被histplot正常识别。示例代码如下:import pandas as pd import seaborn as sns # 计算日期范围,生成对应数量的分箱边界(n个分箱需要n+1个边界点) date_range_min = pd.to_datetime(t_data).min() date_range_max = pd.to_datetime(t_data).max() custom_bins = pd.date_range(start=date_range_min, end=date_range_max, periods=6) # 传入边界列表作为bins参数即可正常按5个分箱绘图 sns.histplot(data=t_data, bins=custom_bins)方案2:先将日期转换为数值型时间戳绘图,再还原坐标轴日期格式
把日期转为数值型时间戳后,histplot就会走常规数值分箱逻辑,正常识别整数bins参数,绘图完成后再把x轴刻度格式改回日期显示即可。示例代码如下:import seaborn as sns import pandas as pd import matplotlib.dates as mdates # 日期转秒级时间戳数值 t_data_num = pd.to_datetime(t_data).astype('int64') // 10**9 ax = sns.histplot(data=t_data_num, bins=5) # 将x轴刻度格式还原为日期显示 ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
内容的提问来源于stack exchange,提问作者DChaps
相关产品推荐
相关产品推荐

