Saltar al contenido

Dibujar una red de nodos en formación circular con enlaces entre nodos

Te recomendamos que pruebes esta solución en un ambiente controlado antes de enviarlo a producción, saludos.

Solución:

Aquí hay una forma en que puedes hacer lo que quieras. Primero, genera puntos en el círculo que te interesa

clear;
theta=linspace(0,2*pi,31);theta=theta(1:end-1);
[x,y]=pol2cart(theta,1);

A continuación, si conoce los pares de nodos que están conectados, puede omitir este paso. Pero en muchos casos, obtiene una matriz de conectividad de otros cálculos y encuentra los índices de los nodos conectados a partir de eso. Aquí, he creado una matriz booleana de conexiones. Entonces, si hay N nodos, la matriz de conectividad es una NxN matriz simétrica, donde si la i,jel elemento es 1, significa que tienes una conexión desde el nodo i al nodo j y 0 de lo contrario. Luego puede extraer los subíndices de los pares distintos de cero para obtener conexiones de nodo (solo se necesita el triángulo superior).

links=triu(round(rand(length(theta))));%# this is a random list of connections
[ind1,ind2]=ind2sub(size(links),find(links(:)));

Esta es la matriz de conectividad que generé con el código anterior.

ingrese la descripción de la imagen aquí

Ahora solo necesitamos trazar las conexiones, una a la vez.

h=figure(1);clf(h);
plot(x,y,'.k','markersize',20);hold on
arrayfun(@(p,q)line([x(p),x(q)],[y(p),y(q)]),ind1,ind2);
axis equal off

lo que le dará una figura similar a sus ejemplos

ingrese la descripción de la imagen aquí

Inspirándose en la última publicación de blog de Cleve Moler, también puede utilizar el gplot función para dibujar un gráfico dada una matriz de adyacencia y coordenadas de nodo.

Aquí hay un ejemplo usando bucky; una función de demostración de MATLAB que genera el gráfico de un icosaedro truncado (parece un balón de fútbol). Solo usaremos su matriz de adyacencia para este ejemplo ya que estamos colocando los vértices en forma circular:

%# 60-by-60 sparse adjacency matrix
A = bucky();
N = length(A);

%# x/y coordinates of nodes in a circular layout
r =  1;
theta = linspace(0,2*pi,N+1)'; theta(end) = [];
xy = r .* [cos(theta) sin(theta)];

%# labels of nodes
txt = cellstr(num2str((1:N)','%02d'));

%# show nodes and edges
line(xy(:,1), xy(:,2), 'LineStyle','none', ...
    'Marker','.', 'MarkerSize',15, 'Color','g')
hold on
gplot(A, xy, 'b-')
axis([-1 1 -1 1]); axis equal off
hold off

%# show node labels
h = text(xy(:,1).*1.05, xy(:,2).*1.05, txt, 'FontSize',8);
set(h, 'Rotation',num2cell(theta*180/pi))

gráfico_circular


Podemos llevar esto un paso más allá y tratar de minimizar los cruces de bordes. Es decir, queremos reorganizar los nodos para que los bordes estén lo más cerca posible de la circunferencia del círculo.

Esto se puede hacer encontrando una permutación simétrica de la matriz que minimice su ancho de banda (los valores distintos de cero están más cerca de la diagonal)

matriz_permutación

p = symrcm(A);
A = A(p,p);
txt = txt(p);

El resultado en este caso:

circular_graph_permutation

Otras mejoras incluyen el reemplazo de líneas rectas con splines curvos para dibujar los bordes (de esa manera obtiene un gráfico más bonito similar al segundo que ha mostrado), o el uso de diferentes colores para mostrar grupos de vértices y sus bordes (obviamente, necesita hacer agrupamiento de gráficos). Te dejo esos pasos a ti 🙂

Te mostramos comentarios y valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *