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

如何修复Seaborn柱状图中的X轴标签偏移问题?

Seaborn月度降水量柱状图X轴标签偏移问题解决

问题描述

使用Seaborn绘制月度降水量柱状图时,出现X轴标签偏移问题:图表中“Enero”(一月)无对应数据,“Diciembre”(十二月)无对应标签。尝试过自定义X轴刻度、按年份手动设置刻度位置,问题仍未解决,需要将标签左移以匹配对应数据。

尝试过的代码

初始绘图代码

# Create a bar plot using seaborn
plt.figure(figsize=(12, 6))
sns.barplot(x="Month", y="Valor", hue="Year", data=monthly_precipitation, palette="Paired")

# Customize the plot
plt.title("Precipitación total mensual - Estación  Santa Elena [27010810] IDEAM")
plt.xlabel("Mes")
plt.ylabel("Precipitación [mm]")
plt.legend(title="Año", bbox_to_anchor=(1.05, 1), loc='upper left')

# Define numeric ticks corresponding to months
x_ticks = range(1, 13)
# Set month labels
month_names = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]
# Set custom x-axis ticks and labels
plt.xticks(x_ticks, month_names)

# Show the plot
plt.show()

手动设置刻度的尝试代码

# Manually set x-axis ticks for each month for each year
num_years = len(monthly_precipitation["Year"].unique())
ticks_per_year = 12
tick_positions = [ticks_per_year * i + j + 0.5 for i in range(num_years) for j in range(12)]

# Change x-axis labels to month names
month_names = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]
plt.xticks(tick_positions, month_names * num_years)

问题原因及解决方法

问题核心是:使用hue参数分组时,seaborn.barplot会将同月份不同年份的柱子并排,X轴实际刻度是从0开始的连续数值(比如第1年1月对应0,第1年2月对应1,第2年1月对应12,以此类推),之前的刻度设置未匹配这个实际位置。

修正后的代码

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(12, 6))
# 保存轴对象,方便精准控制
ax = sns.barplot(x="Month", y="Valor", hue="Year", data=monthly_precipitation, palette="Paired")

# 自定义图表样式
plt.title("Precipitación total mensual - Estación  Santa Elena [27010810] IDEAM")
plt.xlabel("Mes")
plt.ylabel("Precipitación [mm]")
plt.legend(title="Año", bbox_to_anchor=(1.05, 1), loc='upper left')

# 计算每个月份组的中心刻度位置
num_years = len(monthly_precipitation["Year"].unique())
# 每个月份对应num_years个柱子,中心位置为 月份索引*num_years + (num_years-1)/2
tick_positions = [i * num_years + (num_years - 1)/2 for i in range(12)]
month_names = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# 设置刻度与标签
ax.set_xticks(tick_positions)
ax.set_xticklabels(month_names)

plt.show()

关键说明

  • 用ax.set_xticks()和ax.set_xticklabels()替代plt.xticks(),直接控制绘图轴对象更精准
  • 每个月份组的中心位置计算:确保标签正好落在同月份所有年份柱子的中间,匹配对应数据位置
  • 若Month列是1-12的数值型,直接用range(12)生成索引即可保证顺序正确

内容的提问来源于stack exchange,提问作者Estefania Garcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:33:25