news 2026/9/18 1:25:09

QGIS二元分区着色图全流程:原理、实现与配色设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
QGIS二元分区着色图全流程:原理、实现与配色设计

做专题图的人,多半遇到过这种处境:手上明明有两个都挺重要的指标,比如人口密度和人均收入,但传统分区着色图(choropleth)一张图只能填一个变量。把两张图并排放在报告里,读者得来回对照;用两个图层调透明度硬叠,颜色又容易变得脏兮兮。后来我接触到二元分区着色图(bivariate choropleth),才发现原来还有这种玩法——把两个变量各自切成“低/高”两档,拼成一个2×2的四象限,用四种颜色一次性呈现在单张地图上。这篇文章就围绕QGIS里做二元分区着色图的完整流程展开,先讲原理和关键决策,再给三种实现方式、一份完整实操示例、配色设计思路、图例制作方法,最后是我实际踩过的坑。适合正在做多变量可视化、专题图分析,或者对QGIS符号渲染机制感兴趣的朋友参考。

1. 为什么我建议你试试二元分区着色图:先想清楚再动手

1.1 单变量专题图只讲了一个维度

传统choropleth的做法,是把一个数值字段映射为一组渐变色阶,地图上的每个面按照该值从低到高呈现由浅到深的颜色。它的本质,是把空间场景强行压缩成了一维的“排名”。我看一张GDP图,知道哪里高哪里低,却完全看不出“高GDP区是否同时拥有高能耗”,也看不出“低GDP区到底是收入低还是投资少”。这是两个完全不同的问题,单变量图没法回答。

我最早是在一个区域协调度项目里被这个问题卡住的。当时要看“经济发展”和“公共服务”两个指标在县域尺度上的匹配关系,一开始就是把两张图并排输出到报告里。评审专家看得很累,因为人的视觉系统天生不擅长跨图对照。这才促使我去找一种能把两个变量放进同一幅图的方法,于是接触到了二元分区着色图。

1.2 二元分区着色图到底长什么样

二元分区着色图的逻辑很直白:把变量A、变量B分别切成两档,低和/or高,得到4种组合,每种组合对应一个固定颜色。常见布局是这样:

  • A低B低(LL):浅灰白,表示两个变量都处于低位
  • A高B低(HL):第一个主色,比如橙红色
  • A低B高(LH):第二个主色,比如蓝青色
  • A高B高(HH):两个主色叠加出的深色,比如蓝紫色

我见过更激进的3×3版本,能表达9种组合,但对配色要求高很多,图例也复杂。在绝大多数工作场景里,2×2已经足够回答“哪种组合多、哪种组合少、集中在哪些区域”这个关键问题,所以我建议第一次做直接采用2×2,先把流程跑通,再考虑要不要加细。

1.3 哪些场景真正适合它

我总结下来,二元分区着色图在三种场景下价值最大:

一是筛选双高或双低区域。比如“人口密集且收入高”的板块,或者“投资高但回报低”的区域,一眼就能看到聚集在哪儿,省去反复叠图的功夫。

二是发现变量错位的区域。比如“经济指标高但生态指标低”的地方,在图上呈现为两种高饱和纯色,说明发展模式可能存在协调性问题,这类区域往往是后续调研的重点。

三是做探索性分析。在还不知道数据有什么空间规律之前,用二元图快速看两个指标的空间协同关系,比连续做十几张单变量图效率高得多。

但它也有明显不适用的场景:需要精确读取数值的科研输出、面向严重色弱人群的图件、以及对分级精度要求较高的分析任务。这时候宁可回到单变量分面图,或者改用散点图加地图联动。

2. 动手前的关键决策:数据怎么选、变量怎么分

2.1 对数据的基本要求

二元分区着色图一般作用于面要素图层,每个要素最好带两个数值字段。如果手头是点要素,比如一堆POI,可以先做核密度分析或空间连接,把点聚合到行政区面里。如果只有Excel表,也能通过图层属性里的“连接”功能关联到面要素上,前提是两边有一列一致的ID。

我遇到最多的一个坑是:CSV或Excel导出的数值字段,导入QGIS后被识别成了文本类型。文本字段在规则渲染器里参与大小比较时,QGIS会按字典序比较,于是“9”会大于“10”,整个分类结果莫名其妙。排查方法很简单:右键图层打开属性表,看字段类型;如果是String,用字段计算器新建一个浮点字段,或者用Processing工具箱里的“Refactor Fields”统一转类型。这个检查一定要放在渲染之前,否则后面所有步骤都会被带偏。

2.2 量纲不同,必须先分类而不是直接映射

有人习惯直接拿两个变量的原始值做四象限切分,比如A大于100且B大于500就是“高-高”。这种做法不是不行,但前提是你对两个变量数值分布非常了解,也知道100和500这两个阈值在各自维度上等价。可现实中两个变量量纲经常差得很远,一个是从0到1的指数,另一个是几万到几十万元的人均值,直接比原始值没有任何参照意义。

正确的做法是先各自分类:把每个变量按照某种规则切成“高/低”两档,再做组合。这样变量A的“高”和变量B的“高”,虽然数值上完全不等价,但在分析语义上都代表“该变量在样本中处于相对高位”。这是二元分区着色图能在一张图里比较两个不同性质变量的基础,也是它与简单的“多条件筛选”最大的区别。

2.3 2×2还是3×3,先回答“一档够不够细”

2×2的粒度很粗,每个变量只有高低两档,只能回答“是否偏高”。如果数据分布比较连续,分析需要更细致的梯度,可以考虑3×3,也就是9类。但3×3的代价很现实:图例得做成3×3矩阵,配色要选9个两两可区分的色块,缩小到PPT里排印后,普通人基本分不清相邻格子的颜色。

我个人的经验是,如果读者是决策者或非专业图件受众,2×2往往比3×3更有效。三成信息增量换来的常常是七成认知负担。如果确实需要3×3,两个变量都建议用三分位分段,也就是低、中、高三档,再组合。实现方式与2×2完全一样,只是规则从四段变成九段,配色需要额外设计一个3×3颜色矩阵。

2.4 分位数、自然断点还是等间距

断点选择直接决定四象限的分界,这一步做不好,整张图很容易变成某一类颜色占了大半画面,失去分辨力。

我的推荐顺序是:

  • 二分位数最稳妥。对大多数偏态分布的统计指标,用中位数作为断点,能保证四类在样本数量上大致均衡,不会出现某类面积过小、另一类过半的情况。
  • 均值可以作为正态或均匀分布数据的断点。均值语义更好解释:高于平均就是“高”。
  • 有天然临界值时用等间距。比如空气质量指数AQI以100为达标线,就直接用固定阈值,别纠结统计方法。

在QGIS里拿分位数有两种方式。一是在属性表里选中字段,点击右下角统计面板,能直接看到计数、最小值、最大值和百分位;二是用表达式聚合函数动态计算,比如percentile("field", 0.5)返回中位数,percentile("field", 0.33)返回三分之一分位点。第二种方式写进渲染规则后,每次刷新地图都会按最新数据自动重算,非常灵活。

3. QGIS里实现二元分区着色图的三种做法

3.1 做法一:规则分类渲染器加表达式

操作入口是:图层属性 → 符号化 → 分类 → 规则分类(Rule-based)。

添加四条规则,每条规则写一个表达式。假设字段分别叫var1var2,四条规则可以这样写:

  • 高-高(HH):"var1" >= percentile("var1", 0.5) AND "var2" >= percentile("var2", 0.5)
  • 高-低(HL):"var1" >= percentile("var1", 0.5) AND "var2" < percentile("var2", 0.5)
  • 低-高(LH):"var1" < percentile("var1", 0.5) AND "var2" >= percentile("var2", 0.5)
  • 低-低(LL):其它情况兜底,可以直接勾选“否则(Else)”,也可以显式写成:"var1" < percentile("var1", 0.5) AND "var2" < percentile("var2", 0.5)

这种做法的最大优点是不修改原始数据,表达式里直接动态计算分位点,想换断点就改规则,数据更新后阈值也跟着变。但有个性能提醒:如果要素数量很大,超过几十万,每次刷新地图都对整表做聚合取分位,会明显变卡。这种情况建议改用做法二。

3.2 做法二:字段计算器生成组合字段

打开属性表 → 字段计算器 → 新建一个文本字段,比如叫bivar_group。输入下面这段CASE WHEN表达式:

CASE WHEN "var1" >= percentile("var1", 0.5) AND "var2" >= percentile("var2", 0.5) THEN 'HH' WHEN "var1" >= percentile("var1", 0.5) AND "var2" < percentile("var2", 0.5) THEN 'HL' WHEN "var1" < percentile("var1", 0.5) AND "var2" >= percentile("var2", 0.5) THEN 'LH' ELSE 'LL' END

确定后字段生成。然后回到图层属性 → 符号化 → 分类 → 唯一值,选中这个bivar_group字段,点击“分类”,再为四类分别设置颜色和标签。

这个做法的好处是组合结果持久化,后续筛选、按组统计、出表都很方便;渲染时不需要临时聚合计算,效率高。缺点是改阈值时要重新跑一遍字段计算器。所以我的习惯是先用做法一确定阈值,再落成字段,两全其美。

3.3 做法三:试试第三方多变量渲染插件

QGIS插件库里有几个专门应对多变量渲染的插件,名字里通常带bivariate或choropleth之类的关键词。有的插件能自动生成规则并配置颜色,界面比手写表达式友好得多。我自己试用时感觉小功能挺顺手的,但这类插件往往依赖特定QGIS版本,大版本升级后容易出现兼容问题,而且文档普遍不多。

我的态度是:个人项目里尝鲜可以,正式生产制图流程里不建议作为唯一依赖。一旦插件不兼容,整套样式就得推倒重来,风险实在不划算。

3.4 三种写法怎么选

我整理了一个简单的选择逻辑:

  • 数据量小、需要快速出图:做法一,表达式随手改,灵活。
  • 数据量大、后续要做统计筛选:做法二,字段持久化,可靠。
  • 团队协作、需要标准制图模板:做法二,渲染规则可以另存为QML样式分享给同事。
  • 只想快速体验一下效果:可以试试做法三,装插件点几下就出图。

在团队场景里我尤其不建议用做法一,因为表达式里带聚合函数,不同QGIS版本或不同图层类型下解析可能会有差异,同事复现时容易踩坑。做法二的字段是死的,任何版本渲染都一致。

4. 完整实操示例:用省级面板数据做一张二元分区着色图

4.1 准备一份带两个数值字段的面要素数据

我这次用的是省级行政区面要素,属性表里包含“人均GDP”和“人口密度”两个字段。如果你手头没有现成数据,可以用QGIS安装目录下的示例数据练手,比如world_map.gpkg,里面有国家面要素和一大堆统计字段,随意挑两个来练就行。

动手前先确认坐标系。如果数据是WGS84经纬度,直接出图会有明显形状变形,最好先重投影到适合分析区域的投影坐标系。国内区域我习惯用Albers等积投影或UTM,操作也不复杂:矢量 → 数据管理工具 → 重投影图层。

4.2 用字段汇总检查数据质量

拿到图层后别急着渲染,先打开属性表,点击两个字段名。新版QGIS属性表下方自带统计栏,能直接看到计数、最小值、最大值、均值、中位数。这一步主要干三件事:确认没有NULL值;留意是否出现极端离群值;心里有数中位数偏离均值有多远。

如果你在属性表里找不到统计栏,可以用Processing工具箱里的“字段统计”工具(Basic statistics for fields),它会输出一份更完整的统计表,包含分位数、方差、标准差等,也可以导出成CSV备用。这一步花两分钟,后面排查问题能省两小时。

4.3 用QGIS表达式生成分类标签

数据确认没问题后,我建议先把组合字段做出来。打开字段计算器,输出字段名填bivar_group,类型选文本,宽度填10,然后输入3.2节那一长串CASE WHEN表达式。点击确定后,属性表会多一个字段,每行取值是HH、HL、LH或LL。

如果之后想换断点,比如把中位数换成均值,直接重新运行字段计算器覆盖这个字段即可。注意在关闭编辑模式前确认已保存,否则会丢失。

4.4 配置规则分类渲染器与配色

回到图层属性 → 符号化 → 分类 → 规则分类。添加四条规则,名称分别写成“高-高”“高-低”“低-高”“低-低”,表达式用"bivar_group" = 'HH'这样的写法。下面这组Hex是我在报告级常温光照场景下常用的:

组合标签Hex颜色视觉效果
HH高-高#3b4994深蓝紫,图面焦点
HL高-低#ee3b2c橙红,暖色抢眼
LH低-高#6da9d2浅蓝,中等视觉重量
LL低-低#e8e8e8浅灰,彻底后退

这里强调一个原则:颜色顺序必须与高低关系一致。好的二元配色,必然是“低-低”最弱、“高-高”最强。这样读者第一眼就能抓住双高区域,图面视觉层级才清晰。

4.5 叠加底图、调整透明度和图层顺序

把行政区图层放在底图上面。底图建议只保留河流、道路等弱视觉要素,不要用色彩很艳的影像底图,否则前景色块会被抢走注意力。如果底图偏暗,可以给前景图层调一点透明度,比如85%到90%,让地形线隐约透出来。

这里正好可以用上QGIS里的“数据定义覆盖”(data defined override)。比如我想让“高-高”区域的边界更醒目一些,就在符号化面板的“边线宽度”右侧点击黄色的ε图标,选择“编辑…”,输入表达式:

CASE WHEN "bivar_group" = 'HH' THEN 0.8 ELSE 0.3 END

这样一个图层就能根据分组自动输出不同线宽,不用另建图层、不用手工筛选项,专业制图里非常实用。

5. 二元配色的设计逻辑:从颜色混合到视觉层级

5.1 为什么经典二元配色是“蓝+红+紫”

二元分区着色图配色的底层逻辑,来源于颜色混合。把变量A映射为一个主色从浅到深,比如蓝色;把变量B映射为另一个主色从浅到深,比如红色。那么A高B高的区域,就应该呈现为两种颜色叠加后的混合色,也就是紫色。于是2×2色板的结构自然就定了:

  • 低A低B:两种颜色都很浅 → 淡灰白
  • 高A低B:只有蓝色深 → 蓝色系
  • 低A高B:只有红色深 → 红色系
  • 高A高B:两种颜色都深 → 紫色或深蓝紫

理解了“混合”这个思路,你就不会把“高-高”配成绿色了。因为绿色和红蓝都没有衍生关系,读者看图时不会本能地把它理解成“两个变量的共同高位”。

5.2 用半透明叠色理解色板生成

做平面设计的人更习惯从CMYK叠印的角度来理解。把两种半透明油墨叠印,得到第三种颜色,这和二元图“两个变量叠加”的逻辑几乎一一对应。

我自己选色时有个土办法:在画图软件里建两个半透明色块,一层叠一层,看混合后的颜色,再把这个颜色用取色器转成Hex填到QGIS里。这个办法比空想“蓝加黄会不会难看”靠谱太多了,推荐大家都试试。注意,QGIS渲染时并不是真的对两个变量做颜色混合,我们只是在设计色板阶段借用混合思路,选出的四色依然需要手工填入。

5.3 色盲安全配色方案

如果图件要打印成纸质件,或者已知读者中有红绿色盲,请果断放弃红配绿。我常用的替代方案是蓝-橙组合:

组合Hex颜色
HH#6C3483 深紫灰
HL#CA6F1E 深橙
LH#1F618D 深蓝
LL#F2F3F4 浅灰

蓝和橙在各类色觉异常场景下都保持相对可区分性。另外提醒一句,出图后不要只看屏幕效果,最好用Inkscape、GIMP或在线色觉模拟工具过一遍,确认色弱状态下的可读性。这一步成本不高,但能避免很多尴尬。

5.4 用透明度、边线和纹理补充第三维信息

二元图受限于四色,天然表达不了第三个变量。如果你还想把“区域面积规模”体现出来,不要硬往颜色里加,那样会破坏已有配色逻辑。我通常用两个替代方案:

  • 点密度图叠加:在每个面内部画点,一个点代表一定数量,点密的地方说明规模大。点用灰色或白色,不要抢色块的注意力。
  • 边线宽度映射:用数据定义覆盖把边线宽度映射到第三个变量的分档,比如分三档就够了。档位太多读者分不清。

第三条路就是在打印布局里加一个副图,用常规单变量图展示第三维,简单直接。

6. 图例与布局:让读者一眼读懂二元图

6.1 图例别用默认样式,最好做成2×2矩阵

QGIS默认图例会按渲染规则的顺序列出四个图例项,但这对二元图来说并不合理。读者看到四行文字,很难脑补出“高-高”“高-低”“低-高”“低-低”的二维关系。我在正式出图时,会放弃自动图例,改成手绘一个2×2矩阵,横轴写变量B,纵轴写变量A,四个格子填充对应颜色并标注低/高。信息密度高,读者一眼就能看懂。

6.2 在打印布局中手工搭建矩阵图例

具体操作步骤:

  1. 新建打印布局,从左侧工具栏拖入“矩形形状”,画一个小方块。
  2. 在“项目”面板中找到该形状,把填充色设为对应Hex颜色。
  3. 复制出四个方块,按2×2矩阵排列。
  4. 在矩阵的上方和左侧添加轴标签,比如顶部写“变量B:低 ← → 高”,左侧写“变量A:低 ← → 高”。
  5. 矩阵内部四个格子可以标注中文“高-高”“高-低”“低-高”“低-低”,也可以留空只靠颜色和图例说明。

这种图例看起来不像传统GIS图例,但在二元分区图里是标准做法,专业可视化作品基本都是这么处理的。

6.3 输出高分辨率成果

出图前把布局纸张尺寸设置成目标尺寸,比如A3或A4,地图框固定好范围和比例尺。在“布局”菜单里点击“导出为图片”,分辨率选300dpi,格式PNG或TIFF。如果图层里带了在线底图,导出时需要重新抓取底图瓦片并合并,速度会慢一些,建议先在画布上完整浏览一遍,让瓦片缓存好了再导出。

6.4 常见出图尺寸参数参考

目标载体纸张尺寸推荐分辨率导出格式
报告插图A4300dpiPNG
会议海报A3300dpiTIFF
演示PPT16:9画布150-200dpiPNG
印刷出版按出版要求350dpi以上TIFF/PDF

如果选择PDF导出,字体和矢量要素会保留得更完整,缺点是文件体积大、部分查看器打开慢。我个人做报告图时用PNG最多,做印刷件才会走PDF。

7. 我的踩坑记录与排查思路

7.1 字段类型是字符串,比较结果一团糟

我第一次做二元图时,从CSV导入的两个数值字段都被识别成了字符串,当时没注意就直接写表达式,结果图上出现了大量莫名其妙的“高-高”区域。排查时打开属性表才发现,字符串字段的排序方式是字典序,9排在了10后面,所有个位数的条目都被当成了“大数”。

排查链路是:先怀疑表达式 → 打开属性表点击字段名,看排序方式 → 发现字段类型是String → 用字段计算器新建浮点字段转类型 → 用新字段重新渲染。这个坑靠一条习惯就能避开:拿到数据先看字段类型,别看名字像数字就默认它是数值型。

7.2 NULL值被当成“低-低”,分区结果出现漏洞

只要两个变量里有一个是NULL,前面那段CASE WHEN判断会直接跳到ELSE分支,于是该要素被划分到“低-低”,导致“低-低”面积虚大。我遇到过某省的指标缺失,渲染成浅灰色,看起来像“双低”,实际是“无数据”,完全误导了结论。

解决方法是:在CASE WHEN最前面加一个分支,把缺失值单独标记出来:

CASE WHEN "var1" IS NULL OR "var2" IS NULL THEN 'NA' WHEN "var1" >= percentile("var1", 0.5) AND "var2" >= percentile("var2", 0.5) THEN 'HH' WHEN "var1" >= percentile("var1", 0.5) AND "var2" < percentile("var2", 0.5) THEN 'HL' WHEN "var1" < percentile("var1", 0.5) AND "var2" >= percentile("var2", 0.5) THEN 'LH' ELSE 'LL' END

然后在渲染器里给NA指定一个灰色斜线填充,并在图件脚注里说明NA代表数据缺失。这个细节在正式项目里非常重要。

7.3 断点一刀切,四分类严重失衡

有一版图我图省事用了均值做断点。数据严重右偏,均值被少数极高值拉高,结果四分之三的要素都被划进“低”,“高-高”区域只剩下零星几个点,整张图基本失去分辨力。解决方法就是先看分布,改用中位数做断点,或者两个变量各自用分位数。

也要提醒一句,中位数断点会把大量“中等水平”区域硬性分成高低两半,这是一种刻意简化。二元分区图本来就是粗粒度的探索工具,不要指望它代替聚类或回归,认清这一点就不容易做出误导性结论。

7.4 在线底图加载不了,出图前手忙脚乱

我在国内做项目时,经常遇到某些公开XYZ底图服务地址访问不稳定。排查思路是:先确认网络连通性,再在QGIS“浏览”面板的“XYZ Tiles”里右键新建连接,填入服务地址。如果某个服务不可用,就换备用服务商。

我自己的习惯是准备两个备选的切片服务地址,一个渲染时用,一个出图时用。万一主服务在出图前宕了,切换备用源只需要在图层集里换一个地址,不影响已经完成的数据样式。这里要注意:如果你要导入本地的影像底图或卫片,直接在图层菜单里选择“添加图层”→“添加栅格图层”就行,本地方案的稳定性远好于在线服务。

7.5 图例颜色和地图颜色对不上

手绘图例最大的风险是Hex值抄错。有一次同事的手绘图例里,把“高-高”的深紫色抄成了深蓝色,整个图例的视觉逻辑全乱了。排查方法很简单:不靠肉眼,从图层属性面板复制颜色代码,或者用QGIS的颜色选择器把颜色保存到项目变量里,图例里的填充色和地图填充色从同一个变量读取。我在打印布局里甚至干脆不放默认图例,而是放一个表格,表格内的色块颜色直接从源图层的符号化面板复制出来,保证两边绝对一致。

做二元分区着色图这几年,我最大的体会是:这种图的真正价值不在于“把两个变量塞进一张图”,而在于它逼你想清楚两个变量之间的关系是什么、你希望读者优先从哪个象限读起。颜色和渲染都只是执行层,问题定义和分析思路想清楚了,出图就是水到渠成的事。如果你手头正好有面板数据,建议今晚就打开QGIS试一张二元图,跑通流程之后你会回来感谢自己的。有问题欢迎在评论区交流,我看到都会尽量回复。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 1:25:04

AR-NAR混合生成模型YuE:Hugging Face一站式实践指南

1. 项目概述&#xff1a;从“YuE”到可复现的AR–NAR MoT模型实践“YuE”不是某个网红ID&#xff0c;也不是某款新出的字体渲染工具代号&#xff0c;而是2024年中旬悄然登上Hugging Face Model Hub并引发小范围技术圈讨论的一个开源序列建模项目——全称是Autoregressive–Non-…

作者头像 李华
网站建设 2026/9/18 1:23:55

2026冲刺用!AI论文写作工具测评:最新推荐与实用对比

2026年真正好用的AI论文写作工具&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …

作者头像 李华
网站建设 2026/9/18 1:21:53

大学生网购调研数据管线:问卷设计、数据清洗与自动报告生成

简介&#xff1a;围绕大学生网络消费行为展开的调查报告文档&#xff0c;适用于电子商务、市场营销、社会学等专业的学生与教师&#xff0c;也可为校园消费调研或课程作业提供参考样本。全文以问卷调研为主线&#xff0c;依次覆盖调查背景与目的、提纲设计、样本选取与抽样方法…

作者头像 李华
网站建设 2026/9/18 1:18:13

NAO机器人舞步控制:节拍对齐、关节约束与实时反馈闭环

简介&#xff1a;本资源是一份面向机器人开发初学者与高校科研人员的NAO人形机器人舞步程序设计技术论文&#xff0c;聚焦于二次开发实践&#xff0c;解决人形机器人仿生步态规划与舞蹈动作编程等核心问题。全文系统梳理NAO硬件架构&#xff08;25自由度、多模态传感器阵列&…

作者头像 李华