Matplotlib核心绘图函数详解:plot、scatter、grid、arrow、text实战指南 1. 项目概述从零开始掌握Matplotlib核心绘图函数如果你刚开始接触Python数据可视化面对Matplotlib里那一堆以plt.开头的函数是不是感觉有点眼花缭乱plot、scatter、grid、arrow、text……每个函数好像都能画点东西但具体怎么用、什么时候用却又模模糊糊。我曾经也在这个阶段徘徊过对着官方文档里复杂的参数列表发愁画出来的图要么太简陋要么就是各种元素堆在一起乱七八糟。今天我就以一个过来人的身份把这五个最常用、也最核心的绘图函数——plt.grid()、plt.scatter()、plt.plot()、plt.arrow()、plt.text()——给你彻底讲透。这不仅仅是API用法的罗列我会结合我多年做数据分析报告和学术图表绘制的实际经验告诉你每个函数背后的设计逻辑、关键参数的“甜点”设置、以及如何将它们有机组合画出一张既专业又美观的图表。无论你是想快速绘制折线图观察趋势还是需要在散点图中高亮特定数据点或是给图表添加清晰的指示箭头和注释文字掌握这五个函数就相当于掌握了Matplotlib手工绘图的“基本功”。接下来我们抛开那些复杂的面向对象接口就用最直接的pyplot接口一步步拆解这些函数的奥秘。2. 核心函数深度解析与设计逻辑在动手写代码之前我们得先搞清楚每个函数是“干什么的”以及“为什么这么设计”。Matplotlib的pyplot模块提供了一套类似MATLAB的命令式绘图接口每个函数都承担着特定的图形元素构建任务。理解它们的职责边界是灵活组合运用的前提。2.1 plt.plot()绘制连续数据的基石plt.plot()无疑是Matplotlib中使用频率最高的函数没有之一。它的核心设计目标是绘制连续型数据的图形表示最典型的就是折线图。但它的能力远不止于此通过简单的参数切换它就能变身去画散点图用标记点、阶梯图、甚至是无线的纯标记图。它的调用逻辑非常直观plt.plot(x, y, fmt, **kwargs)。x和y是你提供的数据序列fmt是一个神奇的格式字符串而**kwargs则是一扇通往深度定制化的大门。很多新手会困惑于plot和scatter的区别简单来说当你的数据点本质上是顺序的、连续的并且你关注的是点与点之间的趋势或路径时用plot。比如时间序列数据、函数曲线等。plot在渲染大量数据点时效率通常高于scatter因为它内部优化了连续路径的绘制。格式字符串fmt是plot函数的精髓所在它用极简的语法控制了颜色、标记和线型。其基本结构是[颜色][标记][线型]。例如‘ro-’表示红色(r)、圆形标记(o)、实线(-)。你可以任意组合‘g^:’就是绿色(g)、三角形标记(^)、点线(:)。如果只写‘b-’那就是蓝色实线没有标记点。这个设计让你无需记住一堆参数名就能快速定义图形样式非常高效。注意fmt字符串和**kwargs关键字参数如color‘red’, marker‘o’, linestyle‘-’是互斥的。如果你同时提供了fmt‘ro-‘又在kwargs里写了color‘blue’那么kwargs中的设置会覆盖fmt中的对应部分。我的建议是对于快速绘图用fmt字符串对于需要精细控制的正式图表使用关键字参数这样代码意图更清晰。2.2 plt.scatter()揭示分布与关系的利器与plot关注“连线”不同plt.scatter()生来就是为了绘制离散数据点并着重展现数据点的分布、密度、聚类或相关性。在散点图中每个点都是独立的个体点与点之间没有顺序关系虽然你可以按某个维度排序后绘制但那不是散点图强调的重点。plt.scatter(x, y, sNone, cNone, markerNone, **kwargs)的参数充满了可能性。最强大的特性在于s点大小和c点颜色可以接受数组。这意味着你可以用点的大小来映射第三个连续变量如人口数量用点的颜色来映射第四个变量如类别或温度值在一张二维图上同时展示四个维度的信息这是plot函数难以直接实现的。例如在分析城市数据时你可以用x轴表示人均GDPy轴表示平均房价点的大小表示城市人口颜色表示所属区域。一张图看下来经济、房价、规模和地理关系一目了然。这种多维映射能力是散点图的核心价值。实操心得当数据量非常大例如超过10万个点时scatter的渲染可能会变慢。此时可以考虑以下策略1使用alpha参数设置透明度如alpha0.5让重叠区域颜色加深既能展示密度又能提升渲染性能。2如果不需要颜色/大小映射只是画一堆点可以尝试用plot函数加上标记但无线型如plt.plot(x, y, ‘,’, alpha0.5)逗号表示像素点速度极快。3对于超大数据集可以考虑使用专门的高性能库如Datashader进行预处理。2.3 plt.grid()构建图表的阅读坐标系plt.grid()函数本身不绘制数据但它为数据提供了一个可读的参考背景就像坐标纸上的格子线。它的主要作用是辅助读者进行数值估算和对齐判断。是否添加网格线以及网格线的样式直接影响到图表的“专业感”和“易读性”。调用方式很简单plt.grid(visibleTrue, which‘major’, axis‘both’, **kwargs)。关键参数在于which和axis。which可以是‘major’主刻度网格、‘minor’次刻度网格或‘both’。默认是‘major’。如果你想要更精细的网格需要先设置次刻度定位器例如plt.minorticks_on()然后再调用plt.grid(True, which‘minor’, alpha0.2)。axis参数控制哪个轴显示网格可以是‘x’、‘y’或‘both’默认。网格线的样式linestyle、linewidth、color、alpha需要精心调配。一个常见的技巧是主网格线用浅灰色color‘#CCCCCC’、实线linestyle‘-‘、线宽稍细linewidth0.8次网格线用更浅的灰色、虚线linestyle‘:’且设置较高的透明度alpha0.5。这样既能提供参考又不会让网格线喧宾夺主抢了数据曲线的风头。注意事项网格线应该在添加了所有数据元素之后再启用。因为网格线的绘制范围由plt.axis()或plt.xlim()/ylim()决定和刻度位置可能会随着数据的绘制而自动调整。先画数据再启用并定制网格可以确保网格线覆盖整个有效数据区域并且样式符合最终图表的需求。2.4 plt.arrow()指向重点的视觉引导在图表中有时你需要明确地指出某个特定位置或者说明一个过程、一个向量。这就是plt.arrow()的用武之地。它用于绘制一个带箭头的线段从点(x, y)指向点(dx, dy)。注意这里的参数设计plt.arrow(x, y, dx, dy, **kwargs)。(x, y)是箭头起点的坐标dx和dy是箭头从起点到终点的位移不是终点的绝对坐标。这是新手最容易踩坑的地方很多人误以为(dx, dy)是终点坐标。箭头的美观度由一系列关键字参数控制width: 箭头尾部的宽度杆身。head_width: 箭头头部的宽度通常设为width的2-3倍比较美观。head_length: 箭头头部的长度。length_includes_head: 这是一个布尔值。如果为True默认那么参数dx, dy定义的位移长度包含了箭头头部。如果为False则dx, dy只定义杆身的长度箭头头部会额外画出去。为了精确控制箭头尖端所指的位置我通常将其设为True。shape: 箭头头部的形状可以是‘full’,‘left’,‘right’。fc(facecolor) 和ec(edgecolor): 分别控制箭头的填充色和边缘色。2.5 plt.text()不可或缺的图表注释“一图胜千言”但恰当的文本注释能让这“千言”表达得更加精准。plt.text()用于在图表上的任意指定坐标(x, y)处添加文本。其基本调用是plt.text(x, y, s, **kwargs)其中s是文本字符串。这个函数的强大之处在于其丰富的文本属性控制fontsize: 字体大小可以用数字如12也可以用相对字符串如‘large’,‘x-small’。fontweight: 字体粗细如‘normal’,‘bold’。fontfamily: 字体家族如‘sans-serif’,‘serif’。ha和va: 水平对齐和垂直对齐。ha可以是‘left’,‘center’,‘right’va可以是‘top’,‘center’,‘bottom’,‘baseline’。默认情况下(x, y)坐标对应文本的左下角。通过设置ha‘center’,va‘center’可以让坐标点对应文本的中心这在标记数据点时非常方便。bbox: 这是一个字典用于在文本背后添加一个框。例如bboxdict(boxstyle‘round’, facecolor‘wheat’, alpha0.8)会添加一个圆角矩形、浅黄色半透明背景框能让文本在复杂的图表背景中突出显示。3. 关键参数详解与实战配置指南知道了函数是干什么的接下来我们就要钻到参数细节里去看看怎么用这些“旋钮”调出我们想要的图表效果。很多参数看似简单但不同的组合会产生天壤之别的视觉效果。3.1 plot与scatter的样式控制参数对比虽然plot和scatter都能画点但它们控制样式的参数既有重叠又有区别理解这些区别能避免很多困惑。样式属性plt.plot()plt.scatter()说明与技巧颜色 (Color)color或fmt字符串color或cplot的color接受颜色字符串或RGB元组。scatter的c功能更强大可接受单一颜色、颜色序列或用于色彩映射的数值数组。标记 (Marker)marker或fmt字符串marker两者共用一套标记符号如‘o’(圆),‘s’(方),‘^’(上三角),‘v’(下三角),‘’(加号),‘x’(叉),‘*’(星),‘.’(点),‘,’(像素)。plot的标记大小通常由markersize简称ms控制。大小 (Size)markersize(ms)s这是关键区别plot的markersize是点的直径以磅points为单位是一个标量值所有点一样大。scatter的s是点的面积以像素的平方为单位不完全是更准确的说法是它是以点的平方为单位的面积值s72**2对应1平方英寸。更重要的是s可以是一个数组让每个点拥有不同大小。边缘 (Edge)markeredgecolor(mec),markeredgewidth(mew)edgecolor(ec),linewidths(lw)plot的标记边缘控制参数是mec和mew。scatter的对应参数是edgecolor和linewidths。注意scatter的linewidths是复数形式。填充 (Face)markerfacecolor(mfc)facecolor(fc) 或通过c映射plot的标记填充色由mfc控制。对于scatter如果没有设置c数组点的填充色由facecolor控制如果设置了c数组则填充色由色彩映射决定facecolor通常被忽略。实操心得关于点的大小单位scatter中s参数的单位问题经常让人头疼。官方文档说它是“面积”单位是“点**^2”。一个经验法则是如果你想得到和plot中markersize36直径36磅的圆点视觉上差不多大的散点在scatter中大约需要设置s(36**2)也就是约1300。因为plot的markersize是直径而scatter的s是面积面积与直径的平方成正比。在实际操作中我通常先设一个基准值比如s50然后在图表渲染出来后通过肉眼观察和反复微调来确定最终值因为最终显示效果还受到图形DPI和缩放比例的影响。3.2 网格、箭头与文本的精细化调参对于grid、arrow和text精细的参数调整是让图表从“能用”到“好看”的关键。plt.grid()的进阶参数**kwargs它接受任何Line2D的属性。最常用的是alpha透明度设置在0.3到0.7之间让网格线若隐若现。linestyle线型。‘-‘实线‘–‘虚线‘:’点线‘-.’点划线。主网格常用‘-‘次网格用‘:’。linewidth线宽主网格0.8-1.0次网格0.4-0.6。color颜色推荐使用浅灰色系如‘#DDDDDD’,‘lightgray’,‘#B0B0B0’。避免使用纯黑色或对比度过高的颜色。plt.arrow()的形态控制除了之前提到的基本参数绘制一个美观的箭头还需要注意比例。一个经验性的比例关系是head_width 3 * width,head_length 2 * head_width。例如plt.arrow(0, 0, 1, 1, width0.02, head_width0.06, head_length0.12, fcsteelblue, ecnavy, length_includes_headTrue)这个箭头杆身较细头部宽大且长度适中填充色和边缘色有深浅对比看起来清晰又专业。length_includes_headTrue确保了箭头尖端准确地落在坐标(1,1)上。plt.text()的定位与装饰文本定位的准确性依赖于对齐参数ha和va。假设你有一个数据点(x0, y0)你想在它的正上方添加标签。错误做法plt.text(x0, y0, ‘Label’)。这会把文字的左下角钉在数据点上文字会覆盖数据点。正确做法plt.text(x0, y0, ‘Label’, ha‘center’, va‘bottom’)。这样文字的水平中心对准x0底部对准y0文字就稳稳地出现在点的正上方了。bbox参数是制作突出注释的神器。boxstyle可以是‘round’圆角,‘round,pad0.3’圆角带内边距,‘square’方角,‘circle’圆形等。facecolor设置背景色alpha设置透明度edgecolor和linewidth设置边框。4. 综合实战绘制一张专业的分析图表理论说再多不如动手画一张。假设我们现在有一组模拟的“产品迭代周期与用户满意度”的数据我们来综合运用这五个函数绘制一张包含趋势线、关键点标注、区域指示和文字说明的完整分析图。4.1 数据准备与基础绘图首先我们生成一些模拟数据并绘制出基础折线图。import matplotlib.pyplot as plt import numpy as np # 设置中文字体如果需要显示中文 plt.rcParams[‘font.sans-serif’] [‘SimHei’, ‘Arial Unicode MS’, ‘DejaVu Sans’] # 根据系统选择 plt.rcParams[‘axes.unicode_minus’] False # 解决负号显示问题 # 模拟数据迭代周期周和用户满意度得分1-10分 iteration np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) satisfaction np.array([5.2, 5.8, 6.5, 7.2, 8.1, 8.7, 8.9, 8.5, 8.0, 8.8]) # 模拟另一个团队的数据作为对比 satisfaction_b np.array([4.8, 5.5, 6.8, 7.5, 7.8, 8.0, 8.2, 8.4, 8.6, 8.9]) # 创建画布和坐标系 plt.figure(figsize(10, 6), dpi100) # 设置图形大小和分辨率 # 使用plot绘制两条折线分别代表A团队和B团队 line_a, plt.plot(iteration, satisfaction, ‘b-o’, label‘A团队’, linewidth2, markersize8, markeredgecolor‘white’, markeredgewidth1) line_b, plt.plot(iteration, satisfaction_b, ‘r–s’, label‘B团队’, linewidth2, markersize8, markeredgecolor‘white’, markeredgewidth1) # 添加标题和坐标轴标签 plt.title(‘产品迭代周期与用户满意度关系’, fontsize16, fontweight‘bold’, pad20) plt.xlabel(‘迭代周期 (周)’, fontsize12) plt.ylabel(‘用户满意度得分’, fontsize12) # 设置坐标轴范围留出一些空间给箭头和文本 plt.xlim(0.5, 10.5) plt.ylim(4.5, 9.5) # 添加图例 plt.legend(loc‘lower right’, fontsize10, frameonTrue, shadowTrue)这段代码绘制了两条基础的趋势线。plot函数中我们用‘b-o’表示A团队是蓝色实线带圆圈标记‘r–s’表示B团队是红色虚线带方块标记。markeredgecolor‘white’和markeredgewidth1给标记点添加了白色边框使其在线上更清晰。4.2 使用scatter高亮关键数据点假设我们发现A团队在第6次迭代时满意度有一个显著跃升B团队在第8次迭代后趋于稳定。我们用scatter来高亮这两个关键点。# 高亮A团队的关键跃升点第6次迭代 highlight_idx_a 5 # Python索引从0开始对应第6次迭代 plt.scatter(iteration[highlight_idx_a], satisfaction[highlight_idx_a], s250, c‘gold’, edgecolors‘darkorange’, linewidths2, zorder5, label‘_nolegend_’) # zorder提高图层label‘_nolegend_’防止此点进入图例 # 高亮B团队的稳定起点第8次迭代 highlight_idx_b 7 plt.scatter(iteration[highlight_idx_b], satisfaction_b[highlight_idx_b], s250, c‘limegreen’, edgecolors‘darkgreen’, linewidths2, zorder5, label‘_nolegend_’)这里s250设置了高亮点的大小使其明显大于折线上的普通标记点markersize8对应的面积约64。zorder5确保了散点绘制在折线图的上层不会被线盖住。label‘_nolegend_’是一个小技巧防止这个单独的散点被添加到图例中扰乱图例信息。4.3 添加grid构建阅读基准现在我们添加网格线让读者能更准确地读取数值。# 启用主网格线并设置样式 plt.grid(True, which‘major’, axis‘both’, linestyle‘-‘, linewidth0.7, alpha0.6, color‘gray’) # 启用次刻度并添加次网格线更浅更细 plt.minorticks_on() plt.grid(True, which‘minor’, axis‘both’, linestyle‘:’, linewidth0.5, alpha0.4, color‘lightgray’)我们启用了主次两种网格。主网格是实线颜色和透明度适中用于主要区间的判断。次网格是点线更浅更细提供更精细的参考但又不会干扰主视觉。4.4 使用arrow和text添加分析注释图表有了数据但还缺少“故事”。我们用箭头和文本来讲述数据背后的洞察。# 注释1用箭头和文字说明A团队的跃升 # 箭头起点在点(6, 8.7)的左上方指向该点 arrow_start_x iteration[highlight_idx_a] - 1.5 arrow_start_y satisfaction[highlight_idx_a] - 0.5 dx iteration[highlight_idx_a] - arrow_start_x dy satisfaction[highlight_idx_a] - arrow_start_y plt.arrow(arrow_start_x, arrow_start_y, dx, dy, width0.03, head_width0.1, head_length0.15, fc‘darkorange’, ec‘chocolate’, length_includes_headTrue, zorder6) # 在箭头起点附近添加说明文字 plt.text(arrow_start_x - 0.2, arrow_start_y - 0.3, ‘关键功能上线\n满意度显著提升’, fontsize10, ha‘right’, va‘top’, bboxdict(boxstyle‘round,pad0.5’, facecolor‘wheat’, alpha0.8, edgecolor‘orange’)) # 注释2用箭头和文字说明B团队的稳定期 # 这次我们画一个水平箭头表示“稳定区间” stable_start_x iteration[highlight_idx_b] stable_end_x iteration[-1] 0.5 # 指向最后一个数据点右侧 stable_y satisfaction_b[highlight_idx_b] - 0.2 # 稍微偏下一点避免压线 plt.arrow(stable_start_x, stable_y, stable_end_x - stable_start_x, 0, width0.02, head_width0.08, head_length0.2, fc‘darkgreen’, ec‘forestgreen’, length_includes_headTrue, zorder6) plt.text((stable_start_x stable_end_x)/2, stable_y - 0.4, ‘进入稳定维护期’, fontsize10, ha‘center’, va‘top’, bboxdict(boxstyle‘round,pad0.5’, facecolor‘honeydew’, alpha0.9, edgecolor‘limegreen’)) # 最后在图表右下角添加一个整体的数据来源或备注 plt.text(10.5, 4.5, ‘数据来源模拟用户调研 | 制图分析团队’, fontsize9, ha‘right’, va‘bottom’, style‘italic’, color‘dimgray’) # 自动调整布局确保所有元素标题、标签、图例、注释都能完整显示 plt.tight_layout() # 显示图形 plt.show()在这部分代码中我们精心计算了箭头的起点和位移确保箭头能准确指向目标点。文本注释使用了bbox参数添加了与箭头颜色呼应的背景框使注释在图中非常醒目。zorder参数确保了箭头和文本绘制在网格线和数据线的上层。最后plt.tight_layout()是一个非常重要的函数它能自动调整子图参数使整个图形元素标签、标题、刻度标签等恰好容纳在画布内避免重叠或裁剪在添加了大量自定义元素后尤其有用。5. 常见问题排查与性能优化技巧在实际使用中你肯定会遇到各种奇怪的问题。下面我整理了一些最常见的问题及其解决方法以及一些提升绘图效率和效果的经验技巧。5.1 绘图元素显示异常问题速查问题现象可能原因解决方案plot画的线不显示1. 数据包含NaN或inf。2. 线型linestyle被设置为‘None’或‘ ‘。3. 线宽linewidth设置为0。1. 检查并清洗数据data np.nan_to_num(data)。2. 检查fmt字符串或linestyle参数确保不是‘None’。3. 设置合理的线宽如linewidth1.5。scatter点的大小或颜色映射不生效1. 参数s或c传入的是列表而非NumPy数组。2. 颜色数组c的值范围不合适未触发色彩映射。3. 对于颜色映射未设置cmap参数。1. 将列表转换为NumPy数组snp.array(size_list)。2. 确保c是数值型数组。使用plt.colorbar()查看映射范围。3. 指定色彩映射plt.scatter(…, cvalues, cmap‘viridis’)。grid()网格线太密或太疏刻度的密度不合适。网格线是基于刻度线绘制的。调整刻度定位器plt.locator_params(axis‘x’, nbins10)设置x轴大约10个刻度。或使用plt.xticks()手动指定刻度位置。arrow()箭头位置不对或形状怪异1. 误解dx, dy为终点坐标。2.head_width或head_length相对于width比例失调。3. 坐标轴比例不对称aspect不为‘equal’。1. 牢记(dx, dy)是位移。终点(xdx, ydy)。2. 遵循head_width ≈ 3*width,head_length ≈ 2*head_width的经验比例。3. 如果需要等比例箭头可先设置plt.axis(‘equal’)。text()文字位置偏移或重叠1. 未正确设置ha和va对齐方式。2. 文本坐标是数据坐标但图形缩放后位置变了。3. 多个文本彼此重叠。1. 根据需求明确设置ha和va。标记点上方常用ha‘center’, va‘bottom’。2. 考虑使用坐标变换如plt.annotate()或transform参数。3. 手动微调坐标或使用adjustText库自动调整文本位置。图例legend中出现不需要的条目调用scatter或plot时没有对不想显示在图例中的元素设置label‘_nolegend_’。在绘制辅助元素如高亮散点、箭头等时显式加上label‘_nolegend_’。或者在调用plt.legend()时通过handles和labels参数手动指定要显示的内容。5.2 提升绘图效率与美观度的独家技巧批量设置样式使用rcParams如果你厌倦了在每个绘图函数里重复设置字体、线宽、网格样式可以在绘图前一次性全局设置。这不仅能保持图表风格统一还能简化代码。plt.rcParams.update({ ‘figure.figsize’: (10, 6), # 图像大小 ‘font.size’: 11, # 全局字体大小 ‘axes.grid’: True, # 默认显示网格 ‘grid.linestyle’: ‘–‘, # 网格线型 ‘grid.alpha’: 0.6, # 网格透明度 ‘lines.linewidth’: 2, # 线宽 ‘lines.markersize’: 8, # 标记大小 })之后绘制的所有图表都会继承这些样式。你仍然可以在单个函数调用中用关键字参数覆盖全局设置。处理大量数据点plotvsscatterplot在绘制纯折线无标记或标记点较少时速度极快。对于超过10万个点的折线图它仍然是首选。scatter当需要为每个点设置不同颜色或大小时使用scatter。但对于大量数据点且样式单一的情况其性能开销较大。一个优化技巧是如果只是画一堆相同样式的点用plot并设置linestyle‘none’和合适的marker速度会快很多。终极方案对于百万级以上的散点图考虑使用plt.hist2d二维直方图或plt.hexbin六边形分箱图进行密度可视化或者使用像Datashader这样的高性能渲染库。让箭头和文本“粘”在数据上使用annotateplt.arrow()和plt.text()的组合有时略显笨拙。Matplotlib提供了一个更强大的函数plt.annotate()它集成了箭头和文本并且提供了更灵活的坐标系统。# 用annotate实现同样的“关键点标注”功能 plt.annotate(‘关键功能上线\n满意度显著提升’, xy(iteration[5], satisfaction[5]), # 箭头指向的点 xytext(iteration[5]-1.5, satisfaction[5]-0.5), # 文本起始点 arrowpropsdict(arrowstyle‘-’, color‘darkorange’, lw2, connectionstyle“arc3,rad-0.2”), fontsize10, ha‘right’, va‘top’, bboxdict(boxstyle‘round,pad0.5’, facecolor‘wheat’, alpha0.8))annotate的arrowprops参数可以定义非常复杂的箭头样式connectionstyle甚至可以画出带弧度的连接线非常适合在拥挤的图表中标注。保存高清图表savefig的参数用plt.show()预览后务必用plt.savefig()保存。关键参数dpi分辨率用于出版或打印建议300以上屏幕展示96-150即可。bbox_inches‘tight’和tight_layout类似自动裁剪白边务必加上。facecolor,edgecolor设置画布的背景色和边框色。format指定格式如‘png’,‘jpg’,‘pdf’,‘svg’。矢量图‘pdf’和‘svg’无限放大不模糊。plt.savefig(‘my_chart.png’, dpi300, bbox_inches‘tight’, facecolor‘white’)管理绘图顺序zorder当图表元素很多时谁在上层谁在下层很重要。每个绘图函数都有一个zorder参数数值越大图层越靠上。默认情况下plot的zorder约为2scatter约为2grid约为1.5text和arrow约为3。你可以通过手动设置zorder来调整例如确保注释文字永远在最顶层zorder10。掌握这五个函数你已经能够应对绝大多数基础的二维图表绘制需求。它们就像五根手指单独使用各有其能握成拳头则能创造出信息丰富、表达清晰的视觉作品。真正的熟练来自于不断的实践和调试下次当你需要绘图时不妨先停下来想一想我要展示什么是趋势、分布、比较还是关联然后从这五个函数中挑选合适的工具开始你的创作。