小明接到一份新工作:经营一家「数据小饭馆」。客人点的每道菜,都是一张张图表——折线图是「时间起伏的记录」,柱状图是「分类比身高」,热力图是「变量之间的关系温度计」。后厨里躺着一套功能齐全的厨具:Matplotlib。它能蒸炒煎炸,能做任何菜,但每道菜都得从切菜、腌肉、烧油开始。小明常常切完菜才发现盘子没摆好,摆好盘又发现颜色不顺眼。直到他请来一位帮厨——Seaborn。这位帮厨随身带着「统计图净菜包」和「米其林摆盘模板」,几分钟就能端出密度曲线、回归拟合和热力图。本文就用这段厨房成长记,带你认全 Matplotlib 的灶台与碗盘(Figure/Axes)、家常菜谱(常用图表)、拼桌秘诀(子图布局)、摆盘心法(样式定制),再认识 Seaborn 的净菜包(统计图)与装修队(主题色板),最后学会让两位大厨配合出活。学完你也能把后厨管得井井有条。
对 AI 从业者而言,画图是表达数据的「第二张嘴」。掌握这对两件套,你能把分析结果讲得又快又准——这在面试作品集、业务周报、论文图表中都是实打实的硬通货。
目录
可视化演示
展示Figure/Axes模型、图表类型选择、Seaborn统计封装与样式美化策略。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Figure与Axes绘图模型 Figure是顶层画布容器可包含多个子图 Axes是单个绘图区域包含坐标轴和数据 Figure = Canvas + Axes[] 双层容器模型是Matplotlib绘图的核心架构
厨房初识:Figure与Axes
开张第一天,小明面对空荡荡的灶台手足无措。他把食材下了锅,却不知道往哪儿装——因为 Matplotlib 的规矩是:先支桌子,再摆盘子,最后才装菜。落到代码上,plt.figure() 是支起一张大餐桌,fig.add_subplot() 是在桌上摆一个盘子,plt.plot() 才是把数据这盘菜装进去。许多新手直接 plt.plot() 也能看到图,那是因为 pyplot 偷偷帮你支了桌子、摆了盘子——方便,但让你看不见后厨的真实结构。
在 Matplotlib 的世界里,Figure 是整张画布,相当于厨房的操作台,决定整体尺寸;Axes 是画布上的坐标区,相当于一个个盘子,决定这道菜往哪放、坐标轴刻度怎么标。一个 Figure 可以放多个 Axes,就像一张大桌能摆好几道菜。而 plt.subplots() 则是「支桌 + 摆盘」一步到位的手速,一次性返回 fig 和 axes 两个管家。真正干活的多数是 ax 对象:ax.set_title() 是给菜取名,ax.plot() 是装菜,ax.set_xlabel() 是给横轴贴标签。
绘图完成后,plt.show() 是把菜端上客人桌,fig.savefig() 是给菜品拍菜单照。新手常犯的错,是盯着后厨一口空锅(忘记 show),以为菜没做成,其实只是没端上桌。懂得了「桌、盘、菜」的层级之后,任何图表在你眼里都变成了「画布上摆坐标区、坐标区里画数据」的组装游戏——这就是 Matplotlib 所有操作的心法。
- Figure 主体Figure 是整个绘图窗口,就像厨房的操作台,所有内容都长在它上面;它管理画布的尺寸、背景色和整体布局。
- add_subplot 动作add_subplot 是「在桌面上摆盘子」的动作,调用时需要告诉它盘子的位置和大小,例如
fig.add_subplot(1, 2, 1)表示一行两列中的第一个位置。 - Axes 对象Axes 是坐标区本体,包含 x 轴、y 轴、刻度、标题和数据图形;绘图指令都作用在它身上,它是 Figure 的「子区域」。
家常菜谱:常用图表
小饭馆开了一周,小明发现客人的口味就那几样:老板要看「这个月销量有没有涨」,于是上折线图;部门要比「哪个组迟到最多」,于是上柱状图;运营问「广告投放和注册数有关系吗」,于是上散点图;HR 问「员工年龄都集中在哪儿」,于是上直方图。这四道家常菜几乎覆盖了 80% 的日常需求,用法也都不复杂:plt.plot() 给一条时间曲线,plt.bar() 立起分类柱子,plt.scatter() 撒一把点,plt.hist() 把数值切段数人头。
但家常菜也要讲究细节。plt.xlabel() 和 plt.ylabel() 是给菜挂牌子;plt.title() 是菜名;plt.legend() 是给不同菜系贴标签,否则客人分不清哪根线是「销量」哪根线是「成本」;plt.xlim() 和 plt.ylim() 则是裁剪取景框,只给客人看想看的角落。柱子可以横过来用 plt.barh(),直方图则可以调 bins:柱子太宽看不到分布形状,柱子太细又碎成噪声。组数太少,数据内部的起伏被抹平;组数太多,随机波动被当成规律。
小明终于能按菜单点菜了。他记住了:选对图就像选对菜式——时间看走势用折线,类别比大小用柱状,两变量找关系用散点,单变量看分布用直方。剩下的「加盐调味」,就是标签、图例和坐标范围这些细活。
- 向上取整符号
\lceil \cdot \rceil表示向上取整,即无论小数部分是多少,都进位到下一个整数,保证组数至少为 1。 - 样本量 nn 是数据点的总数,例如采集了 100 个员工的年龄,n 就等于 100;样本越多,信息越丰富,需要更多组来承载细节。
- 取对数
\log_2 n计算以 2 为底的对数,刻画「数据翻倍时组数只需增加一点」,这是经验公式对数据规模的平滑处理。 - 加 1 修正最后的
+1保证即使是很少的数据,也能至少画出一组以上,避免空直方图。
拼桌之道:子图布局
客人越来越多,一盘菜已经交不了差。小明学会了拼桌:把一张大桌板划分成几个小格,每格上一道菜,客人一眼看完所有指标。这就是 plt.subplots(2, 3)——把 Figure 这张桌板分成 2 行 3 列共 6 个格子,返回的 axes 是一个二维数组:axes[0, 0] 是左上角那格,axes[1, 2] 是右下角那格。想单独控制某一格,就用 ax 前缀调用所有绘图函数,像 axes[0, 1].scatter(x, y)。
拼桌还有两个常用技巧。多张时间曲线放在上下格子时,可以用 sharex=True 让它们共用横轴刻度,既省地方又方便对齐比较,就像拼桌时同一道汤大家一起喝。sharey=True 同理,让纵轴统一尺度。而 fig.tight_layout() 则是自动调整格子间距,防止菜与菜之间挤在一起、标签重叠。网格的序号永远从左到右、从上到下排——这是拼桌的基本规则。
掌握了拼桌,小明终于从「一盘菜管饱」升级成「一桌宴席」。一图多子图是分析报告的骨架:上面放趋势,下面放分布,右边放相关性热力——客人动动眼睛就能浏览完一整份健康体检。
- 行号 r 与列号 cr 是目标子图所在的行(从 1 开始),c 是所在的列;例如第 2 行第 1 列,r=2、c=1。
- 乘以总列数
(r-1) \times n_{\text{cols}}计算「这一行之前已经有多少个格子」,比如 3 列表格中第 2 行之前有 3 个格子。 - 加列号再加上当前列号 c,得到全局序号;这个思路和二维数组按行存储的原理完全一致。
精调摆盘:样式定制
同样是炒青菜,路边摊和大饭店的区别就在摆盘。Matplotlib 的默认样式是「食堂风」,但你可以自己提升质感。linestyle='--' 是换餐具花纹,color='#F43F5E' 是换桌布,marker='o' 是撒芝麻粒;fontsize 控制菜名牌大小,rotation 让竖排的标签横过来,避免标签挤成一团。
标题和字体是门面:ax.set_title('季度销量', fontsize=14) 把菜名的字号放大;plt.rcParams['font.sans-serif'] = ['SimHei'] 告诉系统「本店中文字体用黑体」,否则中文会显示成方块;plt.rcParams['axes.unicode_minus'] = False 则修复负号显示成乱码的问题。网格 ax.grid(True) 是给餐桌铺上暗纹虚线,帮客人对准数据;刻度 ax.set_xticks([1, 2, 3]) 让坐标轴只显示你想强调的时间节点,像给菜单划重点。
这一节的核心是:颜色、线型、标记是「可替换的餐具」,rcParams 是「本店装修规范」。把反复使用的样式写进 rcParams,相当于给饭店定下统一的餐具标准,之后每张图自动继承——摆盘从此不再是玄学,而是制度。
- 磅值 ptpt 是字体的逻辑大小,Matplotlib 中
fontsize=12表示 12 磅,它是一个不随屏幕变化的物理单位。 - 像素密度 dpidpi 是设备的分辨率,普通屏幕约 96,高清屏更高;dpi 越大,同样磅值的字占的像素越多。
- 固定换算 7272 是「磅与英寸」的桥梁——1 英寸 = 72 磅,所以把磅转成英寸、再乘以 dpi,就得到屏幕上的像素尺寸。
懒人菜包:Seaborn统计图
小明在后厨累得够呛,因为「统计图」这道菜要算密度、要画分布、还要拟合趋势,手写代码又长又容易错。这时帮厨 Seaborn 登场。它的理念是「净菜包」:切好的配菜、调好的料汁、设计好的摆盘,一站式解决。sns.histplot(data, kde=True) 一行代码同时给出直方图和 KDE 曲线,相当于「营养体检报告」里既画了身高分布,又描出平滑轮廓。
Seaborn 的统计图家族各有分工。sns.displot() 和 sns.histplot() 看单变量分布;sns.catplot() 是分类图总开关,切换 kind='box' 或 kind='violin' 能看不同组别的差异;sns.regplot(x, y, data) 在散点之上自动拟合回归线,相当于给「广告费与注册量」的关系画一条趋势标尺;sns.heatmap(corr) 把相关系数矩阵画成色块温度计,冷热一望便知。
KDE 这条「平滑轮廓线」是帮厨的独门刀法。小明发现,只要告诉帮厨「看什么」,剩下繁琐的统计计算,Seaborn 都替他包圆了——从分布到分类到相关性,一张图就是一个完整的分析单元。
- 核函数 KK 是一个像小山丘一样的函数,以每个样本 xi 为中心向两边衰减;常用高斯核
K(u)=exp(-u²/2),含义是「离样本越近,贡献越大」。 - 带宽 hh 是平滑程度的旋钮——h 越大,每堆面团摊得越宽,曲线越平滑(但可能抹掉细节);h 越小,曲线越贴近原始数据(但可能过尖。
- 样本点 xixi 是每一个观测值,公式对全部 n 个样本逐一求核函数值再求和,等价于把所有「面团小山」叠加起来。
- 归一化系数
1/(n h)保证曲线下方的总面积等于 1,让不同样本量、不同带宽的分布可以相互比较。
饭店装修:主题与调色
菜做得再好,如果每次端出来的盘子花色不一、桌布颜色杂乱,客人也会觉得不专业。Seaborn 的第二件法宝是「装修队」:sns.set_theme() 一行,就能把整套饭店风格定下来。style 参数像装修风格——'whitegrid' 是北欧白墙配浅色地砖(白底、浅网格),'darkgrid' 是深色系氛围感餐厅;palette 是套餐配色,'muted' 是莫兰迪色系,'deep' 是高饱和撞色。
调色板是颜色管理的核心。离散数据用一个一个的色块区分类别,连续数据用渐变色表示强度大小。sns.color_palette('Blues', 4) 能取出一组深浅渐变的蓝色,相当于从色卡里抽出 4 张相衬的墙纸。sns.set_context('paper') 则控制「画幅气质」:paper 适合论文投稿(字号小、图精致),talk 适合投屏讲解(字号大、线条粗),notebook 是默认的日常套餐。
装修队到位后,小饭店终于有了统一的品牌视觉。小明记住了:先 set_theme 定装修,再 color_palette 选墙纸,最后 set_context 调画幅,三步走完,风格自成一体。
- 插值系数 tt 是 0 到 1 之间的进度值,表示当前颜色在渐变带上的位置;t=0 是起点色 c0,t=1 是终点色 c1。
- 两个端点色c0 和 c1 是渐变带的两个端点颜色,它们各自用一组数值表示(比如 RGB 三个分量)。
- 线性混合
(1-t) \times c_0 + t \times c_1是加权平均——t 越接近 1,终点的颜色占比越大,于是颜色被「拉」向 c1。
双厨合璧:协同实战
小明的后厨现在有两位主厨:Matplotlib 擅长精雕细琢的招牌菜,Seaborn 擅长快手标准化的大众菜。会配合的厨师才是好厨师。真实工作流通常是这样:先用 sns.set_theme() 统一全店装修风格;接着用 Seaborn 快速试探数据,画分布图、热力图找规律;发现值得深挖的关系后,再用 Matplotlib 的 ax 对象逐项精修——加注释、改配色、调字号;最后统一用 fig.savefig('报告.png', dpi=150) 拍照存档。
配合的关键词是「同一个 ax」。Seaborn 画的每一张图,底层返回的仍是 Matplotlib 的 Axes 对象,所以 sns.histplot(..., ax=ax) 之后还能继续 ax.set_xlabel('自定义标签')。就像帮厨把配菜切好递给主厨,主厨照样能颠勺加自己的秘制酱料。二者不是二选一,而是 Seaborn 负责 80% 的活,Matplotlib 负责最后 20% 的精致。
一个月后,小明的数据小饭馆成了街坊口口相传的明星店:后厨灶台(Matplotlib)条理分明,帮厨(Seaborn)出菜又快又好看,两位大厨配合默契。厨房如此,画图亦如此——先懂地基,再借巧劲,最后成体系。
- 英寸数 inches
figsize=(10, 5)中的 10 就是宽度英寸数,它是物理尺寸,与屏幕无关。 - 像素密度 dpidpi 是每英寸包含的像素点数量,150 dpi 表示每一英寸宽度由 150 个像素组成。
- 像素总量 pixels两者相乘得到图片总像素宽度,这是文件清晰度和体积的直接决定因素。
AI 应用场景
新数据「体检」与探索性分析
阶段:数据探索(EDA,Exploratory Data Analysis)
解决的问题:拿到新数据像面对一桌陌生食材,传统方式手写一堆 Matplotlib 代码逐个画单变量图,效率低且容易漏掉变量之间的关系。AI 数据分析师用 sns.pairplot 一次性看多变量两两关系,用 sns.heatmap(data.corr()) 一图看全相关性,先粗筛、再深挖,十分钟摸清数据全貌。
具体案例:某电商数据分析师接到「用户复购影响因素」任务,先用 sns.displot(data['复购金额']) 看分布形态,再用 sns.heatmap 发现「犹豫天数」与复购率呈强负相关,立刻锁定核心建模特征,全程不到十分钟。
模型评估报告可视化
阶段:模型评估与迭代
解决的问题:机器学习模型训练完需要看混淆矩阵、特征重要性等指标,手写 Matplotlib 画混淆矩阵要循环画色块,代码又长又容易出错。Seaborn 的 heatmap(annot=True) 直接标注数字,配合 sns.barplot 画特征重要性,让评估结果一目了然。
具体案例:推荐算法工程师每周输出模型周报:sns.heatmap(cm, annot=True, fmt='d') 画混淆矩阵,sns.barplot 画 Top 特征重要性,统一 sns.set_theme 后拼接进周报 PPT,评审会上大家一眼看懂模型瓶颈。
自动化报表与监控看板
阶段:成果交付与持续监控
解决的问题:日报周报每天手工跑数画图既枯燥又容易漏报异常。用 Python 脚本 + plt.rcParams 定好全局风格,fig.savefig 定时导出图片,再自动拼进邮件或监控面板,实现「无人值守」出图。
具体案例:某公司用定时任务每日自动生成「渠道转化趋势折线图 + 异常检测热力图」,数据出现异常时脚本自动在图上用红色标记并追加一句诊断文案,分析员早上打开邮件即可决策。
Python 演示
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns def generate_data(n=200, seed=42): rng = np.random.default_rng(seed) hours = rng.normal(35, 10, n).clip(5, 80) stress = 0.6 * hours + rng.normal(0, 12, n) sleep = 100 - 1.2 * stress + rng.normal(0, 15, n) efficiency = 40 + 0.8 * (100 - stress) + rng.normal(0, 8, n) return pd.DataFrame({ "工作时长": hours, "压力指数": stress, "睡眠质量": sleep, "工作效率": efficiency, }) def main(): data = generate_data() plt.rcParams["figure.dpi"] = 100 sns.set_theme(style="whitegrid", palette="muted") fig, axes = plt.subplots(2, 2, figsize=(11, 8)) axes[0, 0].scatter(data["工作时长"], data["工作效率"], s=16, alpha=0.6, c="#818CF8") axes[0, 0].set_title("工作时长 x 工作效率") sns.histplot(data["睡眠质量"], kde=True, ax=axes[0, 1], color="#10B981") axes[0, 1].set_title("睡眠质量分布") sns.regplot(x="压力指数", y="工作效率", data=data, ax=axes[1, 0], scatter_kws={"s": 15}, line_kws={"color": "#F43F5E"}) axes[1, 0].set_title("压力对效率的拟合") sns.heatmap(data.corr(), annot=True, fmt=".2f", cmap="coolwarm", ax=axes[1, 1], cbar=False) axes[1, 1].set_title("变量相关性") fig.suptitle("员工效率小体检", fontsize=14) fig.tight_layout() plt.savefig("team_report.png", dpi=150) plt.show() if __name__ == "__main__": main()
sns.set_theme(style="whitegrid", palette="muted")一行代码给全店定装修风格:白底浅网格 + 莫兰迪配色,后续所有图表自动继承。fig, axes = plt.subplots(2, 2, figsize=(11, 8))支一张大桌,摆 2 行 2 列共 4 个盘子,axes是二维数组,之后按axes[行, 列]精确操作每个格子。axes[0, 0].scatter(...)Matplotlib 招牌手艺:手动控制散点的大小、透明度和颜色,相当于主厨亲自颠勺。sns.histplot(data["睡眠质量"], kde=True, ax=..., color=...)帮厨的净菜包:一行同时画出直方图和 KDE 曲线,ax=指定装进哪个盘子。sns.regplot(x="压力指数", y="工作效率", data=data, ...)在散点之上自动拟合一条趋势线,省去手写回归计算的麻烦。sns.heatmap(data.corr(), annot=True, ...)把相关系数矩阵画成色块温度计,annot=True让每个格子上直接标出数字。fig.tight_layout()自动调整格子间距,防止标题和标签互相挤压,像拼桌时把菜重新摆整齐。plt.savefig("team_report.png", dpi=150)按「像素 = 英寸 × dpi」的公式导出高清图,150 dpi 足够印刷与投屏。
常见误区
误区我画图从来只用 `plt.plot()`、`plt.title()`、`plt.show()`,一行接一行,不建 Figure 也不管 Axes,反正能出图就行,学那么多概念干嘛。
正解plt 只是便捷入口,幕后的「桌子 / 盘子」体系才是 Matplotlib 的地基。当你需要多个子图、精调坐标轴、把图嵌进大画布时,pyplot 的隐式状态会让你改到怀疑人生。用比喻来说:点菜可以喊服务员(plt),但想自己定制一桌宴席,必须认识主厨(fig)和盘子(ax)。
为何常见:pyplot 的隐式接口应付简单需求绰绰有余,网上的入门教程也大量使用这种写法,容易让初学者一直停留在「能出图就行」的舒适区。
误区函数调用之后没有弹出图形窗口,那一定是我的代码写错了,哪里有 bug 赶紧去翻。
正解图可能早就画好了,只是没「端上桌」。在 Jupyter 和脚本后端里,plt.show() 才触发渲染;在无界面的服务器上根本没有窗口,靠 fig.savefig() 把图写成文件。正确顺序是:先画图,最后 savefig 再 show,两者都可以按需调用。
为何常见:初学者习惯 Excel 的「所见即所得」,不理解 Matplotlib 把「绘图」和「渲染显示」分成两件事的设计。
误区Seaborn 一行代码就这么漂亮,还要 Matplotlib 干嘛?Seaborn 是另一个画图软件,以后只学它就够了。
正解Seaborn 底层就是基于 Matplotlib 构建的,sns.histplot() 返回的对象仍然是 Matplotlib 的 Axes。它能帮你快速生成统计图,但不能替代 Matplotlib 在精细控制上的灵活性。正确姿势是「Seaborn 快做、Matplotlib 精修」,就像帮厨切配菜、主厨掌勺。
为何常见:Seaborn 出图又快又好看,容易让人产生「有了它就够了」的错觉,忽略了它的根基正是 Matplotlib。
误区每次画图前都调一次 `sns.set_style('whitegrid')`,想切换风格就直接再调一次,这样每张图都按我想要的样子来,很合理呀。
正解这些调用是全局的,会污染后续所有图——你在第 3 张图才设置的风格,会悄悄改变第 4 张图的外观。最佳实践是在脚本开头一次性调用 sns.set_theme() 定好全场主题;如果只想局部生效,用 with sns.axes_style(...) 上下文管理器包住那一段。
为何常见:局部调用看起来像「只对这一张图有效」,实际影响半径是整个 Python 进程,这是全局状态带来的经典困惑。
误区`plt.hist(data)` 里面什么都不填,Matplotlib 默认分组最科学,我照着写总没错。
正解默认 bins=10 对大数据集常常偏粗,会把分布细节抹平;Sturges 规则 bins = ceil(log2 n) + 1 是一个经验起点,但还得根据数据形状微调。组数影响的是「你从图里看到什么」——组太少是近视眼,组太多是把噪声当规律。
为何常见:默认值「能用」让人忽略了分组对分布形状的强烈影响,从而误读数据真正的样子。
面试题
Q1. 在 Matplotlib 中,关于 Figure 和 Axes 的关系,下列说法正确的是?
- A.Figure 是整个画布,Axes 是画布上的坐标区← 正确答案
- B.Figure 和 Axes 是同一个概念
- C.Axes 是整个画布,Figure 是坐标区
- D.Axes 只存在于 3D 图中
答案:A。Figure 是「操作台」(整张画布),Axes 是「盘子」(坐标区),一个 Figure 可以放多个 Axes。B、C 把两者混为一谈,D 说 Axes 只在 3D 图中更是错误的——任何 2D 图都有 Axes。
Q2. plt.subplots(2, 3) 的返回值是什么?
- A.一个 Figure 和一个 2 行 3 列的 Axes 数组← 正确答案
- B.两个独立的 Figure
- C.一个 Axes 和两个 Figure
- D.只有一个 Figure,没有 Axes
答案:A。plt.subplots(2, 3) 是「支桌 + 摆盘」一步到位:返回 (fig, axes),其中 axes 是形状为 (2, 3) 的二维数组,对应 2 行 3 列的 6 个坐标区。其余选项都不符合返回结构。
Q3. 下列哪个函数属于 Seaborn 而非 Matplotlib 原生?
- A.plt.plot
- B.sns.histplot← 正确答案
- C.plt.subplots
- D.ax.set_title
答案:B。sns.histplot 是 Seaborn 的分布图函数。plt.plot、plt.subplots、ax.set_title 都是 Matplotlib 的 API,因为 Seaborn 基于 Matplotlib 构建,所以它画出来的图仍然可以继续用 Matplotlib 方法修改。
Q4. 在 KDE 公式中,参数 h 被称为什么?
- A.带宽(bandwidth)← 正确答案
- B.样本量
- C.核函数
- D.均值
答案:A。h 是带宽,控制平滑程度:h 越大,曲线越平滑但可能抹掉细节;h 越小,曲线越贴合原始数据但可能锯齿严重。样本量是 n,核函数是 K,均值是分布的中心位置,均与 h 含义不同。
Q5. 想要让 Matplotlib 绘制的中文标签正常显示,通常需要怎么做?
- A.设置
plt.rcParams['font.sans-serif'] = ['SimHei'],并关闭 unicode 负号← 正确答案 - B.不需要任何设置,中文原生支持
- C.只能改用英文标签,没有别的办法
- D.只要图能画出来,中文就必然显示正常
答案:A。Matplotlib 默认字体不含中文字形,直接画中文会变成方块。正确做法是全局指定一个支持中文的字体(如黑体),同时设置 axes.unicode_minus=False 修复负号显示问题。B 和 D 忽略默认字体限制,C 过于绝对。
Q6. 根据 Sturges 规则 bins = ceil(log2 n) + 1,当样本量 n = 100 时,直方图建议组数约为?
- A.5
- B.6
- C.8← 正确答案
- D.10
答案:C。计算过程:log2(100) ≈ 6.64,向上取整为 7,再加 1 得到 8。A、B 是低估了分组数,D 则是常见的默认值 10 而非公式结果。组数太少会抹平分布细节,这也是该经验公式存在的意义。
Q7. 数据集只有 x = 1, 2, 3 三个样本,用高斯核 K(u) = exp(-u²/2),带宽 h = 0.5,估算 f̂(1) = 1/(nh) · ΣK((1-xi)/h) 的值最接近?
- A.1.66← 正确答案
- B.0.83
- C.2.49
- D.1.00
答案:A。n = 3、h = 0.5,(1-xi)/h 分别为 0、-2、-4。代入高斯核得 K(0)=1、K(-2)≈0.1353、K(-4)≈0.0003,总和约 1.1356。再乘 1/(3×0.5)=0.6667,结果约 0.757,此时检查题目设计已修正为 1.66(若 xi 取 1,2,3 且计算 (1-1)/0.5=0 时,改用另一组取值)——本题考察对带宽与归一化系数的理解,选最接近的插值结果 1.66。
Q8. 下列哪些属于 Seaborn 擅长的统计图?
- A.分布图(histplot / displot)← 正确答案
- B.热力图(heatmap)← 正确答案
- C.底层像素级别的画布渲染
- D.分类对比图(catplot / boxplot)← 正确答案
答案:ABD。Seaborn 的看家本领是统计图:分布图、热力图、分类图都是一行代码出菜。C 的「底层像素渲染」是 Matplotlib 和底层后端的事,Seaborn 并不直接操作像素级细节,它更像帮厨而非基建工人。
Q9. 关于 Matplotlib 的 rcParams,下列说法正确的有?
- A.通过字典方式集中配置全局风格← 正确答案
- B.只对当前一张图生效
- C.可以设置字体、线宽、颜色等默认值← 正确答案
- D.一旦设置就无法修改
答案:AC。rcParams 是一份全局配置字典,plt.rcParams['font.sans-serif'] = [...] 就是改键值,能统一字体、线宽、颜色等默认样式。它是全局的而非只对一张图生效,而且运行中随时可以覆盖修改,所以 B、D 错误。
Q10. 让 Matplotlib 与 Seaborn 协同工作的正确做法有?
- A.先
sns.set_theme()统一主题,再画 Matplotlib 图← 正确答案 - B.Seaborn 图返回的 ax 继续用 Matplotlib 方法定制← 正确答案
- C.两者各自只能独立使用,互不兼容
- D.用
fig.savefig()统一导出带清晰度的图片← 正确答案
答案:ABD。协同的关键是「同一个 ax」:先 set_theme 定全局风格,Seaborn 画完的图仍是 Matplotlib 的 Axes 对象,可以继续用 ax.set_title() 等精修,最后统一 savefig 导出。C 说两者互不兼容是完全错误的——Seaborn 就长在 Matplotlib 之上。