Seaborn:一行代码画出让老板满意的统计图
Matplotlib 像手动挡,Seaborn 像自动挡。同样是画图,Seaborn 一行做的事 Matplotlib 要写十行。
Seaborn 基于 Matplotlib,语法更简洁,默认样式更好看,特别适合统计图。
安装和基础设置
importseabornassnsimportmatplotlib.pyplotaspltimportpandasaspdimportnumpyasnp plt.rcParams["font.sans-serif"]=["SimHei"]plt.rcParams["axes.unicode_minus"]=False# 加载自带数据集tips=sns.load_dataset("tips")iris=sns.load_dataset("iris")print(tips.head())箱线图:看数据分布
fig,axes=plt.subplots(1,2,figsize=(14,5))# 基础箱线图sns.boxplot(data=tips,x="day",y="total_bill",ax=axes[0])axes[0].set_title("各天消费金额分布")# 加分类颜色sns.boxplot(data=tips,x="day",y="total_bill",hue="time",ax=axes[1])axes[1].set_title("各天消费(按餐别)")plt.tight_layout()plt.show()箱线图怎么看:中间的线是中位数,盒子是 Q1-Q3,须子是 1.5×IQR 范围,之外的点是异常值。
小提琴图:比箱线图信息更多
fig,ax=plt.subplots(figsize=(10,5))sns.violinplot(data=tips,x="day",y="total_bill",hue="time",split=True,ax=ax)ax.set_title("各天消费分布(小提琴图)")plt.tight_layout()plt.show()小提琴图 = 箱线图 + 密度曲线。看得出数据有几个峰。
热力图:相关性一目了然
# 计算相关性矩阵corr=tips.select_dtypes("number").corr()fig,ax=plt.subplots(figsize=(8,6))sns.heatmap(corr,annot=True,cmap="RdBu_r",center=0,square=True,linewidths=0.5,ax=ax)ax.set_title("特征相关性热力图")plt.tight_layout()plt.show()分类图:barplot / countplot
fig,axes=plt.subplots(1,3,figsize=(16,5))# 柱状图(带误差线)sns.barplot(data=tips,x="day",y="total_bill",ax=axes[0],ci="sd")axes[0].set_title("日均消费(±1标准差)")# 计数图sns.countplot(data=tips,x="day",hue="time",ax=axes[1])axes[1].set_title("各天订单数")# 分类散点(避免重叠)sns.stripplot(data=tips,x="day",y="total_bill",jitter=True,ax=axes[2])axes[2].set_title("各天消费散点")plt.tight_layout()plt.show()pairplot:一键探索全部特征关系
# 所有数值列两两画散点图,对角线上画分布sns.pairplot(iris,hue="species",height=2.5)plt.suptitle("鸢尾花数据集特征关系矩阵",y=1.02,fontsize=14,fontweight="bold")plt.show()这个函数在做探索性数据分析(EDA)时特别有用,一行代码看清所有特征之间的关系。
调色板:怎么不辣眼睛
# 内置色板sns.color_palette("deep")# 默认sns.color_palette("muted")# 柔和sns.color_palette("pastel")# 淡彩sns.color_palette("bright")# 亮色sns.color_palette("dark")# 深色sns.color_palette("colorblind")# 色盲友好# 渐变色板sns.light_palette("seagreen",as_cmap=True)sns.dark_palette("#69d",reverse=True)sns.diverging_palette(250,30,l=65,center="dark")# 使用sns.set_palette("muted")fig,ax=plt.subplots(figsize=(10,4))sns.barplot(data=tips,x="day",y="total_bill",hue="time",ax=ax)plt.show()实战:用 Seaborn 做一份快速报告
# 模拟销售数据np.random.seed(42)df=pd.DataFrame({"销售额":np.random.normal(5000,1500,500),"利润":lambdax:x*0.3+np.random.normal(0,300,len(x)),"品类":np.random.choice(["手机","电脑","耳机","平板"],500),"地区":np.random.choice(["华东","华南","华北","西部"],500),"月份":np.random.choice(["1月","2月","3月","4月"],500),})df["利润率"]=df["利润"]/df["销售额"]*100fig,axes=plt.subplots(2,2,figsize=(14,12))# 1. 各品类销售额箱线图sns.boxplot(data=df,x="品类",y="销售额",ax=axes[0,0])axes[0,0].set_title("各品类销售额分布")# 2. 各月各品类热销pivot=df.pivot_table(values="销售额",index="月份",columns="品类",aggfunc="sum")sns.heatmap(pivot,annot=True,fmt=".0f",cmap="YlOrRd",ax=axes[0,1])axes[0,1].set_title("月度品类销售热力图")# 3. 销售额-利润率散点sns.scatterplot(data=df,x="销售额",y="利润率",hue="品类",ax=axes[1,0])axes[1,0].set_title("销售额 vs 利润率")# 4. 各品类各地区sns.barplot(data=df,x="地区",y="销售额",hue="品类",ax=axes[1,1])axes[1,1].set_title("各地区各品类销售额")plt.suptitle("2026上半年销售报告",fontsize=16,fontweight="bold")plt.tight_layout()plt.show()新手常见坑
坑1:Seaborn 和 Matplotlib 混用时样式冲突
# Seaborn 会覆盖 Matplotlib 的样式# 先设置 Seaborn 样式,再用 Matplotlib 调细节sns.set_style("whitegrid")fig,ax=plt.subplots()sns.barplot(data=df,ax=ax)ax.set_title("标题")# OK坑2:pairplot 数据太多
别对几百列的数据跑 pairplot——画布会爆炸。先挑关键的 5-10 列。
坑3:barplot 默认带误差线
ci=95是默认的,小样本时误差线很大。用ci=None关掉,或ci="sd"用标准差方式。
写在最后
Seaborn 是 EDA 利器。日常画图优先用 Seaborn,需要精细调整时降到 Matplotlib 层。两者配合用效果最好。
下一篇聊 Plotly——让图表动起来。