在Matlab图中如何在较亮的边缘上显示暗边缘?

时间:2019-03-05 19:40:23

标签: matlab plot graph matlab-figure

我有以下Matlab图表示一个图形。我想在较浅的颜色顶部显示较暗的颜色,这样较浅的边缘在穿过它们时不会改变较深的颜色。我该怎么办?

编辑:用于重现示例的Matlab代码如下

plot(G, 'XData', Xcoords, 'YData', Ycoords,'NodeLabel',{}, 'MarkerSize', 7,...
 'Linewidth',1.6, 'EdgeCData', G.Edges.Weight)
  colormap(flipud(gray(40)));
  colorbar('southoutside');
  caxis([min(G.Edges.Weight) max(G.Edges.Weight)])
 axis off

其中边缘的权重以G.Edges.Weight

编码

要再现效果(使用较小的图形),可以尝试以下代码:

A= zeros(4,4);
A(1,[2 3 4])=1;
A(2,4)=0.04;
A(2,[1 3])=1;
A(3,[2 1 4])=1; 
A(4,2)=0.04;
A(4,[3 1])=1;

Xcoords=[1 2 2 1]';
Ycoords= [1 1 2 2 ]';

G= graph(A);% base toolbox

figure()
plot(G, 'XData', Xcoords, 'YData', Ycoords, 'NodeLabel',{}, 'MarkerSize', 7,...
    'LineWidth', 3.8, 'EdgeCdata', G.Edges.Weight)
colormap(flipud(gray(40)));
colorbar('southoutside'); caxis([0 1]);
axis off

似乎是边缘的顺序决定了谁在顶部。例如,如果权重0.04分配给另一个交叉边缘(A(1,3)= A(3,1)),则由于边缘A(2,4)= A(4,2)而看不到效果来了。 Graph

1 个答案:

答案 0 :(得分:3)

MATLAB的graph类中边缘表的顺序似乎紧密地依赖于图形邻接矩阵中的位置,这本质上不可能以保证某些任意边缘顺序的方式进行设计。所以我认为您只有两种选择:

  1. 编写自己的图形绘制例程;那么您可以根据自己的喜好控制打印顺序,因为这是您自己的软件设计。
  2. 使用它创建的未记录的原语来操纵MATLAB的图形绘制输出。

第二种选择是可能的,注意绘制的GraphPlot对象在其LineStrip中有一个NodeChildren对象,该对象负责绘制所有相关的边。由于您使用的是灰度色图,因此仅需要了解此对象中的RGB数据,即可弄清楚如何对其顶点进行排序才能获得正确的打印顺序。

首先,将绘制的结果存储在P中,并将EdgeAlpha设置为1,以便绘制图形。

  

这样,较亮的边缘在穿过时不会改变较暗的颜色

P = plot(G, 'XData', Xcoords, 'YData', Ycoords, 'NodeLabel',{}, 'MarkerSize', 7,...
    'LineWidth', 3.8, 'EdgeCdata', G.Edges.Weight, 'EdgeAlpha',1);
colormap(flipud(gray(40)));
colorbar('southoutside'); caxis([0 1]);
axis off

然后找到在绘制过程中创建的LineStrip

drawnow
s = P.NodeChildren(arrayfun(@(o) isa(o,'matlab.graphics.primitive.world.LineStrip'), P.NodeChildren));

然后可以从s确定ColorData中顶点的新顺序,然后必须将其同时应用于ColorDataVertexData属性,以重新排序边缘没有其他变化:

[~,idx] = sortrows(s.ColorData','desc');
set(s, 'VertexData',s.VertexData(:,idx),  'ColorData',s.ColorData(:,idx));

这很可能会被任何进一步的重绘所覆盖,并且未记录的功能并不能保证它的行为-但从表面上看,它似乎可以满足您的要求。