Как визуализировать граф с узлами, разделенными на 2 кластера, ребра должны присутствовать между кластерами и внутри кластеров, используя python? - PullRequest
0 голосов
/ 08 марта 2020

Я хотел создать график, похожий на этот.

enter image description here

Но для моего кода я получаю график, подобный приведенному ниже

enter image description here

Я ввел следующий код, импортируя graphviz. Я прошу кого-нибудь помочь мне внести изменения в него, чтобы получить требуемый код.

from graphviz import Graph

g = Graph('G', filename='cluster.gv')
a=['1','2','3','4']
b=['5','6','7','8']

with g.subgraph(name='cluster_0') as c:
    c.attr(color='lightgrey')
    c.node_attr.update(style='filled', color='red')
    for i in a:
        c.node(str(i),shape='circle')
    c.attr(label='partition #1')

with g.subgraph(name='cluster_1') as c:
    c.attr(color='lightgrey')
    c.node_attr.update(style='filled', color='blue')
    for i in b:
        c.node(str(i),shape='circle')
    c.attr(label='partition #2')

g.edge('1','5')
g.edge('1','3')
g.edge('2','7')
g.edge('5','8')
g.view()

Заранее спасибо

1 Ответ

0 голосов
/ 10 марта 2020
  • Я не использую API Python, поэтому не знаю, поддержит ли он мое предложение.
  • «Подобное» - очень слабое требование.
  • Тем не менее:
    Graphviz позволяет вам явно устанавливать позиции узлов (см. Здесь https://graphviz.org/faq/#FaqDotWithNodeCoords). Если вам нужны коллекции овалов, которые объединяются в овал, вы можете сделать это. Обратите внимание, что значения 'pos' указаны в точках, а размеры узлов - в дюймах!

Эта программа:

digraph ovaltest {
 graph [splines=line]

  node [color=red shape=box style=rounded height=.2 width=.2  ]
   p1_1 [pos="70,95" ]
   p1_2 [pos="120,95" ]
   p1_3 [pos="170,95" ]
   p1_4 [pos="220,95" ]
   p2_1 [pos="70,70" ]
   p2_4 [pos="220,70" ]
   p3_1 [pos="70,45" ]
   p3_4 [pos="220,45" ]
   p4_1 [pos="70,20" ]
   p4_2 [pos="120,20" ]
   p4_3 [pos="170,20" ]
   p4_4 [pos="220,20" ]
  node [color=blue shape=box style=rounded height=.2 width=.2  ]
   q1_1 [pos="350,95" ]
   q1_2 [pos="400,95" ]
   q1_3 [pos="450,95" ]
   q2_1 [pos="350,70" ]
   q2_3 [pos="450,70" ]
   q3_1 [pos="350,45" ]
   q3_3 [pos="450,45" ]
   q4_1 [pos="350,20" ]
   q4_2 [pos="400,20" ]
   q4_3 [pos="450,20" ]

  p2_1 -> p3_4 [dir="none"]
  p2_4 -> q1_2 [dir="none"]
  p2_4 -> q3_3 [dir="none"]
  p4_4 -> q4_1 [dir="none"]
}

И эта командная строка:
neato - n -Tpng yourfile.gv> yourfile.png

создает этот график:

enter image description here

...