操作环境
sklearn: 1.6.1
seaborn: 0.13.2
pandas: 2.3.0
matplotlib: 3.10.3
Win10系统
PyCharm 2025.1.2
python3.10
我之前使用·seaborn库的时候,并没有使用主题(set_theme),但这次我设置了全局主题:
# 设置全局主题
sns.set_theme(
    style="whitegrid",       # 白色网格背景
    context="notebook",      # 适配 Notebook 的字体大小
    palette="colorblind"     # 色盲友好调色板
)之后我就发现中文竟然不显示了。
由于seaborn底层依赖 matplotlib,所以我就直接加入了这两行代码
plt.rcParams[‘font.sans-serif’] = [‘SimHei’]
plt.rcParams[‘axes.unicode_minus’] = False
完整代码如下:
# 导入必要库
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt  # 用于显示图表(本地脚本需此句)
# 设置字体为SimHei以支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 设置全局主题
sns.set_theme(
    style="whitegrid",       # 白色网格背景
    context="notebook",      # 适配 Notebook 的字体大小
    palette="colorblind"     # 色盲友好调色板
)
tips = pd.read_csv("E:/pycharm_workspace/sns库练习/tips.csv")  # 修改为你的实际路径
# 绘制关系图:总消费 vs 小费,按用餐时间(time)分面,按是否吸烟(smoker)着色和标记
g = sns.relplot(
    data=tips,
    x="total_bill",       # x轴:总消费金额
    y="tip",              # y轴:小费金额
    col="time",           # 按用餐时间(Lunch/Dinner)分左右子图
    hue="smoker",         # 按是否吸烟(Yes/No)着色
    style="smoker",       # 按是否吸烟设置标记形状(圆形/方形)
    kind="scatter",       # 散点图(默认类型)
    height=5,             # 子图高度(英寸)
    aspect=1.2,           # 子图宽高比(宽度=高度×aspect)
    s=80,                 # 散点大小
    alpha=0.7             # 散点透明度(避免重叠遮挡)
)
# 自定义图表标签(本地运行时更清晰)
g.set_axis_labels("总消费金额(美元)", "小费金额(美元)", labelpad=10)
g.legend.set_title("是否吸烟")  # 图例标题
g.fig.suptitle("餐厅消费与小费的关系(按用餐时间分组)", y=1.05)  # 总标题
# 显示图表(本地脚本必须,Jupyter 可选)
plt.show()但是发现结果并不如意:

问题根源:Seaborn 主题可能覆盖字体配置
Seaborn 的 set_theme() 函数本质上是通过调用 matplotlib.rcdefaults() 重置 Matplotlib 的默认参数,可能会覆盖咱们之前设置的 font.sans-serif。
因此,正确的做法是:先设置 Seaborn 主题,再单独覆盖字体参数。
完整代码如下:
# 导入必要库
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt  # 用于显示图表(本地脚本需此句)
# 设置全局主题(可选,但推荐)
sns.set_theme(
    style="whitegrid",       # 白色网格背景
    context="notebook",      # 适配 Notebook 的字体大小
    palette="colorblind"     # 色盲友好调色板
)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
tips = pd.read_csv("E:/pycharm_workspace/sns库练习/tips.csv")  # 修改为你的实际路径
# 绘制关系图:总消费 vs 小费,按用餐时间(time)分面,按是否吸烟(smoker)着色和标记
g = sns.relplot(
    data=tips,
    x="total_bill",       # x轴:总消费金额
    y="tip",              # y轴:小费金额
    col="time",           # 按用餐时间(Lunch/Dinner)分左右子图
    hue="smoker",         # 按是否吸烟(Yes/No)着色
    style="smoker",       # 按是否吸烟设置标记形状(圆形/方形)
    kind="scatter",       # 散点图(默认类型)
    height=5,             # 子图高度(英寸)
    aspect=1.2,           # 子图宽高比(宽度=高度×aspect)
    s=80,                 # 散点大小
    alpha=0.7             # 散点透明度(避免重叠遮挡)
)
# 自定义图表标签(本地运行时更清晰)
g.set_axis_labels("总消费金额(美元)", "小费金额(美元)", labelpad=10)
g.legend.set_title("是否吸烟")  # 图例标题
g.fig.suptitle("餐厅消费与小费的关系(按用餐时间分组)", y=1.05)  # 总标题
# 显示图表(本地脚本必须,Jupyter 可选)
plt.show()
                
 
 
                     
            
        













 
                    

 
                 
                    