2012-02-09 11 views
7

Quiero usar graphviz para dibujar para un gráfico dado todas las camarillas máximas que tiene. Por lo tanto, me gustaría que los nodos en la misma camarilla máxima se encapsulen visualmente (lo que significa que me gustaría que un círculo grande los rodee). Sé que existe la opción de clúster, pero en todos los ejemplos que vi hasta ahora, cada nodo está en un solo clúster. En la situación de camarilla máxima, un nodo puede estar en varias camarillas. ¿Existe una opción para visualizar esto con graphviz? Si no, ¿hay alguna otra herramienta para esta tarea (preferiblemente con una api de python). Gracias.Graphviz - Camarillas maximas de dibujo

Respuesta

12

Tomar un té, que va a ser mucho :)

dibujo esto con networkx, pero las principales medidas se podrían transferir con facilidad al graphviz.

El plan es el siguiente:
a) encontrar camarillas máxima (por si acaso, la máxima camarillas no son necesarias las mayores camarillas);
b) dibuje el gráfico y recuerde las coordenadas de los vértices que se usaron dibujando programm;
c) tomar las coordenadas de la camarilla, calcular el centro y el radio de las ciruelas que la rodean;
d) dibuje los círculos y coloree las vértices de las camarillas del mismo color (para las vértices en la intersección de 2 y más maxclases no es posible).

Con respecto a c): Fui perezoso para entender el círculo apretado, pero tener algo de tiempo puede hacerse fácilmente. En su lugar, calculé el "círculo aproximado": tomé como radio la longitud del borde más largo de la camarilla y lo multipliqué por 1.3. En realidad, con este enfoque, algunos nodos pueden quedar fuera, ya que solo el cociente sqrt (3) garantiza que todos estén dentro. Sin embargo, tomar sqrt (3) hará que el círculo sea demasiado grande (una vez más, no está ajustado). Como centro, tomé el medio del borde más grande.

import networkx as nx 
from math import * 
import matplotlib.pylab as plt 
import itertools as it 

def draw_circle_around_clique(clique,coords): 
    dist=0 
    temp_dist=0 
    center=[0 for i in range(2)] 
    color=colors.next() 
    for a in clique: 
     for b in clique: 
      temp_dist=(coords[a][0]-coords[b][0])**2+(coords[a][1]-coords[b][2])**2 
      if temp_dist>dist: 
       dist=temp_dist 
       for i in range(2): 
        center[i]=(coords[a][i]+coords[b][i])/2 
    rad=dist**0.5/2 
    cir = plt.Circle((center[0],center[1]), radius=rad*1.3,fill=False,color=color,hatch=hatches.next()) 
    plt.gca().add_patch(cir) 
    plt.axis('scaled') 
    # return color of the circle, to use it as the color for vertices of the cliques 
    return color 

global colors, hatches 
colors=it.cycle('bgrcmyk')# blue, green, red, ... 
hatches=it.cycle('/\|-+*') 

# create a random graph 
G=nx.gnp_random_graph(n=7,p=0.6) 
# remember the coordinates of the vertices 
coords=nx.spring_layout(G) 

# remove "len(clique)>2" if you're interested in maxcliques with 2 edges 
cliques=[clique for clique in nx.find_cliques(G) if len(clique)>2] 

#draw the graph 
nx.draw(G,pos=coords) 
for clique in cliques: 
    print "Clique to appear: ",clique 
nx.draw_networkx_nodes(G,pos=coords,nodelist=clique,node_color=draw_circle_around_clique(clique,coords)) 

plt.show() 

Vamos a ver lo que obtenemos:

>> Clique to appear: [0, 5, 1, 2, 3, 6] 
>> Clique to appear: [0, 5, 4] 

Pico: Circled max cliques

Otro ejemplo con 3 maxcliques:

>> Clique to appear: [1, 4, 5] 
>> Clique to appear: [2, 5, 4] 
>> Clique to appear: [2, 5, 6] 

Circled max cliques

0

No creo que puedas hacer esto. Los clústeres se realizan a través de subgrafos, que se espera que sean gráficos separados, sin superposición con otros subgrafos.

Aunque puede cambiar la visualización; Si imagina que los miembros de una camarilla son miembros de algún conjunto S, entonces simplemente podría agregar un nodo S y agregar bordes dirigidos o discontinuos que vinculen cada miembro al nodo S. Si a los nodos S se les da una forma diferente, entonces debe quedar claro qué nodos están en qué camarillas.

Si realmente lo desea, puede dar a los bordes que conectan los miembros a los pesos altos de su nodo de cliqueta, lo que debería acercarlos en el gráfico.

Tenga en cuenta que nunca habrá bordes entre los nodos de la camarilla; eso indicaría que dos camarillas están conectadas al máximo, lo que simplemente implica que en realidad son una camarilla grande, no dos camarillas separadas.

0

Sería un poco difícil de implementar, pero aquí hay un ejemplo de cómo dibujar conjuntos superpuestos.

  • Riche, N.H .; Dwyer, T.;, "Desenredar diagramas de Euler", Transacciones IEEE en visualización y gráficos por computadora, vol.16, no.6, pp.1090-1099, nov.-dic. 2010 DOI:10.1109/TVCG.2010.210. PDF

enter image description here