Visualisation des hiérarchies définies sous forme de graphiques codés par couleur

Je lisais pas mal de choses sur les bibliothèques de graphes pour Java et Javascript récemment, mais je n’ai pas trouvé le moyen de faire ce que je veux.

J’ai essentiellement une hiérarchie d’ensembles en ce qui concerne un groupe d’éléments (jusqu’à plusieurs milliers). Ces ensembles peuvent se chevaucher complètement ou partiellement, se couvrir complètement ou être complètement disjoints les uns des autres. Ce que je voudrais faire, c’est afficher les informations suivantes:

  • La taille d’un ensemble (par rapport aux autres ensembles)
  • Une valeur “thermique” (en code de couleur) d’un ensemble calculée à partir des éléments qu’il couvre
  • La topologie complète des ensembles dans un seul graphique (afin que les chevauchements, les intersections, etc., soient affichés pour l’utilisateur)

Edit: Peut être devrais-je donner un exemple de ce que je veux dire par ensembles, éléments et hiérarchies se chevauchant partiellement. Ce qui suit est une version simplifiée du type de jeux que je traite (notez que les chiffres 1 10 et les lettres a h et X représentent des éléments comparables entre eux):

 Set1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11} Set2 = {1, 2, 3, 4, 5, 6} Set3 = {1, 2, 3} Set4 = {1, 4, 5, 6, 7} Set5 = {a, b, c, d, e, f, g, h} Set6 = {a, b, c, d, e} Set7 = {a, b, c, 7} Set8 = {2, 4, 7, 8, c, f} Set9 = {X} 

Je ne suis pas sûr de savoir comment afficher ces informations de manière intuitive. J’ai vu des graphes de Voronoï¹ , ² que j’aime beaucoup visuellement, mais ils ont un fond mathématique différent, je ne pense donc pas que je serai capable de représenter correctement les hiérarchies que j’ai. Je souhaite créer ces graphiques en cours d’exécution (dans le cas de Java) ou en utilisant Javascript dans le cas d’un déploiement HTML, cela va parfaitement. Une contrainte, toutefois, est que les graphiques doivent être créés ou exportables au format vectoriel haute résolution.

Mes questions en bref:

  1. Existe-t-il un bon moyen de visualiser le type de données que j’ai? Si tel est le cas, existe-t-il sous une forme facilement implémentée (une bibliothèque)?
  2. S’il n’y a pas de solution facile au problème, c’est-à-dire si j’ai besoin d’inventer ma roue dans ce cas, comment puis-je créer moi-même un graphique? Quel est un bon sharepoint départ? À quoi est-ce que je fais plus attention?

Merci!

Edit: Je pensais que l’idée potentielle était de disposer tous les éléments de l’ensemble universel sous forme de grid hexagonale avec la superposition de couleurs souhaitée, puis de tracer les limites des ensembles. Cette idée pose toutefois plusieurs problèmes, notamment celui de la désignation des emplacements des éléments, de sorte que les ensembles ne soient pas répartis dans l’ensemble du graphique. Des commentaires / suggestions?

Oui, c’est un problème assez bien étudié. Ce que vous décrivez s’appelle un hypergraphe . Chaque élément peut être représenté sous la forme d’un sumt dans un graphique et les ensembles sont les hypergères. Le problème devient alors celui de la visualisation des hypergraphes.

entrer la description de l'image ici

Malheureusement, il n’ya pas de solution parfaite et généralisée, car même les graphiques les plus simples peuvent avoir des visualisations complexes.

Si vos jeux sont relativement petits (<5 éléments), vous pouvez utiliser une bibliothèque de dessin de graphes classique telle que graphviz . Pour ce faire, connectez simplement toutes les paires de sommets de chaque ensemble et colorez-les différemment. Cela donnera une solution semblable à ceci:

entrer la description de l'image ici

Avez-vous considéré une grid à deux dimensions:

  • Placez le numéro défini sur un axe
  • Mettez les éléments uniques trouvés dans tous les ensembles sur l’autre axe
  • Colorez chaque cellule où un élément se trouve dans un ensemble (en regardant les étiquettes de cette ligne et de la colonne)

Bien que cette méthode de visualisation soit normalement inférieure à certaines des plus compliquées mentionnées jusqu’à présent, elle a le mérite d’ être réellement possible lorsque vous avez des milliers d’éléments et des milliers d’ensembles.

L’astuce consiste à classer les lignes et les colonnes de manière à rassembler le plus d’informations de manière utile pour l’utilisateur. Mon instinct dit que le problème que vous essayez de résoudre est de faire en sorte que les cellules colorées soient aussi “bleues” que possible – si chaque ensemble de cellules colorées adjacentes est appelé une “zone”, pour avoir le moins de zones distinctes et les avoir le moins de trous.

C’est un problème très compliqué en soi, mais qui pourrait être au moins partiellement résolu en établissant des facteurs de contiguïté pour chaque ensemble par rapport à tous les autres. Ce que vous recherchez, ce sont des “îlots” de proximité. Commencez donc par les paires d’ensembles les plus similaires, ajoutez-les au graphique et considérez-les comme une région. Recalculez vos numéros de proximité avec la région remplaçant la paire qu’elle contient (moyenne d’une manière?). Recherchez la paire d’éléments la plus proche suivante (chaque élément étant une région ou un ensemble) et, si cette paire se trouve à un certain seuil de proximité par rapport à une région existante du graphique, attachez-la à un côté de cette région. , région distincte (en supprimant à nouveau les valeurs de proximité de la paire et en effectuant un nouveau calcul pour la région elle-même). Finalement, tous les ensembles seront ajoutés aux régions et toutes les régions seront jointes. La jonction de deux régions peut avoir quatre possibilités (le retournement peut être nécessaire), de sorte que les côtés à joindre au graphique pourraient être calculés par la proximité des ensembles sur les 4 bords des deux régions.

Bien que cela puisse ne jamais donner la configuration optimale, il devrait arriver quelque chose qui a peu de régions par rapport à une dissortingbution aléatoire.

Enfin, une réorganisation dynamic pourrait être utile, en permettant à l’utilisateur de sélectionner un ensemble ou un élément intéressant, et de l’utiliser comme graine pour un graphe complètement réarrangé, en calculant chaque addition en fonction de la proximité de cet élément (puis de la région combinée). avec un autre élément), plutôt que la proximité globale la plus faible.

Voici un diagramme du résultat, ayant effectué le processus logique ci-dessus sur l’exemple de données dans votre question:

Ensembles et éléments

Décider comment commander les colonnes est complexe, mais en gros, vous pouvez obtenir des résultats raisonnables en déplaçant les colonnes pour qu’elles soient adjacentes lorsqu’un tel mouvement ne perturbe pas la zone de blocs colorés des segments déjà ajoutés.

Pensées supplémentaires:

  • Le calcul de la proximité d’un ensemble ne dépend pas seulement du nombre d’éléments communs, mais également du nombre d’éléments non communs. Si deux paires d’ensembles ont 3 éléments en commun entre les paires, mais que l’une possède 5 éléments non partagés et l’autre 3 éléments non partagés, la paire avec 3 éléments non partagés est plus proche que l’autre.
  • Après avoir ajouté un ensemble au graphique, il est possible de réorganiser les éléments. Emstackr les éléments le plus à gauche possible est un bon début pour le premier placement. Après cela, emstackr les éléments les plus courants à gauche semble bon. Après ça, ça tombe en panne. Je me demande si le fait de placer les cellules colorées aussi près que possible de la diagonale (de haut en bas à droite) serait également un algorithme utile – cela me rappelle un peu la masortingce de structure de conception, même si elle ne montre que des dépendances à un sens plutôt que deux. relations de manière.
  • Lorsqu’un blob de couleur est constitué d’ensembles qui sont complètement disjoints de tous les autres ensembles (comme l’ensemble contenant X dans votre exemple), il peut être déplacé vers un graphique séparé.

Il existe de nombreuses approches à ce problème, mais personnellement, je tirerais une sorte de graphique de Venn en utilisant SVG généré de manière dynamic avec un outil tel que Raphael JS et le colorierais comme je le voulais. En outre, Raphael a api comme Set qui peut vous permettre de donner des informations détaillées sur les éléments et leurs relations. Le convertisseur SVG en code vous aidera également à comprendre comment vous pouvez générer les éléments SVG.

Vous pouvez également utiliser des outils tels que les diagrammes de Venn :

Exemple de graphique de Venn

ce qui semble être facilement adaptable à ce scénario. Il y a aussi Flotr2 qui peut créer des graphiques à bulles:

Diagramme à bulles

ou même Canvas Express .

Canvas Xpress Diagrams

Un peu plus de peaufinage avec l’un des derniers outils vous permettra de le faire correctement …

Je n’ai pas votre solution pour obtenir les données dans le bon format. Jetez un oeil à ce plugin javascript créé par MIT pour la construction de graphes, sigmajs . N’a pas regardé les données qu’il accepte, mais peut valoir le coup d’oeil.