3.4 数据可视化原则与最佳实践 本节摘要:会调函数不等于会做图。一张图能不能把结论讲清楚,取决于四件事做没做到位:选对图、配好色、写清标注、别让坐标轴误导。本节把数据可视化收敛成几条可执行的原则——准确、清晰、高效、克制,然后落到三个具体动作上:怎么按数据类型选图、怎么用少量颜色讲清关系、怎么写标题和轴标签;最后给出避开"图撒谎"的检查清单。读完你能对任何一张图做一次像样的质检。 先说结论 阅读完本节,你应当能够: 说清准确、清晰、高效、克制四条原则各自管什么。 依据数据类型和分析目的,选对图表类型。 用三到五种颜色把关系讲清,避开彩虹色和色盲陷阱。 写出能独立说明问题的标题、轴标签和图例。 识别并避开坐标轴不从零开始、比例失真等常见误导。 用一份清单,对画好的图做一轮自查。
本节摘要:会调函数不等于会做图。一张图能不能把结论讲清楚,取决于四件事做没做到位:选对图、配好色、写清标注、别让坐标轴误导。本节把数据可视化收敛成几条可执行的原则——准确、清晰、高效、克制,然后落到三个具体动作上:怎么按数据类型选图、怎么用少量颜色讲清关系、怎么写标题和轴标签;最后给出避开"图撒谎"的检查清单。读完你能对任何一张图做一次像样的质检。
阅读完本节,你应当能够:
数据可视化本质上是一门"翻译"的手艺:把数据翻译成视觉,让读者用最短的时间看懂你想说什么。翻译得不好,再准确的数据也会被读错。这门手艺有四条底线。
准确是第一位的。图必须忠实于数据,数、比例、单位、标签一个都不能错。一张图哪怕再好看,只要比例画错了,就是废图,甚至比没图更糟——它会让人带着错误的印象去做决定。
清晰排在第二。图要一眼能看懂,别让读者在装饰里找信息。多余的元素、过密的网格、花哨的背景,都会抢走本该属于数据的注意力。
高效是第三。图应该用最少的视觉元素传递最多的信息。一张堆了十种颜色、五个子图、满屏注释的图,信息密度高,但没人愿意读。删掉一个元素若不影响理解,就该删。
克制是第四,也是最难的一条。新手总想把所有会的都往上堆——3D 柱状、阴影、纹理、渐变。但装饰不增加信息,只增加噪声。真正成熟的图,往往是"素"的。
这四条不是并列的开关,而是有优先级的:准确和清晰是硬要求,高效和克制是更高一层的要求。先守住前两条,再追求后两条。很多失败的可视化,问题就出在把顺序搞反了——先追求好看,结果数画错了。
选图的第一步,不是翻图表库,而是问一句:我的数据是什么类型,我想比较什么。数据类型和意图,决定了图的形状。
趋势用折线图。时间序列、随连续变量变化的量,折线是最自然的语言,人眼对线的走向特别敏感。比较用柱状图。类别之间的数量差异,柱子长短最直观。关系用散点图。两个变量之间有没有相关性、是什么形状,散点一撒就清楚。分布用直方图、箱线图,这些上一节刚讲过。占比理论上用饼图,但实践中饼图常被滥用——类别一多,扇区就分不清,换柱状图往往更清楚。
一张表把最常见的几种图对清楚:
| 图表类型 | 适合的数据 | 要避开的坑 |
|---|---|---|
| 折线图 | 时间序列、连续趋势 | 断点处强行连线 |
| 柱状图 | 类别比较 | 纵轴不从零开始 |
| 散点图 | 两变量关系 | 忽略重叠与离群点 |
| 直方图 | 单变量分布 | bins 随意取值 |
| 饼图 | 少数几类占比 | 类别过多 |
| 箱线图 | 分布与异常值 | 忽略样本量差异 |
选图还有个反直觉的点:同样的数据,画成不同图,讲的故事可能完全不同。所以选图前先问"我要强调什么",是强调趋势就选折线,强调对比就选柱状。意图定了,图才不会跑偏。
颜色是可视化里最容易被滥用的元素。它的正确用法只有三种:区分不同系列、突出某个重点、编码数值大小。除此之外的颜色,大多是装饰。
区分系列时,三到五种颜色通常就够。颜色太多,读者反而记不住谁是谁。选色要保证相邻颜色之间有足够对比,别把两个相近的蓝放在一起让人猜。突出重点时,让全图保持低饱和,只把要强调的那个元素用高饱和或深色标出来,对比一拉开,重点自己就跳出来了。编码数值时,用单色渐变或双向渐变,比如从浅到深的蓝,或者"冷蓝、白、暖红"的 coolwarm,深浅对应大小。
彩虹色是重灾区。它颜色丰富,看起来"专业",但人眼对彩虹色里相邻色块的感知是不均匀的,容易在数据里读出根本不存在的断崖。除非有明确理由,默认别用彩虹色。
还有一个常被忽略的硬约束:色盲。大约每十二个男性里就有一个对红绿色不敏感,红绿搭配对他们来说就是一团灰。稳妥的做法是选色盲友好的色板,并且别把信息只压在颜色上——颜色之外,用形状、线型、标注再兜一层底。
import matplotlib.pyplot as plt groups = ['甲', '乙', '丙', '丁'] values = [23, 45, 30, 38] colors = ['#4e79a7', '#f28e2b', '#59a14f', '#e15759'] # 少量高对比色 plt.bar(groups, values, color=colors) plt.show()
💡 配色有个简单的自检:把图转成灰度再看一遍。如果灰度下依然能分清各个系列、重点依然突出,说明你不是在靠颜色"硬撑",这张图对色盲读者也友好。
一张图没有标题和轴标签,就像一个没有题目的答案——数据都在,但没人知道它在回答什么。标注的三件套是:标题、轴标签、图例。
标题要写结论,不要写"某数据折线图"这种废话。好标题是一句话总结:与其写"销量与广告投入的关系",不如写"广告投入超过五万后,销量增长明显放缓"。前者是描述,后者是结论,读者一眼就知道该往哪看。
轴标签要写清变量和单位。横轴是时间就写"月份",纵轴是金额就写"销售额(万元)"。单位尤其不能省,因为同一个数字,"万元"和"元"差着一万倍,漏了单位,图就失去了精确含义。
图例只在多系列时才需要。单系列的图,图例是多余的,删掉更干净。多系列的图,图例位置别挡数据,放右上角或图外都行,但要让读者能快速对上"哪条线是谁"。
plt.plot(months, sales_2023, marker='o', label='2023 年') plt.plot(months, sales_2024, marker='s', label='2024 年') plt.title('2024 年销量逐月反超去年', fontsize=15) plt.xlabel('月份') plt.ylabel('销量(万台)') plt.legend() plt.show()
标题给结论、轴标签给单位、图例给身份,三样齐了,图才能独立成文——哪怕摘出来贴进报告,别人不看上下文也读得懂。
图能骗人,而且常常是在你不经意间骗的。最常见的一招是纵轴不从零开始。柱状图里,如果纵轴从 30 而不是 0 开始,两个本来看起来只差 10% 的柱子,会被放大成差一倍。所以柱状图的纵轴原则上要从零开始;折线图因为关注的是变化幅度而非绝对值,有时可以放宽,但也要在图上说明。
第二个坑是比例失真。散点图或地图里,如果横纵轴的尺度比例不对,圆会变成椭圆,距离会被拉伸。散点图里可以设置等比例的坐标轴,让形状不被扭曲。
第三个坑是"选择性呈现"。只画有利的时间段、只截取某一段数据、把离群点删掉不说明——这些都在讲一个片面的故事。诚实的做法是:要么展示完整数据,要么明确标注你切了哪一段、为什么切。
# 柱状图纵轴从零开始,避免夸大差异 plt.bar(groups, values) plt.ylim(0, max(values) * 1.15) plt.show()
⚠️ 检查一张图有没有误导,最快的办法是问:如果我是被这张图说服的人,我有没有被"选择性"的信息带偏?纵轴起点、时间范围、离群点的去留,这三处是最容易藏猫腻的地方。
图不是给自己看的,是给别人看的。不同的人看同一张图,背景、设备、甚至视力都不同,好图要尽量照顾到更多人。
一是受众背景。给高管看的图和给同行技术看的图不一样:高管要结论先行、图越简越好;技术同行可以接受更密的信息。动笔前想清楚"这张图给谁看、他关心什么",比堆多少技巧都重要。
二是可访问性。色盲友好前面说过;另外,图在导出或嵌入网页时,配上文字描述,让屏幕阅读器也能把图"读"给视障用户。别把信息只放在颜色或图上,重要的结论最好在图外也用一句话写出来。
三是设备。图在手机上看和在大屏上看是两回事。小屏下字号要更大、图例要更简。真正要发布到移动端的图,值得单独做一版,而不是把报告里的图原样缩放。
照顾受众这件事,本质是把"我以为说清楚了"换成"他真的看懂了吗"。多问这一句,很多图会被返工,但返工之后,图才真正完成了它的使命。
把这一节的原则收拢成一张清单,画完图照着过一遍,能拦住大部分问题:
这七条里,前六条是检查点,最后一条是心法。清单不是走形式,而是逼自己慢下来,把"画完了"和"画对了"分开。

到这里,第 3 章把 Matplotlib 放进了完整的数据分析流程。下一章我们钻进 Matplotlib 的底层,看看 Artist 对象、坐标变换这些机制是怎么支撑起前面所有图形的。