如何在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
相关产品推荐
相关产品推荐

