Как отобразить темные края над светлыми на графиках Matlab? - PullRequest
3 голосов
/ 05 марта 2019

У меня есть следующий график 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 Ответ

3 голосов
/ 06 марта 2019

Порядок таблицы ребер в классе graph в MATLAB выглядит довольно сильно зависимым от положения в матрице смежности графа, который по своей сути невозможно создать таким образом, который гарантирует некоторый произвольный порядок ребер.Поэтому я думаю, что у вас есть только два варианта:

  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, который затем должен быть примененк свойствам ColorData и VertexData, чтобы изменить порядок ребер без каких-либо изменений:

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

Это может привести к переопределению при любом последующем перерисовке, а отсутствие функциональности без документов не дает никаких изменений.гарантирует, как он будет себя вести, но внешне он, кажется, делает то, что вы ищете.

...