You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:14:50