我有以下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)而看不到效果来了。
答案 0 :(得分:3)
MATLAB的graph
类中边缘表的顺序似乎紧密地依赖于图形邻接矩阵中的位置,这本质上不可能以保证某些任意边缘顺序的方式进行设计。所以我认为您只有两种选择:
第二种选择是可能的,注意绘制的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
中顶点的新顺序,然后必须将其同时应用于ColorData
和VertexData
属性,以重新排序边缘没有其他变化:
[~,idx] = sortrows(s.ColorData','desc');
set(s, 'VertexData',s.VertexData(:,idx), 'ColorData',s.ColorData(:,idx));
这很可能会被任何进一步的重绘所覆盖,并且未记录的功能并不能保证它的行为-但从表面上看,它似乎可以满足您的要求。