ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

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

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。添加四条规则每条规则写一个表达式。假设字段分别叫var1和var2四条规则可以这样写高-高HHvar1 percentile(var1, 0.5) AND var2 percentile(var2, 0.5)高-低HLvar1 percentile(var1, 0.5) AND var2 percentile(var2, 0.5)低-高LHvar1 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 在打印布局中手工搭建矩阵图例具体操作步骤新建打印布局从左侧工具栏拖入“矩形形状”画一个小方块。在“项目”面板中找到该形状把填充色设为对应Hex颜色。复制出四个方块按2×2矩阵排列。在矩阵的上方和左侧添加轴标签比如顶部写“变量B低 ← → 高”左侧写“变量A低 ← → 高”。矩阵内部四个格子可以标注中文“高-高”“高-低”“低-高”“低-低”也可以留空只靠颜色和图例说明。这种图例看起来不像传统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试一张二元图跑通流程之后你会回来感谢自己的。有问题欢迎在评论区交流我看到都会尽量回复。
返回列表