饼图颜色

Pie Chart Color

如何创建两个不同颜色的饼图?
也就是说,我必须绘制 2 个不同的数据:

  1. 其中一个有星期一、星期二、星期三...(所有天)
  2. 而另一个有周一、周三和周日。

我希望图表 1 中的星期一和图表 2 中的星期一具有相同的颜色。星期三等也一样
星期二和其他没有出现在第二个图中的其他颜色的日子。可能吗?

使用:

figure
X = rand(5, 1);
X = X/sum(X);
p = pie(X, {'M', 'T', 'W', 'TH', 'F'});
figure
X2 = rand(5, 1);
X2(2) = 0; % remove Tuesday from the plot
X2 = X2/sum(X2);
p = pie(X2, {'M', 'T', 'W', 'TH', 'F'});

给出:

您应该使用底层 patch 对象的 CData 属性。 命令 p = pie(...) returns 图形对象数组,其中奇数索引包含每个饼图段的补丁,偶数索引包含文本标签。

默认情况下,每个补丁都有一个单一的纯色作为相对颜色索引(根据属性 CDataMapping)。我发现正确同步不同图表的唯一方法是将它们更改为 direct 颜色映射的索引。

labels = {'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'};
data = 1:7;

% Draw first pie chart
figure
p1 = pie(data, labels);
% Set its colors to use direct colormap indices
set(p1(1:2:end), 'CDataMapping', 'direct')
% Spread colors evenly (default colormap has 64 colors)
for ii = 1:numel(p1)/2
    p1(ii*2-1).CData = ceil((ii / (numel(p1)/2)) * 64);
end

% Select indices of segments from first chart for the second chart
p1_indices = [1 3 7];

% Draw second pie chart
figure
p2 = pie(data(p1_indices), labels(p1_indices));
% Set its colors to use direct colormap indices
set(p2(1:2:end), 'CDataMapping', 'direct')
% Use the selected colors from the previous chart
for ii = 1:numel(p2)/2
    p2(ii*2-1).CData = p1(p1_indices(ii)*2-1).CData;
end

一个小窍门是将要显示的日期的值设置为一个非常小的正值并使用空字符数组 或带有 space 个字符 作为标签的 char 数组。

可以使用realmin('double') or you can use eps返回MATLAB中的最小值,或者手动定义一个非常小的正值。

figure
X = rand(7,1);
X = X/sum(X);
subplot(1,2,1);
p = pie(X,{'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'});

subplot(1,2,2);
X2 = rand(7,1);
X2([2,4,5,6]) = realmin('double');  %<----- Notice this (setting very small values)
X2 = X2/sum(X2);                                
p = pie(X2,{'Mon', '', 'Wed', '', '', '', 'Sun'});
%Notice this -------^----------^---^---^   No label for Tue, Thur, Fri, Sat

给出:

当您使用包含零的数据创建饼图时,不会呈现该数据的关联切片,因此不会为当前颜色图分配颜色索引。 N 非零切片的颜色索引将从 1:N 跨越,因此它们是 scaled to the colormap limits(即 1 对应于颜色图中的第一个颜色,N 对应颜色图中的最后一种颜色)。

为确保切片着色的一致性,您可以更改 'CData' property of the slice patches 以重现在零切片仍然存在的情况下会使用的颜色索引值。这是一个小辅助函数中的代码,其中 datapie 的输入数据,而 handles 是由 pie:

返回的图形句柄数组
function recolor_pie(data, handles)
  if all(data > 0)
    return  % No changes needed
  end
  C = get(handles(1:2:end), 'CData');   % Get color data of patches
  N = cellfun(@numel, C);               % Number of points per patch
  C = mat2cell(repelem(find(data > 0), N), N);  % Replicate indices for new color data
  set(handles(1:2:end), {'CData'}, C);  % Update patch color data
end

这是一个显示其用法的示例:

% Plot first pie chart:
figure('Color', 'w');
subplot(1, 2, 1);
X = rand(5, 1);
X = X./sum(X);
p = pie(X, {'M', 'T', 'W', 'TH', 'F'});

% Plot second pie chart:
subplot(1, 2, 2);
X2 = rand(5, 1);
X2(2) = 0; % remove Tuesday from the plot
X2 = X2./sum(X2);
p = pie(X2, {'M', 'T', 'W', 'TH', 'F'});
recolor_pie(X2, p);

现在饼图之间的颜色是一致的。