如何为补丁边缘修补边缘(使用色彩映射)?

时间:2017-07-13 14:37:21

标签: matlab plot matlab-figure colormap

我在图中有几个补丁(参见下面的最小工作示例)。目前,这些补丁的面颜色由FaceVertexCData确定,标量引用当前颜色条,边缘颜色由EdgeColor(RGB矢量)确定。我想要做的是删除面部颜色,并使边缘与其各自补丁的原始面部颜色相同。

使用FaceAlpha属性删除面部颜色很简单,但我似乎无法弄清楚如何将FaceVertexCData属性转换为等效的RGB代码,以便我可以分配它到EdgeColor

h.fig = figure;
h.patch(1) = patch([0 1 1 0],[0 0 .3 .3],10);
h.patch(2) = patch([0 1 1 0],[.5 .5 .9 .9],5);
set(h.patch, 'FaceAlpha', 0);

3 个答案:

答案 0 :(得分:2)

首先获取当前的colormap和colorbar

currentCmap = colormap; % get the current colormap
theColorbar = colorbar; % get the current colorbar

然后在colorbar中找到cdata值(可能有更好的方法)。

colorVertexList = linspace(theColorbar.Limits(1), theColorbar.Limits(2), size(currentCmap, 1));

要查找上面列表中色块颜色的索引,我只使用最小的差异,如下所示

[~, patch1ColorIndex] = min(abs(h.patch(1).FaceVertexCData-colorVertexList));
[~, patch2ColorIndex] = min(abs(h.patch(2).FaceVertexCData-colorVertexList));

然后你可以从colormap

获得rgb值
patch1Color = currentCmap(patch1ColorIndex, :);
patch2Color = currentCmap(patch2ColorIndex, :);

并设置颜色

set(h.patch, 'FaceAlpha', 0);
set(h.patch(1), 'EdgeColor', patch1Color);
set(h.patch(2), 'EdgeColor', patch2Color);

答案 1 :(得分:1)

对于未来的用户,我已经实现了Vahe Tshitoyan的解决方案。

@HOUR_NEW

这是我的最终代码:

function RGB = cdata2rgb(ax,val)
% CDATA2RGB convert cdata values to their corresponding RGB vector.
%   RGB = cdata2rgb(ax,val) converts the values in n-by-1 vector val to
%   an n-by-3 RGB matrix. Uses the colormap and colorbar associated with
%   axis handle ax. 
h.cmap = colormap(ax);

CDataList = linspace(ax.CLim(1), ax.CLim(2), size(h.cmap, 1));

[~, idx] = min(abs(val-CDataList),[],2); %Change to bsxfun if implicit expansion is not supported. 
RGB = h.cmap(idx,:);

end

答案 2 :(得分:1)

这是一种非常简单的边缘着色方法。如果您使color data与顶点数据相同(即XY参数),则可以将'EdgeColor' property设置为'flat',以便它使用色彩映射中的插值颜色值:

h.fig = figure;
h.patch(1) = patch([0 1 1 0], [0 0 .3 .3], 10.*ones(1, 4));
h.patch(2) = patch([0 1 1 0], [.5 .5 .9 .9], 5.*ones(1, 4));
set(h.patch, 'FaceColor', 'none', 'EdgeColor', 'flat');

enter image description here