☰
MATLAB扇形统计图配色完全指南:从默认配色到自定义方案
2026/10/15 1:03:29 网站建设 项目流程

从一张灰头土脸的饼图说起

先说个实际场景。上个月我帮某项目的周报配图,数据是五个渠道的访问来源占比,我顺手用了MATLAB默认的pie画扇形统计图,结果出来的效果就是那种"五彩拼盘"——红橙黄绿各占一坨,饱和度又高,放PPT里和整体版式完全不搭。数据本身没问题,问题全出在颜色上。这事让我重新把MATLAB扇形统计图的绘制和颜色调配捋了一遍,今天把踩过的坑和最终沉淀下来的方法一起写出来。

这篇文章适合两类人:一是刚接触MATLAB、想快速画出规范扇形统计图的新手,二是有一定基础、但每次都被默认配色丑到、又不知道从哪下手调整的老用户。内容会从pie的基础绘制逻辑开始,讲到颜色分配的底层机制,再落到三套可直接抄的自定义配色方案,最后用一组真实项目数据演示完整的配色决策过程。

1. 扇形统计图的绘制本质:数据比例的可视化归一

1.1 pie函数的数据分配原理

MATLAB里画扇形统计图最核心的函数就是pie。它的内部逻辑很简单:把传入的向量每个元素除以元素总和,得到一个比例,再用这个比例乘以360度,作为对应扇区的圆心角。所以pie([15 20 25 40])其实等价于画四个角度分别为54度、72度、90度、144度的扇区。

x = [15 20 25 40]; figure; pie(x);

这个最简单的写法会自动在每个扇区旁边显示一个百分比标签,15会显示成15%,分别对应四个扇区。如果你给pie传入的是复数形式的矩阵,比如pie([2+3i 4+2i 1+1i]),那它只取实部作为数据值、虚部作为偏移值,这种用法比较少,知道即可。

另外一个很多人不知道的细节是:pie是从3点钟方向开始,按逆时针顺序逐块分配角度的。也就是说,第一个数据对应的扇区永远在正右方开始,后续数据依次逆时针排列。这个方向特性直接影响你后续配色时"哪个类别放哪个位置"的判断,尤其是你想让某个重点类别的扇区落在视觉中心(通常是右上方区域)时,可以通过调整数据的排列顺序实现。

1.2 pie与pie3怎么选

MATLAB还提供了pie3,可以画出带立体厚度的三维饼图。初看效果更炫,但实际使用时我强烈建议慎用。原因有三个:第一,立体投影会导致近处扇区看起来比实际比例大、远处扇区被压缩,这违反了数据可视化的准确性原则;第二,标签在三维旋转后经常发生重叠错位,后期调整非常费时;第三,打印到纸质报告里,三维效果反而降低信息辨识度。

维度piepie3
视觉维度二维平面三维立体投影
数值准确性高,角度精确对应比例低,透视会扭曲视觉比例
标签可读性好差,容易错位重叠
适用数据量2~8类2~5类且仅限演示场景
输出场景报告、论文、PPT大屏展示、效果图

我的结论很直接:除非是甲方明确要求立体效果,否则一律用pie。扇形统计图本身的核心价值是快速传达占比关系,加立体只会增加干扰。

1.3 explode参数:让重点扇区"弹"出来

pie的第二个参数是explode,作用是把指定扇区从圆心向外偏移一段距离,实现"拉出"效果。这个参数传一个和x等长的向量,非零值对应的扇区会被偏移,偏移量正比于数值大小。

x = [15 20 35 30]; explode = [0 1 0 1]; % 第二个和第四个扇区被拉出 figure; pie(x, explode);

实际应用中我不建议一次拉出太多扇区。一个图里两个以上"弹出来",视觉上会显得杂乱,失去强调的作用。通常只拉出你希望受众第一眼关注的那个最大或最关键的扇区。而且拉出的扇区边缘会与相邻扇区形成空隙,这种空隙反而会在视觉上放大被拉出部分的面积感,这一点在写报告结论时要心里有数。

2. 默认配色为什么会越看越难受

2.1 颜色顺序从哪来

很多人以为pie的颜色是用colormap控制的,改colormap(parula)就能变颜色。这个认识是错的。pie的实际着色机制走的是坐标区(axes)的ColorOrder属性,和plot画折线时用的颜色序列是同一套机制。MATLAB从R2014b开始,新建坐标区默认ColorOrder是一个7行3列的RGB矩阵,对应7种颜色,也就是大家熟悉的蓝、橙、黄、紫、绿、浅蓝、深红那一组。

你可以在命令行里直接查看当前坐标区的颜色序列:

ax = gca; disp(ax.ColorOrder);

执行后会看到一个7x3的矩阵,每一行是一个RGB值,范围在0到1之间。第一个扇区用第一行颜色,第二个扇区用第二行,依次类推。

2.2 超过七个类别时自动循环的陷阱

默认ColorOrder只有7行。如果你传入的数据有8个类别,第八个扇区会重新使用第一行的颜色,这就出现了"第八扇区和第一扇区同色"的循环问题。对扇形统计图来说,这种循环是最致命的:读者天然会把相同颜色识别为同一个数据系列,一旦撞色,整张图的信息传达立刻失效。

我见过实际案例:某调研报告里有一个9类别的扇形统计图,默认配色下第1和第8扇区都是蓝色,第2和第9都是橙色。台下提问环节就有人问"这两个蓝色扇区是不是同一个来源的两部分",场面非常尴尬。所以我的第一条配色铁律就是:类别数超过7,一定不要依赖默认ColorOrder。

2.3 判断"配色出问题"的信号

判断默认配色能不能用,有一个很简单的自查方法:把图形缩小到原尺寸的50%再看一眼。如果缩小后发现两个扇区边界模糊、颜色难以区分,那就是配色对比度不够。默认ColorOrder中第四行的紫色和第七行的深红色,在很多显示器上就存在这个问题,两者明度接近,缩小后几乎分不开。

另外还有一个易忽略的点:MATLAB图形窗口默认底色是白色,但导出到深色背景的PPT或网页里,扇区边缘会被背景吃掉。这时候需要给扇区加一圈白色描边,也就是设EdgeColor为白色,确保在任何底色下扇区间都有清晰边界。

3. 手动调配扇区颜色的三套实用方案

3.1 手工RGB颜色板

最直接的自定义方式,是提前定义一个和类别数等长的RGB矩阵,然后把它赋给坐标区的ColorOrder。颜色值都在0到1之间,不是0到255,新手最容易在这里翻车。

x = [32 27 24 12 5]; myColors = [ 0.18 0.36 0.60; % 深蓝 0.95 0.62 0.22; % 橙 0.26 0.55 0.42; % 青绿 0.78 0.38 0.22; % 砖红 0.42 0.42 0.42 % 中性灰 ]; ax = gca; ax.ColorOrder = myColors; pie(ax, x);

这里有一个顺序问题要注意:必须先设置ColorOrder再调用pie,否则pie已经画完,你再改ColorOrder是不会刷新已有扇区颜色的。pie在创建时一次性从坐标区取走颜色序列,后续改动不生效。如果你已经画完了才想起改颜色,可以用下一小节的办法直接修改扇区对象。

常见的稳妥配色可以直接参考下面这套RGB值,覆盖了深色、暖色、冷色和中性色,适用范围很广:

颜色名称RGB值适用场景
深海蓝[0.16 0.32 0.55]主类别、强调数据
暖橙[0.93 0.58 0.19]次要类别、辅助数据
橄榄绿[0.29 0.55 0.39]正向指标、增长类数据
陶土红[0.72 0.32 0.22]警告类、负向指标
中性灰[0.55 0.55 0.55]其他类别、兜底数据
薰衣草紫[0.57 0.47 0.72]补充类别
薄荷青[0.35 0.68 0.67]冷色系列补充

这套颜色我用了挺久,核心思路是避免使用纯红纯绿纯蓝这种高饱和撞色,而是把饱和度压到0.6左右,明度控制在0.2到0.7之间,让整张图看起来沉稳。

3.2 基于HSV色相环自动等距取色

如果类别数是5到8且没有品牌色约束,我更推荐用色相环等距取色自动生成配色。HSV色彩模型中,色相(H)本身就可以被均分成N份,这样得到的N个颜色色相差最大,理论上区分度也最高。

function c = generateColors(n) % 等距色相取色,错开半个色相格避免相邻颜色过近 h = mod((0:n-1) * (1/n) + 0.5, 1); s = 0.72 * ones(1, n); % 饱和度统一 v = 0.92 * ones(1, n); % 明度统一 c = hsv2rgb([h', s', v']); end x = [25 20 18 22 15]; myColors = generateColors(numel(x)); ax = gca; ax.ColorOrder = myColors; pie(ax, x);

但这里有个反直觉的细节:完全等距的色相并不一定意味着视觉区分度最好。因为人眼对不同色相的敏感度不同,黄色和绿色之间、蓝色和紫色之间的区分度天然就比较弱。所以在等距取色的基础上,我通常会把其中一两个扇区的色相再偏转一点,让原本相邻的两个颜色拉开距离。

另一个经验是:饱和度不要拉满,明度不要过低。扇形统计图是块状视觉元素,饱和度拉满会变成"儿童画拼盘",明度过低则让整张图死气沉沉。我一般把饱和度控制在0.65到0.8,明度控制在0.85到0.95,这样颜色鲜艳但不刺眼。

3.3 用Patch对象做精细配色

pie的返回值里其实藏着一组图形对象,每个扇区对应一个Patch对象。通过捕捉这些对象,你可以对单个扇区单独指定颜色、描边粗细、边缘颜色,实现比ColorOrder更细粒度的控制。

x = [30 25 20 15 10]; h = pie(x); patches = findobj(h, 'Type', 'Patch'); customColors = [ 0.82 0.28 0.24; 0.96 0.65 0.18; 0.32 0.55 0.42; 0.40 0.42 0.68; 0.60 0.60 0.60 ]; for i = 1:numel(patches) patches(i).FaceColor = customColors(i, :); patches(i).EdgeColor = 'w'; % 白色描边 patches(i).LineWidth = 1.5; % 描边加粗 end

这种做法的最大优势是可以自由调整已绘制图形的颜色,不用反复重跑绘图命令。我在微调配色时经常用这个办法:先把图跑出来,然后一条条试不同颜色,实时看效果再定稿。用findobj时要注意,pie的返回值里同时包含文本对象和扇区对象,必须用Type过滤出Patch,否则会把标签文本也算进去。

4. 标签、百分比和扇区信息呈现

4.1 让标签显示"类别名+百分比"的组合方案

默认pie只显示百分比数字,这在正式报告里远不够用。更常见的需求是写成"渠道A:32%"这种格式。实现方法是把labels作为pie的第二个输入参数传入,注意这里的次序:如果同时要explode又要自定义标签,标准语法是pie(x, explode, labels)。

categories = {'渠道A', '渠道B', '渠道C', '渠道D', '渠道E'}; x = [32 27 24 12 5]; explode = [0 0 0 0 1]; labels = cell(1, numel(x)); for i = 1:numel(x) labels{i} = sprintf('%s:%.1f%%', categories{i}, x(i) / sum(x) * 100); end figure; pie(x, explode, labels);

这里有一个小坑:如果标签设置了但explode省略,pie(x, labels)也能工作,MATLAB会把它识别为标签参数。但一旦你加回explode,就必须按pie(x, explode, labels)的顺序来,这是函数语法定义,顺序反了会直接报错。

中文字体方面,默认字体在部分系统上渲染中文会发虚,建议在画完图后把所有文本对象的字体统一设置,比如用set(findobj(gca, 'Type', 'Text'), 'FontSize', 11, 'FontName', 'Microsoft YaHei')。如果你的数据文件是UTF-8编码保存,而MATLAB版本较旧,打开文件时中文还会乱码,这种情况建议把脚本另存为GBK编码再运行,或者升级到支持UTF-8的新版本。

4.2 小扇区标签重叠问题

扇形统计图最常见的信息呈现问题,是小扇区的标签互相重叠。数据占比本身只有5%甚至3%时,扇区宽度不足以容纳文本,标签就会往外溢出并和相邻扇区标签挤在一起。我的处理策略分三种情况:

第一种,占比小于5%的小扇区,直接在标签里去掉百分比数字,只保留类别名,减少文本宽度。第二种,占比非常小的扇区,干脆不在图上标标签,改到图例里说明。第三种,如果小扇区数量在两个以上,就把它们合并成一个"其他"类别再画图。

% 合并小类别示例 x = [32 27 24 12 3 2]; threshold = 5; large = x(x >= threshold); smallSum = sum(x(x < threshold)); newX = [large, smallSum]; newLabels = {'渠道A', '渠道B', '渠道C', '渠道D', '其他'};

这种"合并小类"的手法在商业报告里非常常见,既保证信息完整,又让图形干净。合并后的小类通常放在最后一个扇区,配色上使用中性灰,让它不做视觉焦点,读者自然就知道这是一堆零散项。

4.3 图例、字体和边框的统一处理

如果标签太挤而你又希望保留完整类别名,另一个方案是不在扇区上标类别名,只用legend维护对应关系。图例默认放在图形右上角,会遮挡图形,建议挪到右侧外部。

figure; pie(x); legend(categories, 'Location', 'eastoutside'); % 去掉图例边框和背景 lgd = legend(categories, 'Location', 'eastoutside'); lgd.Box = 'off'; lgd.FontSize = 10;

还有个细节是导出图片时的边框问题。使用print导出时,图形窗口的白色边距有时会切掉图例,推荐在导出前先把窗口尺寸设好:

set(gcf, 'Units', 'centimeters', 'Position', [2 2 16 10]); print(gcf, '-dpng', '-r300', 'pie_output.png');

这样导出的图片分辨率达到300dpi,印刷和投屏都够用。如果想进一步做矢量图输出,print(gcf, '-dpdf', 'pie_output.pdf')或者导出SVG格式,后续在矢量工具里二次编辑也非常方便。

5. 一组实际数据演示配色决策与效果对比

5.1 场景设计:三张报告配图

前面把方法讲完了,现在我把它们串进一个完整的实际案例。假设某项目需要做月度数据报告,包含三张扇形统计图:第一张是五个销售区域的占比,第二张是四个广告渠道的转化占比,第三张是三个成本类别的开支占比。三张图要求风格统一,都要符合项目VI的主色调,并且在黑白打印时也能区分。

这个案例的关键点在于:三张图虽然是不同数据,但视觉语言必须一致。如果每张图都重新想一套配色,报告整体就会显得零散。正确做法是定义一个全局基础色板,每张图从色板中取相应数量的颜色。

5.2 品牌色板设计与亮度检查

我定义的基础色板是七色,按照明度从深到浅排列:

palette = [ 0.15 0.28 0.48; % 品牌深蓝 0.24 0.45 0.66; % 中蓝 0.91 0.59 0.20; % 品牌橙 0.38 0.57 0.34; % 品牌绿 0.68 0.37 0.46; % 暗玫红 0.55 0.56 0.65; % 淡紫灰 0.52 0.52 0.52 % 中性灰 ];

画第一张图时取前五行,第二张图取前四行,第三张图取前三行。这样三张图的主色系完全一致,但数量不同不会造成错乱。检查黑白打印效果时,我还会把它们转成灰度看看亮度差异是否足够:

grayValues = rgb2gray(reshape(palette, [], 1, 3)); disp(grayValues);

这个操作把一个N行3列的RGB矩阵转成灰度值矩阵,数值之间差距越大,转成黑白后越容易区分。我一般要求相邻两个灰度的差至少大于0.12,否则在灰度打印时容易分不清扇区边界。

5.3 默认与自定义的对比踩坑

第一次画这三张图时,我直接用默认ColorOrder,第一张图五个扇区还勉强能看,但第二张图中第四个渠道恰好落在了默认序列的第七色(深红)上,和排在第一的蓝色之间缺乏明度过渡,转灰度后几乎变成同一色阶。第三张图三个扇区则分别用了蓝、橙、黄,颜色之间的风格跳跃感过强,和品牌VI完全不搭。

改用了上面这套palette后,三张图的观感立刻统一。这里有一个很关键的操作细节:每次清空图形或新建figure前,都要重新设置ColorOrder。plot会在新回合重新取色,而pie只在创建时读一次。如果在一个循环里连续画多张图,每一轮都别忘了重新赋值。

5.4 色盲友好配色的检查方法

配色除了要好看,还要考虑一部分色觉异常读者。红绿色盲是最常见的类型,所以尽量避免让"红与绿"作为唯一的区分手段。我的方法是在色相区分之外,额外叠加明度差异。比如品牌绿用 [0.38 0.57 0.34],暗玫红用 [0.68 0.37 0.46],两者色相完全不同,灰度值也有差距,即使色盲读者也能通过深浅区分。

另一种更严格的检查思路:把每个扇区填充颜色转成灰度值,人工看一眼是否每个灰度级别都能对应到数据。MATLAB里可以用rgb2gray快速模拟这个效果,虽然没有专业无障碍工具精确,但对日常报告场景已经够用。如果你的扇形统计图要公开发布,推荐再往上走一步,直接在图上把类别做成不同纹理叠加,比如斜线或网点填充,这种做法的成本较高,但能做到绝对区分无歧义。

6. 我多次调整后形成的几个配色习惯

第一,把颜色定义成变量而不是一个个写死在绘图命令里。我现在所有脚本开头都会统一声明一个palette矩阵,后续所有曲线、饼图、柱状图都从这个矩阵里取颜色。这样报告进入修改阶段,想整体调整色系时,只需要改文件顶部的一行RGB值,而不必满脚本寻找颜色设置。

第二,扇形统计图最多画8个类别,超过就换图。这不是MATLAB画不出来,而是人眼对角度差异的感知范围有限。扇区超过8个时,小扇区的角度差异已经很难被可靠感知,与其硬画,不如用条形图替代。我在这方面吃过亏,硬把12个类别的数据塞进一张饼图,结果每个扇区都又窄又小,标签全部重叠,加班改了半晚上标签位置,最后老老实实换成了条形图。

第三,颜色要配合数据语义。如果数据本身有"正向/负向"或"增长/下降"的含义,颜色不能乱用。红色通常意味着警告和负向,绿色代表正向,中性灰色适合放"其他"。哪怕你觉得某个颜色的视觉效果好,只要它和观众已有的语义预期冲突,就一定会造成误导。

第四,导出前做一次缩小检查。把图形缩到原尺寸的一半再看一眼,哪两个扇区分不清就立刻调整。这一招成本极低,但能避免绝大多数"导出后才发现颜色太像"的返工。我现在的流程是:画图 → 缩小检查 → 灰度检查 → 导出,四步走。这套流程已经完全刻进了工作习惯,做扇形统计图基本上不会再有返工问题。

MATLAB的扇形统计图本身是一个再简单不过的绘图函数,但配色才是真正决定这张图专业度的核心环节。希望这篇文章能帮你少走一些弯路,把那些"哪哪都不对但说不上来哪里不对"的饼图,真正改成能拿得出手的成品。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询