我在图中有几个补丁(参见下面的最小工作示例)。目前,这些补丁的面颜色由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);
答案 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与顶点数据相同(即X
和Y
参数),则可以将'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');