Seaborn热力图X轴日期格式改为%d-%b的实现方法
解决Seaborn热力图X轴日期格式调整问题
我来帮你搞定这个日期格式的困扰!你之前直接用固定列表替换xticklabels导致效果变差,核心原因是自定义标签和热力图实际的X轴日期数量、对应位置不匹配——毕竟你的数据里的日期肯定远不止12个,强行塞固定列表会让标签错位或重复。
下面给你两种靠谱的解决方案,都是基于原始日期索引来生成对应格式的标签,保证和图表对齐:
方法一:先格式化日期标签再传入热力图
这种方法先把透视表的日期索引转换成你想要的%d-%b格式,再设置显示间隔避免标签拥挤:
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline df_general = pd.read_csv('df_general.csv') df_general['Date'] = pd.to_datetime(df_general['Date']) # 构建透视表 covid_matrix = df_general.pivot('FAIXA_ETARIA', 'Date', 'count') # 把每个日期转成%d-%b格式(比如15-Dec) formatted_dates = [date.strftime('%d-%b') for date in covid_matrix.columns] # 设置每30个日期显示一个标签,其余位置留空避免重叠 show_every = 30 xtick_labels = [label if i % show_every == 0 else '' for i, label in enumerate(formatted_dates)] fig = plt.figure(figsize=(15,5)) y_axis_labels = ['0 to 1', '1 to 9', '10 to 19', '20 to 29', '30 to 39', '40 to 49', '50 to 59', '60 to 69', '70 to 79', '80 to 89', '> 90'] sns.heatmap(covid_matrix, xticklabels=xtick_labels, yticklabels=y_axis_labels, cmap='coolwarm') # 旋转X轴标签,进一步避免重叠 plt.xticks(rotation=45) plt.show()
方法二:用Matplotlib日期格式化工具自动处理
这种方法更灵活,先画出热力图,再用Matplotlib的日期格式化器统一调整格式:
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from matplotlib.dates import DateFormatter %matplotlib inline df_general = pd.read_csv('df_general.csv') df_general['Date'] = pd.to_datetime(df_general['Date']) covid_matrix = df_general.pivot('FAIXA_ETARIA', 'Date', 'count') fig = plt.figure(figsize=(15,5)) y_axis_labels = ['0 to 1', '1 to 9', '10 to 19', '20 to 29', '30 to 39', '40 to 49', '50 to 59', '60 to 69', '70 to 79', '80 to 89', '> 90'] # 画热力图时不指定xticklabels,交给后续处理 ax = sns.heatmap(covid_matrix, yticklabels=y_axis_labels, cmap='coolwarm') # 设置X轴日期格式为%d-%b date_formatter = DateFormatter('%d-%b') ax.xaxis.set_major_formatter(date_formatter) # 控制显示的标签数量,比如按每30天一个的密度调整 ax.xaxis.set_major_locator(plt.MaxNLocator(nbins=len(covid_matrix.columns)//30 + 1)) # 旋转标签提升可读性 plt.xticks(rotation=45) plt.show()
这两种方法都能保证标签和实际日期一一对应,不会出现错位或混乱的问题,你可以根据自己的习惯选择其中一种~
内容的提问来源于stack exchange,提问作者kvratto
相关产品推荐
相关产品推荐

