sns.set_style()和sns.set_context()必须在绘图前调用,否则无效;displot是figure-level函数,histplot是axes-level;中文显示需前置中文字体至font.sans-serif并设unicode_minus为false;catplot中hue变量应转为category类型或指定hue_order。

怎么改 sns.set_style() 和 sns.set_context() 不生效
改了样式但图表还是默认灰底白线,大概率是调用顺序错了——sns.set_style() 和 sns.set_context() 必须在创建 figure 或调用绘图函数 之前 执行,且不能放在 plt.show() 之后。
- 常见错误:先画图再设 style,或者把
sns.set_style("whitegrid")放在plt.figure()后面 - 正确顺序:
sns.set_style("darkgrid")→sns.set_context("notebook")→sns.scatterplot(...) -
sns.set_context()的"paper"模式会缩小字体和线条,适合插图投稿;"talk"加粗标签,适合汇报;"poster"字更大,但若没配高 DPI 容易模糊 - 注意:一旦用了
plt.style.use("seaborn-v0_8")(Matplotlib 3.8+ 内置),它会覆盖sns.set_style(),二者别混用
sns.displot() vs sns.histplot() 图形不一致怎么办
本质区别在于 sns.displot() 是 figure-level 函数,自动新建 figure;sns.histplot() 是 axes-level,必须指定 ax=。混用会导致子图错位、密度归一化逻辑混乱。
-
sns.displot(data, x="age", stat="density")默认画出归一化到面积=1的密度直方图;而sns.histplot(data, x="age", stat="density")效果相同,但需手动传ax=plt.gca() - 如果想叠加 KDE 曲线,
sns.histplot(..., kde=True)更直接;sns.displot(..., kind="hist", kde=True)也行,但返回的是FacetGrid对象,取ax得写g.ax - 性能上:
sns.histplot()更轻量,批量循环画图时别用displot(),否则每个图都新建 figure,内存涨得快
中文标签显示为方块?font.sans-serif 配置失效
不是字体没装,而是 Matplotlib 默认没把中文字体加进 font.sans-serif 列表,或顺序靠后被英文 fallback 截断了。
- 先确认系统有中文字体:运行
matplotlib.font_manager.findSystemFonts(fontpaths=None, fontext='ttf'),找含"SimHei"、"NotoSansCJK"或"SourceHanSans"的路径 - 关键一步:修改
rcParams时,要把中文字体名插到font.sans-serif列表最前面,例如:plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans', 'Bitstream Vera Sans'] - 必须同时设:
plt.rcParams['axes.unicode_minus'] = False,否则负号显示为方块 - Seaborn 自己不管理字体,它完全依赖 Matplotlib 的 rcParams,所以改完要重启 kernel 或调用
plt.rcParams.update({})强刷
用 sns.catplot() 做分面图,hue 分组颜色重复或错乱
根本原因是 sns.catplot() 默认用离散色板(如 "deep"),但当 hue 变量是数值型或字符串含空格/特殊字符时,Seaborn 会误判为连续变量,转而用连续色映射,导致颜色渐变而非分组区分。
- 强制离散处理:
sns.catplot(..., hue="category", hue_order=["A", "B", "C"], palette="Set2"),显式给palette和hue_order - 如果 hue 列是 int 类型但实际是分类,先转成
data["group"] = data["group"].astype("category"),避免 Seaborn 自动做数值区间划分 -
catplot(kind="box")中,若某组样本数 data.groupby("hue_col").size()
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











