2010-02-17 8 views
18

J'ai la perfection de la paralysie quand il s'agit de produire quelque chose de graphique. Si les symétries du visuel n'ont pas été complètement explorées, j'ai du mal à comprendre ce qui se passe. Je suis aussi un apprenant très visuel, et j'AIME simplifier les choses que je viens d'apprendre et les dessiner sur papier.Amélioration de la mise en page graphviz

Graphviz est un bon outil pour dessiner automatiquement, mais il pourrait être mieux. Commençons par un exemple d'un bon graphique) une machine d'état plutôt). Peu importe la qualité (il peut être redessiné avec un meilleur outil) celui-ci est presque parfait, sauf que je le tournerais dans le sens anti-horaire de 45 degrés pour rendre la symétrie apparente. Cela devrait prendre moins de temps au lecteur pour comprendre comment les états q1 et q2 sont similaires et comment ils diffèrent. Je soutiens qu'il existe un moyen unique de représenter ce diagramme, étant donné qu'il n'y a pas d'autres éléments graphiques à côté.

http://gallery.hd.org/_exhibits/maths/math-finite-state-machine-DHD.gif http://gallery.hd.org/_exhibits/maths/math-finite-state-machine-DHD.gif

Maintenant, regardons une description très parfaite:

http://linux.softpedia.com/screenshots/Graphviz_1.png http://linux.softpedia.com/screenshots/Graphviz_1.png

Cela ressemble à quelque chose d'un graphviz générerait. Oui, les bords sont lisses mais GAAAAWWWD c'est déroutant! Il ressemble à une carte mentale, pas un diagramme fini prêt à la consommation. Je crois que les yeux humains CRAVENT (pas moins) la symétrie. Oui, la hiérarchie, etc. sont également des facteurs importants.

Je suis surpris qu'il n'y ait pas de meilleurs algorithmes disponibles. Certaines personnes ne sont pas des apprenants visuels du tout; ils peuvent saisir des concepts abstraits en lisant des symboles. Pas moi!

Alors, quelle est ma question? Eh bien, existe-t-il de meilleurs logiciels libres pour dessiner des graphiques de petite à moyenne taille? Peut-être

Merci! Faites-moi savoir comment je peux améliorer ce post.

P.S. J'ai pris 10 minutes pour dessiner un clone assez semblable à dia. Ce n'est toujours pas parfait, mais c'était pratique à faire car tout s'aligne sur la grille (et j'ai manqué quelques petits détails mais je n'ai pas envie de re-télécharger). Le LR_0 a besoin d'un "Start --->" venant d'en haut pour permettre à l'utilisateur de saisir l'état de départ plus tôt.

Finate State Machine http://i47.tinypic.com/315e6w6.png

+3

Pouvez-vous définir ce qu'est la « beauté » est en termes de code? Vous êtes surpris qu'il n'y ait pas de meilleurs algorithmes, mais "mieux" n'est pas exactement défini quand il s'agit de créer des graphes arbitraires :) Il semble que vous ayez besoin de symétrie, mais vous admettez que d'autres pourraient préférer la hiérarchie , etc. –

+0

grahpviz a beaucoup d'options pour changer la disposition, les lignes, etc. (bien qu'il soit pratiquement impossible de comprendre à partir de sa documentation comment les choses fonctionnent). Vous pourriez, par exemple, essayez d'ajouter 'rankdir = LR;' au graphique pour changer la disposition – nos

+0

Dans le premier graphique, 'LR_2' se connecte aussi' LR_5' avec 'SS (a)', tandis que dans le second graphique il se connecte à un autre noeud appelé ' LR_2' avec 'S (A)'. – MERose

Répondre

21

Après plusieurs tentatives de dessin de votre graphique et de ne pas obtenir une mise en page que vous jugez « meilleur », vous a posé la question ici: est là « [b] le logiciel Etter gratuit [pour] dessin petit à graphiques intermédiaires." Le seul critère que vous avez donné pour évaluer les algorithmes de mise en page est de savoir comment ils se rapprochent de la" meilleure façon de représenter ce diagramme "." Best "bien sûr, à vous de décider

Cela revient plus ou moins à tenter de résoudre un problème en utilisant un langage de programmation donné, en échouant, puis en demandant un meilleur langage de programmation

Au cœur des algorithmes de dessin de graphes se trouvent des routines d'optimisation qui génèrent des solutions d'évaluation («solution» désigne ici les coordonnées de chaque nœud qui, ensemble, forment une disposition.) Ces solutions sont évaluées en fonction de la minimisation d'un seul critère ou d'une série de critères classés - c.-à-d., la minimisation d'un ou plusieurs ibutes du graphe - par exemple, le nombre total d'arêtes qui se croisent, ou la somme des distances entre noeuds (ou la combinaison des deux, ou une combinaison pondérée de ces deux), ou la proximité d'une configuration symétrique. Graphviz est composé de six algorithmes de mise en page différents (dot neato, fdp, sfdp, twopi et circo). Parmi ceux-ci, il semble que vous n'utilisiez que des points; cependant, twopi et circo auraient pu être de meilleures options étant donné leurs contraintes strictes de symétrie qui semblent correspondre à votre propre idée d'un graphique correctement tracé. Deuxièmement, le texte de votre question est dirigé vers les «graphiques» et le dessin graphique. Après avoir lu votre description complète, je ne pense pas que votre question ait quelque chose à voir avec l'un ou l'autre concept. Au-delà des algorithmes de graphes généraux (comme graphviz), il existe un certain nombre d'algorithmes de mise en page spécifiques au domaine, par exemple les diagrammes de Hasse (pour représenter des ensembles partiellement ordonnés dans la théorie des ordres), les graphes de Barabasi-Albert réseaux), et Erdos-Renyi (graphiques aléatoires). Chacun de ces algorithmes produit une disposition de graphique basée sur des critères et des contraintes fournis par le domaine - ceci devrait vous indiquer qu'il n'y a pas une seule "meilleure" disposition dans tous les domaines. Bien que vous ayez utilisé le terme «graphique» dans votre question, votre description indique que votre problème concerne le dessin de machines à états - un type de graphique très idiosyncratique. Les algorithmes généraux de dessin de graphe sont souvent pauvres pour dessiner des graphiques spécialisés de ce genre parce que l'algorithme ne sait rien au sujet de domaine. En fait, je ne connais pas d'algorithme de mise en page pour les diagrammes d'état - tout comme il n'y en a pas pour les diagrammes de flux (pas les mêmes, mais similaires). Au niveau du workflow, vous pouvez dessiner le graphique dans graphviz puis l'importer dans Omnigraffle pour un réglage précis - dans Omnigraffle, vous aurez un contrôle précis sur les emplacements de nœuds et de bords.

3

Il y a un certain nombre d'options que je connaisse:

  • Prefuse - Ils ont un older Java version. La nouvelle version est en Flash et a de belles mises en page. Son appelé Prefuse Flare. Le demo page illustre certaines de ses capacités de mise en page. JUNG comprend un certain nombre d'options de mise en page, ainsi que ses puissantes fonctions d'analyse graphique. Il y a quelques exemples here.
  • Networkx inclut également de nombreuses fonctionnalités de mise en page. Certains d'entre eux sont répertoriés here.
+1

Les mises en page de NetworkX dépendent principalement de Graphviz. – gotgenes

3

Certains logiciels permettent aux utilisateurs de modifier les algorithmes de mise en page en temps réel, à condition de déplacer les nœuds avec la souris. Cette approche peut grandement vous aider pour les graphiques plus volumineux. Je connais surtout Gephi (disclamer: je suis un dev).

1

TikZ génère beautiful graph layouts. Vous pouvez utiliser une mise en page manuelle qui vous permet de spécifier le minimum de conseils, ou vous pouvez demander une mise en page automatique. Les valeurs par défaut sont bonnes, et les crochets existent pour être ajustés à la perfection.

Avec la mise en page semi-manuelle, vous ne devez pas déclarer tous les détails, parce que vous pouvez

  • noeuds comme déclaration des « ci-dessus », « en bas à droite de », etc. par rapport aux autres noeuds .
  • placez vos noeuds sur un raster en les entrant en tant que matrice: très pratique si vous voulez laisser certaines positions vides.
  • spécifier facilement dans ce que les bords de direction doivent entrer, sortir, plier, ou prendre les virages

Pour la mise en page automatique, la bibliothèque de TikZ graphdrawing a quelques pretty slick algorithms.

Voici un exemple de mise en page manuelle et le code TeX utilisé pour l'obtenir:

example graph

\usepackage{pgf} 
\usepackage{tikz} 
\usetikzlibrary{arrows,automata} 
\usepackage[latin1]{inputenc} 
\begin{document} 
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm, 
        semithick] 
    \tikzstyle{every state}=[fill=red,draw=none,text=white] 

    \node[initial,state] (A)     {$q_a$}; 
    \node[state]   (B) [above right of=A] {$q_b$}; 
    \node[state]   (D) [below right of=A] {$q_d$}; 
    \node[state]   (C) [below right of=B] {$q_c$}; 
    \node[state]   (E) [below of=D]  {$q_e$}; 

    \path (A) edge    node {0,1,L} (B) 
      edge    node {1,1,R} (C) 
     (B) edge [loop above] node {1,1,L} (B) 
      edge    node {0,1,L} (C) 
     (C) edge    node {0,1,L} (D) 
      edge [bend left] node {1,0,R} (E) 
     (D) edge [loop below] node {1,1,R} (D) 
      edge    node {0,1,R} (A) 
     (E) edge [bend left] node {1,0,R} (A); 
\end{tikzpicture} 
\end{document}