Seaborn小倍数时间序列图X轴标签旋转异常问题排查
Seaborn小倍数时间序列图X轴标签显示异常问题
问题现象
之前使用Seaborn绘制小倍数时间序列图时,所有子图的X轴标签均为垂直显示;重装环境后,运行相同代码,X轴标签变为空白,调整后仅最后一个子图的标签能旋转显示。同时Seaborn官方示例也出现相同问题,怀疑是Jupyter Notebook配置异常。
原代码
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 读取Excel文件 df = pd.read_excel('demanda2.xlsx') # 选择相关列(年份和月份) columnas_meses = ['Año', 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'] df_meses = df[columnas_meses] # 重构DataFrame以适配Seaborn df_meses_melted = pd.melt(df_meses, id_vars='Año', var_name='Mes', value_name='KWh') # 设置Seaborn主题和样式 sns.set_theme(style="dark") # 绘制每个年份的时间序列子图 g = sns.relplot( data=df_meses_melted, x="Mes", y="KWh", col="Año", hue="Año", kind="line", palette="crest", linewidth=4, zorder=5, col_wrap=3, height=3, aspect=2, legend=False, # 调整高度和宽高比 ) # 遍历每个子图进行自定义 for año, ax in g.axes_dict.items(): # 在图内添加标题注释 ax.text(.8, .85, año, transform=ax.transAxes, fontweight="bold") # 绘制所有年份的时间序列作为背景 sns.lineplot( data=df_meses_melted, x="Mes", y="KWh", units="Año", estimator=None, color=".7", linewidth=1, ax=ax, ) # 降低X轴刻度频率 ax.set_xticks(ax.get_xticks()[::1]) # 设置X轴标签垂直显示 ax.set_xticklabels(ax.get_xticklabels(), rotation=90, ha='center') # 调整图表布局 g.set_titles("") g.set_axis_labels("", "MW") g.tight_layout()
解决方案
1. 修复代码缩进问题
原代码中,X轴刻度和标签的调整代码位于for循环外部,仅会作用于最后一个子图。需将这两行代码缩进,放入循环内部,确保每个子图都被处理:
# 遍历每个子图进行自定义 for año, ax in g.axes_dict.items(): # 在图内添加标题注释 ax.text(.8, .85, año, transform=ax.transAxes, fontweight="bold") # 绘制所有年份的时间序列作为背景 sns.lineplot( data=df_meses_melted, x="Mes", y="KWh", units="Año", estimator=None, color=".7", linewidth=1, ax=ax, ) # 降低X轴刻度频率 ax.set_xticks(ax.get_xticks()[::1]) # 设置X轴标签垂直显示 ax.set_xticklabels(ax.get_xticklabels(), rotation=90, ha='center')
2. 检查环境依赖版本
重装环境后可能存在版本兼容问题,建议锁定稳定版本:
- 安装指定版本的Matplotlib和Seaborn:
pip install matplotlib==3.7.1 seaborn==0.12.2
3. 调整Jupyter绘图后端
尝试切换Jupyter的绘图后端,在代码开头添加:
%matplotlib inline
或
%matplotlib notebook
修改后的完整代码
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 切换绘图后端(可选) %matplotlib inline # 读取Excel文件 df = pd.read_excel('demanda2.xlsx') # 选择相关列(年份和月份) columnas_meses = ['Año', 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'] df_meses = df[columnas_meses] # 重构DataFrame以适配Seaborn df_meses_melted = pd.melt(df_meses, id_vars='Año', var_name='Mes', value_name='KWh') # 设置Seaborn主题和样式 sns.set_theme(style="dark") # 绘制每个年份的时间序列子图 g = sns.relplot( data=df_meses_melted, x="Mes", y="KWh", col="Año", hue="Año", kind="line", palette="crest", linewidth=4, zorder=5, col_wrap=3, height=3, aspect=2, legend=False, # 调整高度和宽高比 ) # 遍历每个子图进行自定义 for año, ax in g.axes_dict.items(): # 在图内添加标题注释 ax.text(.8, .85, año, transform=ax.transAxes, fontweight="bold") # 绘制所有年份的时间序列作为背景 sns.lineplot( data=df_meses_melted, x="Mes", y="KWh", units="Año", estimator=None, color=".7", linewidth=1, ax=ax, ) # 降低X轴刻度频率 ax.set_xticks(ax.get_xticks()[::1]) # 设置X轴标签垂直显示 ax.set_xticklabels(ax.get_xticklabels(), rotation=90, ha='center') # 调整图表布局 g.set_titles("") g.set_axis_labels("", "MW") g.tight_layout()
内容的提问来源于stack exchange,提问作者Guillermo
相关产品推荐
相关产品推荐

