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

如何在Seaborn/Matplotlib中让网格线置于箱线图后方?

解决方案

你代码里的核心问题是子图和画布的创建顺序错了,导致set_axisbelow(True)没作用到正确的坐标轴上,而且绘图顺序也得调整——要先画网格再画箱线图,才能让网格处于底层。

改好的代码如下:

import os
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

# 导入数据
path = r"C:\Users\damjan\Desktop\Boxplots\Lastenstraße\Lastenstraße1028.xlsx"
df = pd.read_excel(path)  # read_excel直接返回DataFrame,不用再套一层DataFrame包装
my_colors = {'Gut': 'green', 'Mittel': 'orange', 'Schlecht': 'red'}

# 先创建画布和对应的坐标轴,确保后续操作都指向同一个轴
fig, ax = plt.subplots(figsize=[12,8], dpi=300)

# 先设置y轴对数刻度
ax.set_yscale('log')
# 开启y轴的主次网格,同时把网格放到坐标轴下方(背景层)
ax.grid(True, which='both', axis='y')
ax.set_axisbelow(True)

# 最后绘制箱线图,指定绘制在我们创建的ax上
sns.boxplot(data=df, x="Himmelsrichtung", y="kT [m²10^-16]", hue="Nachbehandlung", 
            palette=my_colors, ax=ax)

plt.show()

几个关键调整点:

  • 用plt.subplots()一次性创建画布和坐标轴,避免前后创建的轴不匹配
  • 先设置刻度、网格,再绘制箱线图,这样网格会被箱线图覆盖在底层
  • 去掉了多余的pd.DataFrame()包装,简化代码
  • 调用sns.boxplot时加上ax=ax,确保图形画在我们配置好的坐标轴上

这样修改后,y轴的主次刻度网格就会显示在箱线图的后方,同时保留对数刻度的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 01:01:51