编程练习题:Matplotlib scatter + text + annotate 综合绘图
题目
使用 matplotlib 完成下面绘图任务:
- 创建画布与子图,figsize=(8,6)
- 准备数据:
x = [1, 3, 5, 7, 9] y = [2, 6, 3, 8, 4]- 绘制散点图 scatter,点大小 s=80,颜色 c="orange"
- 使用
ax.text,在坐标 (7,8.5) 添加文字最高点,水平对齐 ha='center',字号 12 - 使用
ax.annotate添加箭头标注:- 标注文字:
峰值点 - 箭头指向目标点 xy=(7,8)
- 文字放在 xytext=(8,9.5)
- 箭头样式 arrowstyle='->',箭头颜色 red
- 文字增加圆角背景框 bbox=dict (boxstyle="round", facecolor="#f0f0f0")
- 标注文字:
- 设置 x 轴范围 xlim (0,10),y 轴范围 ylim (0,11)
- 解决中文显示乱码,最后展示图片 plt.show ()
要求:面向对象写法(fig,ax = plt.subplots)
参考答案
import matplotlib.pyplot as plt # 解决中文、负号乱码 plt.rcParams["font.sans-serif"] = ["SimHei"] plt.rcParams["axes.unicode_minus"] = False # 1 创建画布子图 fig, ax = plt.subplots(figsize=(8, 6)) # 2 数据 x = [1, 3, 5, 7, 9] y = [2, 6, 3, 8, 4] #3 绘制散点图 ax.scatter(x, y, s=80, c="orange") #4 ax.text 添加纯文本 ax.text(7, 8.5, "最高点", ha="center", fontsize=12) #5 annotate带箭头标注 ax.annotate( "峰值点", xy=(7, 8), #箭头指向的数据点 xytext=(8, 9.5), #文字位置 arrowprops=dict(arrowstyle='->', color='red'), bbox=dict(boxstyle="round", facecolor="#f0f0f0") ) #6 设置坐标轴范围 ax.set_xlim(0, 10) ax.set_ylim(0, 11) plt.show()解析
ax.scatter():绘制散点,s 控制点大小,c 控制点颜色。ax.text(x,y,s):纯文字,无箭头,使用数据坐标;ha='center'表示文字水平中心落在 (x,y)。ax.annotate():带箭头标注xy:箭头尖端指向的目标数据点xytext:标注文字放置的坐标arrowprops字典,控制箭头样式、颜色bbox给文字添加背景框,boxstyle="round"代表圆角方框
- 坐标体系:scatter、text、annotate 默认都是数据坐标,修改 xlim/ylim,元素会跟着坐标轴缩放。
- 中文配置:
SimHei黑体解决中文方框,axes.unicode_minus=False解决负号显示异常。
易错点(考试常考)
❌ 混淆 text 和 annotate:text 不能画箭头;annotate 专门用来箭头标注。 ❌ xy 与 xytext 写反:箭头从 xytext(文字)指向 xy(目标点),写反箭头方向颠倒。 ❌ 忘记 rcParams 中文设置,文字显示方框乱码。 ❌ plt.xlim () 和 ax.set_xlim () 混用,面向对象写法推荐 ax.set_xlim。
案例场景:产品月度销量散点标注图
业务背景
某门店统计 5 个月的月度销量数据,x 为月份序号,y 为月度销量。 需要可视化展示各月销量散点,并且:
- 在图上用纯文本标记 “销量高点区域”;
- 使用带箭头 annotate标注全年销量峰值;
- 散点展示每月销量点位。
数据: 月份 x = [1, 3, 5, 7, 9] 销量 y = [2, 6, 3, 8, 4] x:月份编号;y:销量(单位:百件)
绘图需求(和上面代码一一对应)
- 创建画布 figsize=(8,6),采用面向对象写法;
- 绘制散点,橙色圆点,点大小 80;
- 在峰值点上方使用
ax.text放置文字:最高点; - 使用
ax.annotate添加箭头标注:文字峰值点,箭头指向 7 月销量 (7,8),文字放在右上角,红色箭头,文字圆角浅灰背景框; - 设置 x 轴范围 0~10,y 轴 0~11;
- 支持中文正常显示,展示图表。
业务解读
- scatter:直观展示每个月份的销量数据点;
- ax.text:放置普通说明文字,不需要箭头,用于区域说明;
- ax.annotate:箭头精准指向峰值数据点,方便阅读者一眼定位最重要数据,是数据分析图表常用标注手段。
场景拓展提问(课堂思考题)
- 如果修改 xlim 坐标轴范围,散点、text、annotate 标注会不会跟着移动?为什么?
答:会移动。三者默认都是数据坐标,绑定坐标轴数值。
- text 和 annotate 怎么选?
答:只放文字,不需要箭头 → text;需要箭头指向某一个数据点,突出重点 → annotate。