matlab - 如何在 Matlab 绘图中显示较浅边缘的深色边缘?

标签 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

最佳答案

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

  1. 编写您自己的绘图例程;然后您可以随心所欲地控制绘图顺序,因为这是您自己的软件设计。
  2. 使用 MATLAB 创建的未记录的基元来操纵 MATLAB 的图形绘制输出。

第二个选项是可行的,注意绘制的 GraphPlot 对象在其 NodeChildren 中有一个 LineStrip 对象,它负责绘制所有相关的边缘。因为您使用的是灰度颜色贴图,所以您只需要此对象中的 RGB 数据即可确定其顶点需要如何排序以获得正确的绘图顺序。

首先,将绘制的结果存储在P中,并将EdgeAlpha设置为1,这样图形就绘制好了

in such a way the lighter edges don't modify the darker when crossing them

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));

然后可以根据其 ColorData 确定 s 中顶点的新顺序,然后必须将其应用于 ColorDataVertexData 属性来重新排序边缘而不改变任何其他内容:

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

这可能会被发生的任何进一步重绘所覆盖,并且作为未记录的功能无法保证其行为方式 - 但从表面上看它似乎可以满足您的需求。

关于matlab - 如何在 Matlab 绘图中显示较浅边缘的深色边缘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55010337/

相关文章:

python - MATLAB/Octave corr 和 Python numpy.correlate 有什么区别?

matlab - 是否有等同于 python 的 "for in"循环的 Matlab 循环?

r - 在 R 中绘制有向多重图

python - matplotlib:一张图上的多个图

r - 绘图上的点无法在纸上正确打印

matlab - 如何更改 trisurf 图的颜色图以更好地区分正值/负值

image - 傅立叶移位定理matlab

python - 如何更改 Python 的 GNUPlot 中的 x 区间标签?

javascript - 连接点而不交叉线

java - 在 Java 中从节点创建边