散点图衍生图形全解析:从六边形分箱到降维散点

发布时间:2026/10/22 12:07:42
散点图衍生图形全解析:从六边形分箱到降维散点 做数据分析这些年散点图到底还能玩出什么花样这个问题被问过很多次。问的人多半是已经画崩过一张散点图明明有几万个样本结果画出来黑乎乎一团什么结构都看不出来。我早年在一次用户行为分析里就栽过这个跟头五十万条记录丢进坐标轴屏幕上只剩一大块墨迹连横向和纵向的趋势都辨不清。后来我把散点图的可视化方案整体梳理了一遍才发现围绕散点图长出了一大族衍生图形六边形分箱、密度等高线、气泡图、散点矩阵、边际分布图、降维散点、连接散点……每解决一类新问题就多一个新变体。这篇文章就把我习惯用的这些衍生图形逐个拆开讲清楚它们的原理、适用场景、参数细节和踩坑经历给正在和数据图表搏斗的你一份可以照着用的选型参考。1. 散点图的原生短板过绘制与两维限制1.1 过绘制点一多散点图自己先糊了散点图的运作机制很简单两个连续变量分别映射到横轴和纵轴每个样本对应图上一个点。数据量小的时候这种画法诚实又直观两百个点能清楚表现聚类、离群和趋势。但数据量一旦上去问题马上出现——屏幕上的可用像素是有限的。一张常见的 800x600 输出里满打满算也就不到五十万个像素位几十万个点压上去大量样本会落在同一个或者相邻的像素位置。这种堆叠在可视化领域有个专门的名字叫过绘制overplotting。过绘制最麻烦的地方在于人眼对亮度差异的敏感度远低于直觉。五百个点叠成的灰色和五千个点叠成的深灰很多人一眼看过去根本分不出差别更别说从中读出密度的数量级变化了。于是散点图从关系图退化成了存在性图——你只知道这里有数据但不知道数据是怎么分布的。当年我做用户活跃度分析就是典型场景。x 轴放周活跃天数y 轴放平均会话时长样本量五十万行默认黑色小圆点出图之后整块区域就是一个浓黑的疙瘩。我试着把点改成半透明稍微好一点但透明度过低时点几乎看不见调高了又糊成一团。折腾了很久才意识到问题不在颜色也不在透明度而是绘制策略本身错了——这个量级根本不该逐个描点应该用区域统计的思路。1.2 坐标轴只有两根装不下第三第四个变量过绘制是量的问题维度限制则属于质的问题。散点图的坐标轴天然只能编码两个连续变量。但在真实分析任务里我经常需要同时观察三个甚至更多变量的联动。典型的例子活跃度和消费金额的关系是主问题可我还想知道使用时长是不是在其中起作用或者按用户渠道分个组看看不同渠道的点是否聚成不同团。普通散点图面对这种需求是失语的。有些初学者试着把第三个变量做成点的颜色这可以但颜色编码的定量能力很弱人眼很难从颜色变化里读出精确数值。把第三个变量做成点的大小这就成了气泡图把变量两两配对画成多张散点图这就成了散点矩阵。衍生图形的第一条价值就是把坐标轴之外的信息量补回来。1.3 散点图的衍生方向其实只有三条主线我习惯把散点图的衍生逻辑归纳成三条主线复盘任何一张衍生图形都能归入其中密度方向解决点太多、看不清分布的问题代表是分箱散点图、六边形分箱图、密度等高线维度方向解决变量数不够的问题代表是气泡图、三维散点图、散点矩阵关系方向解决单张图说不清结构的问题代表是边际分布图、连接散点图、降维散点图。记住这三条主线比死记图形名字有用得多。碰到新的可视化形式时先问一句它是在处理样本数量压力还是在扩展变量表达维度能回答这个问题后面所有参数和工具的记忆都会顺畅很多。2. 密度方向从逐个描点到区域统计2.1 分箱散点图的基本原理分箱散点图binned scatter plot的思路特别朴素把 x 轴和 y 轴的范围均匀切成若干段形成一张网格然后统计每个格子里落了多少个点用颜色深浅表示计数多少。本质上它把每个点画在哪变成每个区域有多少点密度信息从隐含在重叠里变成显式编码在颜色里。网格怎么切是第一个关键决策。以 Python 的 matplotlib 为例hexbin 的 gridsize 参数控制坐标轴方向上的分格数量。数据量在三五万左右时我通常取 30 左右几十万到几百万取 40 到 60。网格太稀内部结构被吞掉只能看到一片大色块网格太密每个格子的计数都不高图形开始出现类似噪声的雪花斑反而干扰判断。这个参数没什么公式可套多试两次就会找到适合自己数据量级的值。还有一个容易被忽略的问题是网格的边界效应。落在网格边缘的点可能会导致相邻格子的计数出现明显阶梯差这不是数据本身的特征而是人为切分带来的产物。处理办法是适当增加 gridsize细一点的网格能减轻这种阶梯感。2.2 六边形分箱为什么偏偏是六边形分箱不一定要用正方形格子很多绘图库默认支持六边形分箱hexbin。最初我也觉得这只是个视觉偏好后来理解了几何原因才服气。正方形网格里一个格子有 4 个共享边界的邻居还有 4 个只共享顶点的邻居后一类在聚类判定上很模糊六边形网格则有 6 个共享边的邻居所有相邻关系完全一致点云的聚集轮廓会显得更平滑。视觉上的差别更直白。正方形网格容易产生棋盘格感尤其当相邻格子计数差异较大时图的边缘会呈现锯齿状六边形拼贴则更接近自然界蜂巢的形态过渡自然颗粒感弱。对于需要放大到大屏或印刷的可视化这一点差异相当影响品质感。2.3 hexbin 实操参数解析下面是一段我经常用的 hexbin 代码数据是两百万行模拟的线性相关分布import numpy as np import matplotlib.pyplot as plt rng np.random.default_rng(42) x rng.normal(0, 1, 2000000) y x * 0.7 rng.normal(0, 0.6, 2000000) plt.hexbin(x, y, gridsize50, binslog, cmapviridis, extentNone) plt.colorbar(labelcount (log scale)) plt.tight_layout() plt.show()这里必须提醒一句binslog 强烈建议打开。第一次画这类图的时候我没用 log结果大部分格子集中在低计数的暗色区整张图看过去深紫色一片只有零星几个高密度格子在发光。原因很简单格子的计数跨度可能差三个数量级线性颜色映射会把低计数区域全部压到低亮度结构完全丢失。换成 log 变换后计数被压到同一尺度冷色暖色区分明显聚类位置才真正浮现出来。颜色映射本身也值得留意。我基本不用 rainbow 或 jet 这类彩虹映射默认选 viridis、cividis、plasma 这些感知均匀的颜色方案。它们不仅对色弱读者更友好转成灰度印刷后也仍然保留层级。黑白打印环境下的可读性是很多报告图表的隐藏评分项。2.4 分箱图之外密度等高线的取舍分箱图把平面离散成网格密度等高线则走另一条路用核密度估计KDE在平面上拟合出连续的密度函数再画出密度值相等的等高线。R 的 ggplot2 用 geom_density_2dPython 的 seaborn 用 kdeplot都可以直接实现。这类连续密度图的优势是平滑、没有网格参数要调更适合样本量中等几千到几万且分布平滑的数据。但它也有代价核带宽bandwidth的选择对结果影响很大带宽太小会出现锯齿太大则把多峰结构抹平。我的习惯是先用分箱图确认大致结构再用密度图做演示用成图。探索阶段用离散统计展示阶段用连续渲染两者配合比单用哪一张都可靠。3. 维度方向气泡图与三维散点的取舍3.1 气泡图第三个维度的面积编码气泡图的本质是散点图把第三个连续变量映射成点的大小。最常见的翻车是把数值直接映射到点的半径上。举个例子第三个变量的两个取值是 1 和 10如果半径按 1 比 10 画面积就是 1 比 100小的点在大的点旁边几乎消失视觉比例完全失真。正确的做法是让点的面积与变量值成正比也就是半径取变量值的平方根。很多绘图库的 size 参数内部实现并不统一有的映射面积有的映射直径我每次换工具都会先画一张已知数值的测试图确认它到底走的是哪条路。之前团队做消费分析时一张渠道气泡图因为直接映射半径最大最小渠道的体积差异夸张到小点彻底隐形业务方一度以为某渠道完全没有数据。改成面积映射后各渠道的量级关系才恢复正常。气泡图的承载能力也有上限。点的大小一旦拉开跨度重叠问题会再次显现面积大的气泡会把下面的小气泡完全盖住。缓解办法是给气泡加透明度或者把大点对应的样本子集单独做一张图再放大观察。3.2 图例、交互与制作工具静态气泡图必须认真设计图例。圆点大小是连续编码图例里只画一个孤零零的圆读者完全没法对应数值。正确做法是标注几个代表性点位比如最小值、中位数、最大值每个点旁边标上对应数值。这在 matplotlib 里需要手动定位散点不是默认行为但这一步值得做。做交互探索时我更倾向于用 plotly气泡图悬停能同时显示 x、y、size 三个维度的精确数值非常适合快速筛选异常。matplotlib 则适合出出版级的静态图。还有一个折中是 seaborn 的 scatterplot配合 size 和 hue 参数可以用大小和颜色区分两个附加变量但一张图同时承载四个维度已经是极限再多就变成了视觉负担。3.3 三维散点图多数时候是视觉陷阱三维散点图把第三个变量直接放到 z 轴听起来最自然实际效果却经常最差。屏幕是二维平面三维场景全靠投影呈现深度信息一旦被压缩不拖动旋转根本看不出空间关系。人眼对遮挡、远近的判断在屏幕上远没有在物理空间里可靠两个在真实三维距离上隔很远的点投影后可能挤在一起。我现在的原则很简单正式汇报几乎不用三维散点图。它真正有不可替代价值的场景是降维结果的初步探索——高维数据降到三维用鼠标旋转观察聚类的分离度比二维投影更立体。但也止步于探索。最终对外展示时我通常还是用 PCA 的前两个主成分画二维散点配上颜色标签信息量不差可读性反而更高。4. 组合方向边际分布图和散点矩阵4.1 边际分布图给散点图加上档案边边际分布图marginal distribution plot解决一个很实际的问题散点图只展示两个变量的联合分布却完全隐藏了每个变量各自的长相。于是它把 x 和 y 的边缘位置空出来放上各自的直方图、密度曲线或箱线图中间的散点回答关系边缘的分布回答个体特征。这个图的实用价值在于防止误读。我曾经看过一张 x 与 y 相关系数几乎为零的散点图单看中间散点图结论自然是无关。但边缘分布显示 x 是明显的双峰分布其实是两组不同人群的混合先分别看每组内的关系结论完全不同。边际分布图在探索阶段把这个信号直接摆在眼前省掉很多弯路。seaborn 里一行 jointplot 就能实现kind 参数控制中间图形的类型scatter 适合小数据hex 适合大数据kde 适合连续密度。我常用 kindscatter 再配合边缘直方图或者在数据量较大时直接用 kindhex。R 生态里 ggExtra 包可以直接在 ggplot2 对象上追加边缘分布箱线图和直方图也很方便。4.2 散点矩阵把所有两两关系一次摊开散点矩阵SPLOM的思路是把一个数据集里所有变量的两两关系全部画成散点图排成矩阵对角线位置放每个变量的分布直方图。seaborn 的 pairplot 一行代码就能出图。它的最大价值是探索阶段的全景扫描四个变量就是六张两两散点图相关性、非线性关系、离群点基本都能在这组图里扫描出来。但散点矩阵的上限非常明确。变量一旦超过六到八个格子数量爆炸式增长单张图缩小到没法看而且很多两两组合的信息是重复的。我在实际项目里不会把十几个变量一股脑丢进去而是先算相关系数矩阵筛出与业务目标强相关的四到五个变量再进 pairplot。筛选这一步省掉的不是时间是图上那一大堆没有业务价值的噪声。使用 pairplot 时还有一个细节diag_kind 可以控制对角线上放直方图还是密度曲线cornerTrue 只画下三角矩阵信息一样但图面积小一半。展示场景里我通常用 corner 模式能有效减少版面的视觉压力。4.3 按类别分组的上色经验如果数据里有类别变量pairplot 和 jointplot 都支持 hue 参数不同类别显示不同颜色聚类的分离程度一眼可见。这里我踩过两次坑一次是类别人数悬殊占比小的类别被大批量点完全覆盖几乎看不见另一次是类别数量达到十二个颜色全部混杂在一起互相干扰。处理办法分别是第一类情况可以给点加透明度小类别点在视觉上会透出来第二类情况则果断合并类别。之前分析用户渠道时十二个渠道来源画出来一团浆糊最后我只保留 Top 5其余通通归为其他图瞬间清爽信息损失却很小。做可视化不是把全部数据都塞进一张图而是让最重要的对比显现出来。5. 大数据与高维场景下的散点变体5.1 抽样散点保留形状放弃像素面对超大数据量一个非常务实的策略是先随机抽样再画散点。只要抽样是真正随机的几十万条里抽几千条点云的分布轮廓基本不会失真。我在交易数据上做过对比一百万条和抽样一万条的散点图聚类位置、整体趋势几乎一致差别只在边缘的离群点上。但抽样不是万能的。如果你的分析目标是精确定位极值或识别罕见离群点抽样会把最关键的那几个点丢掉。这时候必须回到聚合路线用六边形分箱或分箱散点图因为聚合统计保留了每个区域的计数哪怕只有个位数也能在颜色上体现出来。我总结的权衡适合对照来记看分布轮廓用抽样看精确密度用聚合两者互补谈不上谁替代谁。5.2 降维散点读懂非原空间里的点PCA、t-SNE、UMAP 这类降维算法做完之后惯例做法就是把降维结果画成散点图。我见过不少初学者拿着这种图当普通散点图解读其实它的横纵轴不是原始变量而是高维距离压缩后的综合投影。读这种图时真正需要关注的是聚团、分离程度和离群样本而不是坐标数值本身的业务含义。t-SNE 的图尤其要小心。它的一个常见误读是聚类之间间距越大代表差异越大实际上 t-SNE 并不会保留聚类之间的全局距离关系间距大小不等于真实差异。而且 perplexity 这个参数影响巨大我在同一份数据上分别设 5 和 50图形从碎成小岛变成连成大陆结论可以完全不同。所以凡是正式输出的降维散点图我一定会标清楚算法和关键参数否则别人无法复现图本身也失去了严谨性。5.3 连接散点图给散点装上时间轴连接散点图connected scatter plot是把散点按时间顺序用线连起来。普通折线图适合单指标随时间的趋势连接散点图则适合观察两个指标之间的联动变化。比如用户生命周期分析里x 轴放累计登录天数y 轴放平均会话时长每个阶段对应一个点连线把从高频短会话转向低频长会话这种演化轨迹直接画成方向线比单看两个折线图直观得多。绘制时需要注意连线的顺序先用时间字段对数据排序再用线段连接。很多人第一次画出来线条乱窜就是因为没有排序点和点之间按原始数据顺序连接画出来是一团乱麻。另外箭头标注趋势方向也是个好习惯能让读者快速判断移动方向而不是自己逐段猜测。6. 选型逻辑先问数据在问什么再决定画什么图6.1 场景到图形的决策表下面是我自己整理的一张决策对照表每次不确定选型时先对照它要回答的问题推荐图形核心参数与要点两变量关系样本量较小普通散点图透明度和点大小可微调样本量很大看整体密度六边形分箱图 / 分箱散点图gridsize 30到60binslog想看平滑的密度轮廓密度等高线图核带宽影响平滑度需尝试两变量关系加各自分布边际分布图kind 选 scatter 或 hex三个连续变量的关系气泡图size 映射面积半径开方多变量两两关系扫描散点矩阵变量先筛到四到五个高维聚类结构降维散点图标明 PCA/t-SNE/UMAP 与参数两指标随时间联动连接散点图先按时间排序再连线6.2 我踩过的五个翻车现场按频率排序这些坑几乎每个数据可视化项目都会碰到一次气泡图直接映射半径面积失真。对应解法是确认库的 size 参数是面积还是直径必要时手动对数值开方。hexbin 忘记开 log 变换低密度区域漆黑一片。高跨度计数数据务必用 binslog。pairplot 塞入太多变量格子挤成马赛克。先做相关性筛选保留强相关变量。t-SNE 散点图不记录 perplexity换个参数结论就变。任何降维图都要写清参数。三维散点图不旋转也不分组上色观众盯着静态图完全看不出结构。能降回二维就降回二维。每一条背后都是真实项目的教训。可视化工具的默认设置往往只适合教科书画例真实数据的分布永远更畸斜更不均匀。6.3 一条通用的选择策略最后分享我的个人习惯。每次画散点图的衍生图形前我会先问自己三个问题样本量是多少关键变量有几个这张图要回答的是分布、关系还是时间趋势三个问题对应三组答案基本就把图形范围圈定在六边形分箱、气泡图、散点矩阵、边际分布和连接散点图这几类里。做图时颜色映射永远优先选 viridis 或 cividis 这类感知均匀的方案换来的不只是好看而是在任何输出介质上都保留信息层次。做完整套图之后我还会再问一遍这张图拿去给别人看对方十秒内能否说出结论如果十秒说不出来那就说明图形选择或变量取舍出了问题需要回炉重做。散点图的衍生图形不是一个封闭名单工具在更新数据形态也在变。真正稳定的是背后的原理密度、维度、组合这三条演化主线理解了这三条再遇到任何新的散点图变体你都能很快判断出它是在解决样本太多的问题还是在解决信息维度不够的问题。带着这个框架去看图选图比背图形清单实用得多。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询