2.4 特殊图形绘制


文档摘要

2.4 特殊图形绘制 本节摘要:折线、散点、柱状这些常规图形,遇到"看分布、看占比、看地形、看空间关系"的数据就力不从心了。本节讲四类特殊图形:箱线图与提琴图看分布,饼图看占比,等高线图看三维曲面的二维投影,三维散点与曲面图看空间关系。重点不是背函数,而是建立"什么数据该配什么图"的判断,再顺手认识矢量场、极坐标、阶梯图这些边缘成员。 本节导航 阅读完本节,你应当能够: 说出箱线图的五个关键统计量,并判断它适合看什么 说明提琴图和箱线图的区别,以及何时选提琴图 用饼图表达占比,并知道饼图在什么情况下会失效 解释等高线图为什么是"三维曲面的二维投影",并读懂它的含义 用三维散点和曲面图展示空间数据,并知道 3D 图的常见局限 一、先有判断,再有图形

2.4 特殊图形绘制

本节摘要:折线、散点、柱状这些常规图形,遇到"看分布、看占比、看地形、看空间关系"的数据就力不从心了。本节讲四类特殊图形:箱线图与提琴图看分布,饼图看占比,等高线图看三维曲面的二维投影,三维散点与曲面图看空间关系。重点不是背函数,而是建立"什么数据该配什么图"的判断,再顺手认识矢量场、极坐标、阶梯图这些边缘成员。

本节导航

阅读完本节,你应当能够:

  1. 说出箱线图的五个关键统计量,并判断它适合看什么
  2. 说明提琴图和箱线图的区别,以及何时选提琴图
  3. 用饼图表达占比,并知道饼图在什么情况下会失效
  4. 解释等高线图为什么是"三维曲面的二维投影",并读懂它的含义
  5. 用三维散点和曲面图展示空间数据,并知道 3D 图的常见局限

一、先有判断,再有图形

在动手画任何一张特殊图形之前,我们先停一下,问一个更根本的问题:这张图要回答什么问题? 因为特殊图形之所以"特殊",不是它们更酷,而是它们各自擅长回答某一类常规图形回答不了的问题。

想看"一组数据的分布是集中还是分散、有没有异常值",柱状图能看个大概,但不够精确,箱线图才专业。想看"几个部分各占整体的多少",折线图完全不行,饼图才直观。想看"一个二维函数在地图上哪里高哪里低",散点图表达不了,等高线图才是标准答案。想看"三个变量在空间里怎么分布",平面图无能为力,得上三维图。

所以这一节的顺序是反着来的:先列问题,再给你对应的图形。你带着"我的数据是什么问题"来读,比记住一堆 plt.xxx 函数名有用得多。

二、看分布:箱线图与提琴图

箱线图(Box Plot)是统计学家最爱的分布图之一。它用一根"箱子加须线"的极简图形,把一组数据的位置和离散程度压缩进五个数:最小值、下四分位数、中位数、上四分位数、最大值,再加一些游离在外的异常点。

读箱线图要抓住三个点:箱子的位置告诉你数据的"主体"落在哪个区间,箱子的长短告诉你中间一半数据的分散程度,须线和离群点告诉你数据的两端伸到哪里、有没有极端值。比如你对比三组实验数据,三个箱子并排一放,哪组整体偏高、哪组波动大、哪组有异常值,一眼便知。这比三张柱状图信息量大得多。

import matplotlib.pyplot as plt import numpy as np data = [np.random.normal(0, std, 100) for std in range(1, 4)] plt.boxplot(data, labels=['组一', '组二', '组三']) plt.title('三组数据的分布对比') plt.show()

提琴图(Violin Plot)可以理解成"箱线图加密度曲线"。它在箱线图的两侧,用镜像的核密度估计曲线画出数据的分布形状——哪里鼓、哪里瘦,一目了然。箱线图把分布压缩成五个数,会丢失分布的形状信息(比如数据是单峰还是双峰);提琴图把这个信息补了回来。代价是提琴图更"占地方",也稍微难读一点。所以我的建议是:组数少、要看分布形状时用提琴图;组数多、只要看位置和离散时用箱线图

三、看占比:饼图

饼图(Pie Chart)表达"部分占整体"的比例,是最古老也最常被误用的图形之一。它把圆切成若干个扇形,每个扇形的角度正比于该部分所占的比例。

饼图的适用场景很窄,就一句话:几个部分加起来是一个整体,且你想强调占比。比如市场份额、预算构成、人群比例。如果部分之间不是互斥的、或者加起来不等于一个整体,饼图就不成立。

饼图有个著名的弱点:当扇区很多、或者几个扇区大小接近时,人眼几乎无法准确比较角度。所以超过五六个扇区,或者想要精确比较大小,就该换成条形图——条形图的长度比较比扇区的角度比较可靠得多。这是"图型选错"的典型反面教材,值得单独记住。

sizes = [35, 30, 20, 15] labels = ['产品A', '产品B', '产品C', '产品D'] plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90) plt.axis('equal') # 保证画出来是正圆而不是椭圆 plt.title('市场份额构成') plt.show()

autopct 用来在扇区里标百分比,startangle 控制起始角度,plt.axis('equal') 这行很多人会漏,漏了饼图就会被压成椭圆,比例失真。需要突出某一块时,用 explode 参数把它"推出来"一点。

四、看地形:等高线图

等高线图(Contour Plot)是地理和气象里的老朋友——地形图上的等高线、天气图上的等压线,都是它。在 Matplotlib 里,它用来可视化一个二元函数在平面上的"高度"分布。

它的原理不复杂:给定一个函数,它在平面上每个点都有一个高度值;我们把高度相同的点连成一条线,就得到一条"等高线";画很多条不同高度的线,就拼出了地形的全貌。所以等高线图本质是三维曲面的二维投影——它把"哪里高哪里低"压进了一张平面图里,靠线的疏密和标注的数值来还原地形。

import numpy as np import matplotlib.pyplot as plt x = np.linspace(-3, 3, 100) y = np.linspace(-3, 3, 100) X, Y = np.meshgrid(x, y) Z = np.exp(-(X**2 + Y**2) / 2) # 一个中间高的高斯"山包" plt.contour(X, Y, Z, levels=20, cmap='RdBu') plt.colorbar() plt.title('等高线图') plt.show()

这里 np.meshgrid 是关键,它把一维的 xy 坐标轴扩成二维网格,好让 Z 在每个网格点上算出一个高度值。levels 控制画多少条线,plt.contour 画线,plt.contourf 画填充的色块版本。读等高线图时,看两件事:线密集的地方说明高度变化陡,线稀疏的地方说明变化缓。

五、看空间关系:三维图

当数据本身就有三个坐标维度时,平面图就装不下了,得用三维图。Matplotlib 的三维能力藏在 mpl_toolkits.mplot3d 这个工具包里,通过把子图的 projection 设为 '3d' 来激活。

from mpl_toolkits.mplot3d import Axes3D # 导入即激活三维投影 import numpy as np import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(projection='3d') z = np.linspace(0, 10, 100) ax.scatter(np.sin(z), np.cos(z), z) # 螺旋上升的三维散点 ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') plt.show()

三维散点图看数据点在空间里的分布,三维曲面图(plot_surface)看二元函数的高低起伏,线框图(plot_wireframe)则像给曲面搭了个"脚手架",只画网格线不填颜色,适合看结构。

但我要泼一盆冷水:三维图在屏幕上其实是二维投影,深度信息会失真。一个三维散点图旋转到某些角度,前后点会重叠、遮挡,读者可能误判距离。所以三维图更适合"大致感受空间形态",精确读数还得靠投影回二维(比如等高线图)。而且三维图渲染慢、交互旋转依赖后端,在静态报告里尤其要谨慎。

图 2.4 特殊图形谱系

图 2.4 特殊图形谱系

六、选图判断与避坑

把这四类图形放一起看,其实是一个简单的决策树:数据是一组数,想看分布,用箱线图或提琴图;数据是几个部分,想看占比,用饼图(但别超过六块);数据是二元函数,想看高低起伏,用等高线图;数据是三个坐标,想看空间关系,用三维图。

还要记住两个跨图形的通用原则。第一,图型服从问题,而不是服从数据格式。你有一堆数,可以画柱状图也可以画箱线图,关键看你想传达"总量"还是"分布"。第二,复杂图形要配解释。等高线和 3D 图对没受过训练的读者并不直观,旁边加一句文字说明"越红越高"之类,能省掉大量误解。

除了这四类,特殊图形家族还有几位成员值得认识:矢量场图用箭头表示每个位置的方向和大小,适合流场、磁场;极坐标图用角度和半径定位,适合周期性和方向性数据,雷达图就是它的变体;阶梯图和棉棒图表达离散序列,分别像"楼梯"和"火柴棍"。它们不常用,但知道了能在关键时刻少走弯路——遇到周期性数据硬套直角坐标,往往画得又怪又难读。

要回答的问题 选这个图 关键提示
数据集中还是分散 箱线图 抓箱子位置、长短、须线
分布形状(单峰双峰) 提琴图 比箱线图多出密度信息
各部分占整体多少 饼图 扇区少、比例悬殊才有效
曲面哪里高哪里低 等高线图 看线的疏密和数值标注
三个变量空间关系 三维图 投影会失真,注意遮挡

⚠️ 常见坑:饼图扇区一多就失效——人眼分不清角度差异,尤其几个扇区大小接近时。超过六块,或者需要精确比大小,老老实实换条形图。另一个坑是漏写 plt.axis('equal'),饼图被压成椭圆,比例全部失真。
💡 关键直觉:特殊图形不是"高级图形",而是"专用工具"。锤子再高级也拧不了螺丝,箱线图再漂亮也表达不了占比。先问问题,再选工具,函数名是最后才操心的事。

七、常被问到的几个细节

箱线图上的离群点是怎么算出来的

箱线图把落在"须线"范围之外的点标成离群点。须线的默认范围通常是四分位距的 1.5 倍:下边界是下四分位数减 1.5 倍四分位距,上边界是上四分位数加 1.5 倍四分位距,超出这个范围的点就是离群点。所以箱线图的离群点是"统计约定"出来的,不是"肉眼看着怪"的点,这个约定让不同图之间有了可比性。

饼图和环形图有什么区别,怎么选

环形图就是中间挖掉一块的饼图,本质仍是"看占比"。它比实心饼图多了一个优势:中间那块空白可以放总数值或标题,视觉上也更现代。选择上没太大差别,看你想不想利用中间那圈空间。但它们共享同一个弱点——扇区多了就失效。

等高线的 levels 怎么选

levels 决定画多少条线、在哪些高度上画。设一个整数(比如 20)表示等间距地画 20 条;也可以直接给一个列表(比如 [0, 1, 2, 3])精确指定画哪几条。想让图清晰,线别太密也别太疏;想强调某个高度,就单独把它列出来,再配合 clabel 标注数值。

三维图怎么转到一个合适的角度

三维图的初始视角不一定理想,可以用 ax.view_init(elev, azim) 手动设置仰角和方位角,把曲面转到最不容易被遮挡的角度。但无论怎么转,三维在屏幕上的投影都会损失一部分深度信息,所以精确读数仍建议回到二维(比如等高线图),三维图更适合"看个整体形态"。

要点速记

  • 先有判断,再有图形:特殊图形各回答一类常规图形答不了的问题。
  • 箱线图看分布:五个统计量压缩出位置、离散和异常值。
  • 提琴图补形状:在箱线图基础上加密度曲线,组少时用它看单峰双峰。
  • 饼图看占比:扇区少才有效,别超过六块,记得 axis('equal')
  • 等高线看地形:三维曲面的二维投影,线密变化陡、线疏变化缓。
  • 三维图看空间:用 projection='3d' 激活,但要警惕投影失真和遮挡。
  • 图型服从问题:决定用哪张图的,是"要回答什么",不是"数据长什么样"。

特殊图形把"静态表达"的边界又往外推了一圈。但有些故事,静态图再全也讲不出"变化的过程"——这时候就要让图动起来,第 2.5 节"动画与交互"上场。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U