1.4 常用参数设置 本节摘要:绘图函数画出来的图只是"毛坯",真正让它好读、美观的,是一组控制外观的参数——color 定颜色、linestyle 定线型、marker 定标记、xticks 和 yticks 定刻度、legend 定图例。这些参数本质上都是在给 1.2 节讲过的 Artist 对象设置属性。本节按"颜色、线型标记、刻度、图例"四组拆开,讲清每个参数怎么传值、什么时候该调,最后用一张速查表收口,让你把"让图更好看"这件事从碰运气变成有章法。
本节摘要:绘图函数画出来的图只是"毛坯",真正让它好读、美观的,是一组控制外观的参数——color 定颜色、linestyle 定线型、marker 定标记、xticks 和 yticks 定刻度、legend 定图例。这些参数本质上都是在给 1.2 节讲过的 Artist 对象设置属性。本节按"颜色、线型标记、刻度、图例"四组拆开,讲清每个参数怎么传值、什么时候该调,最后用一张速查表收口,让你把"让图更好看"这件事从碰运气变成有章法。
阅读完本节,你应当能够:
讲参数之前,先回到 1.2 节那个关键心智:Matplotlib 里你看见的一切,底层都是一个 Artist 对象。 一条线是一个 Artist,一个刻度标签是一个 Artist,一个图例也是一个 Artist。所谓"设置参数",本质就是找到那个 Artist,改它的某个属性。
color 改的是线条或标记这个 Artist 的颜色属性,linestyle 改的是线条的样式属性,xticks 改的是横轴刻度 Artist 的位置和文字。把这个"按图索骥"的视角立起来,你就不会觉得参数多到记不住——它们只是同一套逻辑在不同元素上的体现。
下面这张图把本节要讲的参数按"作用对象"分了组:
💡 关键直觉:记参数别靠背清单,靠"它改的是哪个元素"。想调线的颜色,就找线相关的 color;想调轴的刻度,就找轴相关的 xticks。分类记住了,名字自然记得住。
颜色是让图"会说话"的第一件武器,也是最容易被滥用的。颜色选得好,几组数据一眼分清;颜色乱配,图再准也读不下去。
Matplotlib 里给颜色有几种写法,效果一样,看哪个顺手:
color="red"、color="royalblue",直白,适合快速写。color="#FF5733",精确,适合从设计稿里取色。color=(0.1, 0.4, 0.8),每个分量取值 0 到 1,适合程序算出来的颜色。import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.plot([1, 2, 3], [1, 2, 3], color="red") # 名称 ax.plot([1, 2, 3], [2, 3, 4], color="#2b6cb0") # 十六进制 ax.plot([1, 2, 3], [3, 4, 5], color=(0.2, 0.7, 0.3)) # RGB 元组
我的建议是:普通图用颜色名称就够,正式报告里需要统一品牌色时再用十六进制。 没必要为了显得专业把所有颜色都写成十六进制——那反而降低可读性。
颜色之外,还有一个 alpha 参数值得一提。它控制透明度,取值 0 到 1。当好几条线叠在一起、或者散点密密麻麻时,把 alpha 调到 0.5 左右,重叠的部分就透出层次,不至于糊成一片。
⚠️ 常见坑:别在一张图里塞太多高饱和颜色。红黄蓝绿紫挤在一起,读者根本分不清谁是谁,还会觉得刺眼。区分数据系列,颜色是辅助,线型和标记同样重要,三样配合着用才稳。
单靠颜色区分多条线,遇到黑白打印或色弱读者就会失效。所以 Matplotlib 给了另外两件武器:线型(linestyle)和标记(marker)。
线型决定线条是实线、虚线还是点线,常用取值:
| 取值 | 含义 | 适用 |
|---|---|---|
- 或 solid |
实线 | 默认,主线 |
-- 或 dashed |
虚线 | 区分第二条线 |
-. 或 dashdot |
点划线 | 第三条线 |
: 或 dotted |
点线 | 参考线、辅助线 |
标记决定数据点上画什么符号,常用有 o(圆)、s(方)、^(三角)、*(星)、x(叉)。数据点稀疏时加标记,能让读者看清每个点落在哪。
import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.plot([1, 2, 3, 4], [2, 4, 3, 5], linestyle="-", marker="o", label="实线圆点") ax.plot([1, 2, 3, 4], [3, 1, 4, 2], linestyle="--", marker="s", label="虚线方块") ax.legend()
这里有个很实用的细节:线型、标记、颜色可以压缩成一个字符串一起传。"o--" 表示"圆点标记加虚线","s-" 表示"方块标记加实线",颜色也能塞进去,比如 "ro-" 是"红色圆点实线"。顺序是"标记—线型—颜色"或"颜色—标记—线型",Matplotlib 都能识别。这个快捷写法适合快速探索时用,正式代码里我更倾向把 color、linestyle、marker 分开写——分开写一眼能看清每个值是什么。
💡 关键直觉:颜色、线型、标记是"区分多线"的三件套,别只靠颜色。三种维度叠加,哪怕打印成黑白、或者有读者色弱,数据系列也照样分得清。
默认情况下,Matplotlib 会自动帮你选刻度位置和刻度文字。但自动不代表合适——你的数据是月份,它给你标 0、1、2、3;你的数据是"低中高",它给你标 -1、0、1。这时候就得自己动手设刻度。
刻度的设置分两层:位置和标签。位置决定刻度画在哪,标签决定刻度上写什么。用 xticks(或 yticks)可以一次把两者都设了。
import matplotlib.pyplot as plt months = ["1月", "2月", "3月", "4月", "5月", "6月"] sales = [120, 180, 150, 210, 190, 240] fig, ax = plt.subplots() ax.plot(sales) ax.set_xticks(range(6)) # 刻度位置:0 到 5 ax.set_xticklabels(months) # 刻度标签:换成月份 ax.set_xlabel("月份") ax.set_ylabel("销售额")
这段代码里,set_xticks(range(6)) 把刻度定在 0、1、2、3、4、5 六个位置,set_xticklabels(months) 再把这些位置上的文字换成"1月"到"6月"。两句话配合,横轴就从一串抽象数字变成了能读懂的月份。
刻度之外,还有个范围参数 xlim 和 ylim,控制轴显示的最小值和最大值。默认 Matplotlib 会自动把范围收得刚好包住数据,但有时你希望留点余量,或者特意放大某个区间,就手动设:
ax.set_ylim(0, 300) # 纵轴从 0 到 300,别从 120 开始,否则差异被夸大
⚠️ 常见坑:柱状图和折线图的纵轴要不要从 0 开始,是个需要想清楚的问题。从 0 开始能如实反映柱子的高度差异,是柱状图的标准做法;折线图有时为了看清微小波动会截掉底部,但会放大视觉差异,容易误导。取舍的关键是"你想强调差异还是如实呈现"。
图例(legend)是解释每条线、每个颜色代表什么的标注。没有图例,一张画了三条线的图就是三条无名线;有了图例,读者才知道哪条是"实际值"、哪条是"预测值"。
图例的生成分两步:先起名,再显示。 画线时用 label 参数给这条线起名,最后调一次 legend 把所有名字汇总显示出来。
import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.plot([1, 2, 3, 4], [2, 4, 3, 5], label="实际值") ax.plot([1, 2, 3, 4], [3, 1, 4, 2], label="预测值") ax.legend() # 把 label 汇总成图例
legend 还有个 loc 参数控制图例位置,常用的有 "upper right"(右上,默认)、"upper left"(左上)、"lower right"(右下)等。默认位置偶尔会压在数据上,这时候手动指定 loc 挪开就好。
还有一个很容易漏的点:图例本身也是 Artist,它的字号、边框、透明度也都能调。ax.legend(fontsize=9) 就能缩小图例文字。这些小调整累积起来,就是"专业感"的来源。
把本节讲的参数压成一张速查表,方便用时对照:
| 想调整什么 | 参数 | 典型取值 | 什么时候调 |
|---|---|---|---|
| 线的颜色 | color / c | 名称、十六进制、RGB | 区分数据系列 |
| 透明度 | alpha | 0 到 1 | 线多重叠、散点密集 |
| 线的样式 | linestyle / ls | 实线、虚线、点线 | 黑白打印、色弱友好 |
| 点的标记 | marker | o、s、^、*、x | 数据点稀疏 |
| 轴的范围 | xlim / ylim | 两个数 | 留余量、放大区间 |
| 刻度位置 | xticks / yticks | 位置列表 | 自定义刻度 |
| 刻度文字 | 标签列表 | 字符串列表 | 数字换成语义 |
| 图例 | label + legend | 字符串 + loc | 多条线时必加 |
这张表不是让你背的,是让你在"想调某处却不知道参数名"时有个索引。真正记住它们的办法,还是那句老话——动手画,改一个参数看一次变化,比读十遍表管用。
💡 关键直觉:参数是"锦上添花"还是"必须加",看一件事——没有它,读者会不会误解图? 会误解,就是必调(比如多线图没有图例);不会误解,只是好看,就量力而行。别为了"装饰"把图堆成一锅粥。
前面重点讲了颜色、线型、标记、刻度、图例,但还有一组"文字类"参数同样基础——标题、轴标签、网格。它们不花哨,却决定了一张图能不能被"独立读懂":没有标题和轴标签的图,离开上下文就是一堆形状,别人根本不知道它画的是什么。
ax.set_title 给整张图一个名字,说明"这张图在说什么"。ax.set_xlabel、ax.set_ylabel 说明横纵轴各代表什么量、单位是什么。ax.grid 打开背景网格线,帮读者把数据点对到坐标值上。import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.plot([1, 2, 3, 4], [2, 4, 3, 5]) ax.set_title("月度销售趋势") ax.set_xlabel("月份") ax.set_ylabel("销售额(万元)") ax.grid(True, linestyle=":", alpha=0.5)
这三样里,网格最容易被忽略,但它对"精确读数"的帮助很大:一条数据线从 3 月的哪个高度经过,有网格线做参照,一眼就能估出数值;没网格,只能靠猜。折线图、散点图加淡色网格,几乎是性价比最高的可读性提升。
还有 fontsize 这个通用参数,几乎所有文字类元素都能设它,控制字号——标题、标签、图例的字号都可以单独调。字号统一且大小合适,是"专业感"里很不起眼但很加分的一环。
参数多了,最大的风险不是记不住,而是忍不住全用上。颜色涂满、标记塞满、网格加粗、图例加框,最后图变成一锅粥。真正成熟的图,往往是克制的。
判断一个参数该不该加,回到前面那句标准:没有它,读者会不会误解或读不懂? 会,就加;不会,只是"看起来更花哨",就三思。这不是说要把图画得素,而是说每个修饰都要有理由——颜色用来区分系列,网格用来辅助读数,图例用来解释系列,标记用来标出关键点。如果某样东西说不出"为什么要它",那它多半可以删掉。
一个实用的检查方法是:把图缩小到缩略图大小,还能不能一眼看出重点? 能,说明层次清楚;不能,说明信息过载,需要做减法。这个"缩略图测试"比任何美学理论都管用。
⚠️ 别本末倒置:参数是给"已经正确的图"锦上添花的,它救不了一张选错了图形、或数据本身混乱的图。先把图形选对、把数据想清楚,再来谈颜色和线型,顺序不能反。
大多数情况下没有本质区别,只是入口不同。ax.plot(x, y, color="red") 是画的同时一并指定颜色;ax.set_title 这类方法是画完之后再改某个元素的属性。前者适合"画的同时定死外观",后者适合"画完再逐项调整"。用哪个看习惯,效果一样。
最常见的原因是参数名写错,或写错了位置。比如把 color 写成了 colour(Matplotlib 用的是美式拼写 color),或者把它当成了某个 set 方法去调。颜色是写在绘图函数里的关键字参数。遇到"设了没反应",先检查参数名拼写和它该出现的位置。
"ro-"),快速探索时方便,正式代码建议分开写。set_xticks 定位置,set_xticklabels 定文字。下一节我们把画好的图"交付"出去——怎么用 savefig 把图存成文件,格式怎么选、DPI 怎么定、透明背景和裁剪空白这些细节各有什么门道。