Język grafów kropkowych - jak automatycznie tworzyć dwukierunkowe krawędzie?

83

Oto bardzo uproszczony przykład mojego wykresu kropkowego:

strict digraph graphName {
A->B
B->A
}

To tworzy tekst alternatywny

Zamiast tego chcę pokazać pojedynczą krawędź między A i B, ale z podwójną strzałką. Wiem, jak uzyskać podwójną strzałkę jako opcję globalną:

strict digraph graphName {
  edge [dir="both"]
A->B
B->A
}

Ale to wygląda bardzo brzydko i nie wszystkie moje krawędzie powinny być dwugłowe.

tekst alternatywny

Jeśli wykonam więcej przetwarzania wykresu i sam wykryję podwójne odniesienie i zastąpię dwie krawędzie jedną krawędzią, wygląda to dobrze. Ale wolałbym nie musieć robić tego dodatkowego kroku

strict digraph graphName {
A->B [dir="both"]
}

tekst alternatywny

Jakieś lepsze rozwiązania?

I82 Dużo
źródło

Odpowiedzi:

67

A co z „koncentratem = prawda” ?:

strict digraph graphName {
concentrate=true
A->B
B->A
}

z koncentratem = prawda

Z dokumentacji :

Jeśli tak, użyj koncentratorów brzegowych. Powoduje to scalenie wielu obszarów w jedną krawędź i powoduje, że częściowo równoległe krawędzie współdzielą część ich ścieżek. Ta ostatnia funkcja nie jest jeszcze dostępna poza kropką.

spędzony
źródło
Działa z etykietą dla mnie, a ja używam starszej wersji.
Aaron Hall
1
Jeśli to pomoże ... to nie zadziałało dla mnie, ponieważ zetknęło krawędzie, a na końcu umieściło tylko jedną strzałę. Potem spróbowałem „ścisłego digrafu” ... i wtedy działa idealnie.
philw
To głupie, ale właśnie tego chciał OP, tak wielki!
Dan Rosenstark
@philw U mnie też nie działa, dostaję krawędzie tylko z pojedynczym grotem. Używam pygraphviz i próbowałem pgv.AGraph(directed=True, strict=True), ale też nie działa, znowu mam dwie krawędzie ... Jakieś sugestie?
Tropilio
101

Powinieneś po prostu użyć:

A -> B [dir=both]
user2598811
źródło
4
To zaoszczędziło mi kilku zbędnych wierszy i używam go wraz z najlepszą odpowiedzią tam, gdzie to konieczne.
Aaron Hall
2
Nie potrzebujesz cytatów wokół „obu”
Yetti99,
@NoahSussman To nie może być zaakceptowana odpowiedź, ponieważ tak naprawdę nie odpowiada na pytanie;)
Dan Rosenstark