web-dev-qa-db-fra.com

Comment visualiser la matrice de corrélation comme une schemaball dans Matlab

J'ai 42 variables et j'ai calculé la matrice de corrélation pour elles dans Matlab. Maintenant, je voudrais le visualiser avec une schemaball. Quelqu'un a-t-il des suggestions/expériences sur la façon dont cela pourrait être fait dans Matlab? Les images suivantes expliqueront mieux mon propos:

SCHEMABALL

enter image description here

Dans les images, chaque parabole entre les variables signifierait la force de la corrélation entre elles. Plus la ligne est épaisse, plus il y a de corrélation. Je préfère le style de l'image 1 plus que le style de l'image 2 où j'ai utilisé différentes couleurs pour mettre en évidence la force de la corrélation.

42
jjepsuomi

Un peu fini, je suppose .. le code peut être trouvé ici sur github . La documentation est incluse dans le fichier.

La couleur jaune/magenta (pour une corrélation positive/négative) est configurable, ainsi que la taille de la police des étiquettes et les angles sous lesquels les étiquettes sont tracées, de sorte que vous pouvez obtenir de la fantaisie si vous le souhaitez et ne pas les distribuer uniformément le long du périmètre/regrouper certains/...

Si vous souhaitez réellement imprimer ces graphiques ou les utiliser en dehors de matlab, je vous suggère d'utiliser des formats vectoriels (par exemple eps). Il est également ennuyeux que le texte soit redimensionné lorsque vous effectuez un zoom avant/arrière, mais je ne connais aucun moyen de résoudre ce problème sans pirater la fonction de zoom: /

schemaball % demo

enter image description here

schemaball(arrayfun(@num2str,1:10,'uni',false), Rand(10).^8,11,[0.1587 0.8750],[0.8333 1],2*pi*sin(linspace(0,pi/2-pi/20,10)))

enter image description here

schemaball(arrayfun(@num2str,1:50,'uni',false), Rand(50).^50,9)

enter image description here

24
Gunther Struyf

J'ai terminé et soumis ma version au FEX: schemaball et je mettrai à jour le lien dès que possible.

Il y a quelques différences avec la contribution de Gunther Struyf :

  1. Vous pouvez renvoyer les poignées à l'objet graphique pour une personnalisation manuelle complète
  2. Les étiquettes sont orientées pour permettre une lisibilité maximale de gauche à droite
  3. La figure s'étire pour s'adapter aux étiquettes, laissant les axes inchangés
  4. La syntaxe nécessite uniquement une matrice de corrélations (mais autorise des entrées facultatives)
  5. Optimisé pour les performances.

Suivez des exemples de démo, d'étiquettes personnalisées et de personnalisation créative. Remarque: le premier chiffre a été exporté avec saveas() , tous les autres avec export_fig .

schemaball

enter image description hereenter image description here

x      = Rand(10).^3;
x(:,3) = 1.3*mean(x,2);
schemaball(x, {'Hi','how','is','your','day?', 'Do','you','like','schemaballs?','NO!!'})

enter image description here

h = schemaball;
set(h.l(~isnan(h.l)), 'LineWidth',1.2)
set(h.s, 'MarkerEdgeColor','red','LineWidth',2,'SizeData',100)
set(h.t, 'EdgeColor','white','LineWidth',1)

enter image description here

La palette de couleurs par défaut:

enter image description here

Pour améliorer le rendu à l'écran , vous pouvez lancer MATLAB avec l'expérimental -hgVersion 2 commutateur qui produit des graphiques anti/alias par défaut maintenant (source: mise à jour HG2 | Matlab non documenté ). Cependant, si vous essayez d'enregistrer la figure, le fichier aura l'ancien rendu anti-aliasé habituel, alors voici une image d'écran d'impression du schéma de Gunther:

enter image description here

24
Oleg

Mise à jour importante:

Vous pouvez le faire dans Matlab maintenant avec la soumission FileExchange:

http://www.mathworks.com/matlabcentral/fileexchange/48576-circulargraph

Il y a un exemple de Matlab ici:

http://uk.mathworks.com/examples/matlab/3859-circular-graph-examples

Ce qui donne ce genre de belles parcelles:

enter image description here

enter image description here

5
Ander Biguri

Par coïncidence, Cleve Moler (mathématicien en chef de MathWorks) a montré un exemple de ce type d'intrigue sur son plus récent article de blog (pas aussi beau que ceux de votre exemple, et les lignes de connexion sont droites plutôt que parabolique, mais il semble fonctionnel). Malheureusement, il n'a pas inclus le code directement, mais si vous lui laissez un commentaire sur le post, il est généralement très disposé à partager des choses.

Ce qui pourrait être encore plus agréable pour vous, c'est qu'il applique également (et cette fois inclut) du code pour permuter les lignes/colonnes du tableau afin de maximiser la proximité spatiale des nœuds hautement connectés, plutôt que de les ordonner au hasard sur la circonférence. Vous vous retrouvez avec une enveloppe en forme de "croissant" de lignes de connexion, le bit épais du croissant représentant les nœuds les plus connectés.

Malheureusement cependant, je soupçonne que si vous avez besoin d'améliorer son code pour obtenir les lignes très étroites et à haute résolution dans vos tracés d'exemple, les graphiques actuellement non anti-aliasés de MATLAB ne sont pas encore à la hauteur.

3
Sam Roberts

J'ai récemment expérimenté des données MATLAB et la bibliothèque de visualisation D pour des graphiques similaires - il existe plusieurs types de visualisations circulaires qui pourraient vous intéresser et beaucoup d'entre elles sont interactives. Circos est une autre option utile, bien cuite et disponible gratuitement, qui est probablement responsable de la plupart des plus belles versions de ces graphiques que vous avez vues dans la presse populaire.

2
MSommer