2 votes

Positionnement incorrect lors du tracé de la matrice d'adjacence - R ggplot

Je veux tracer la matrice d'adjacence d'un graphique comme un échiquier (noir pour les 1, blanc pour les 0, ou vice versa).

     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    1    0    0    0    0
[3,]    1    0    0    0    0
[4,]    1    0    0    0    0
[5,]    1    0    0    0    0

En utilisant le code suivant :

require(igraph)
require(ggplot2)
require(reshape2)

g <- make_star(5)
gAdjMatrix <- as.matrix(as_adj(g))

print(gAdjMatrix)

logMatrix <- (gAdjMatrix == 1)
logMatrix

mm <- logMatrix

mm %>% 
  melt() %>% 
  ggplot(aes(Var2, Var1)) + 
  geom_tile(aes(fill = value, 
                color = value)) + 
  coord_equal() + 
  scale_fill_manual(values = c("black", "white")) + 
  scale_color_manual(values = c("white", "black")) + 
  theme_bw() +
  theme(axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.grid = element_blank()) + 
  guides(fill = FALSE, color = FALSE) + 
  scale_x_discrete(expand = c(0,0)) + 
  scale_y_discrete(expand = c(0,0))

J'obtiens ce résultat :

enter image description here

Pourquoi ?

5voto

Z.Lin Points 9668

Le code suivant devrait renvoyer ce que vous recherchez :

mm %>% 
  melt() %>% 
  ggplot(aes(Var2, Var1)) + 
  geom_tile(aes(fill = value, 
                color = value)) + 
  coord_equal() + 
  scale_fill_manual(values = c("TRUE" = "black", "FALSE" = "white")) + 
  scale_color_manual(values = c("TRUE" = "white", "FALSE" = "black")) + 
  theme_bw() +
  theme(axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.grid = element_blank()) +
  guides(fill = FALSE, color = FALSE) +
  scale_y_reverse()

plot

Explication :

  1. Il est généralement plus sûr d'utiliser des vecteurs nommés avec scale_XX_manual afin de s'assurer que vous avez choisi les bonnes valeurs ;
  2. Par défaut, l'origine d'un tracé se situe dans le coin inférieur gauche, et non dans le coin supérieur gauche. Si vous voulez qu'il commence en haut, inversez votre axe des y.

Remarque : vous pouvez minimiser ce genre de problèmes à l'avenir, en laissant de côté le code lié à l'apparence jusqu'à ce que vous ayez fini de peaufiner les aspects les plus importants de votre intrigue. Si vous aviez laissé les étiquettes des axes et des légendes dans le tracé, les problèmes ci-dessus auraient été plus faciles à repérer :

mm %>% 
  melt() %>% 
  ggplot(aes(Var2, Var1)) + 
  geom_tile(aes(fill = value, 
                color = value)) + 
  coord_equal() + 
  scale_fill_manual(values = c("black", "white")) + 
  scale_color_manual(values = c("white", "black")) +
  theme_bw() #+
  # theme(axis.title = element_blank(),
  #       axis.text = element_blank(),
  #       axis.ticks = element_blank(),
  #       panel.grid = element_blank()) + 
  # guides(fill = FALSE, color = FALSE) + 
  # scale_x_discrete(expand = c(0,0)) + 
  # scale_y_discrete(expand = c(0,0))

plot

1voto

Darren Tsai Points 3619

Tout d'abord, l'indice matriciel et la coordonnée rectangulaire sont différents. Je crée une matrice telle que :

> x <- matrix(c(1, rep(0, 8)), 3, 3)

     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    0    0
[3,]    0    0    0

Vous pouvez voir que l'indice [1, 1] est 1 . Il est situé dans le coin supérieur gauche de la matrice. Mais lorsque je trace cette matrice avec image() la valeur 1 est situé dans le bouton gauche :

enter image description here

Cela est dû au fait que le système d'indexation de la matrice [1, 1] et celle du système de coordonnées rectangulaires (1, 1) ne sont pas la même position.

Pour effectuer la transformation de l'indice matriciel en coordonnées rectangulaires, vous pouvez essayer :

y <- t(x)[ , ncol(x):1]
image(y)

enter image description here

Vous réussissez à présenter la matrice à une carte thermique avec la même position.


Ainsi, avec vos données, vous pouvez d'abord les transformer en coordonnées rectangulaires et les tracer :

mm2 <- t(mm)[ , ncol(mm):1]

mm2 %>% 
  melt() %>% 
  ggplot(aes(Var1, Var2)) + # Don't exchange Var1 and Var2 here
  geom_tile(aes(fill = value, 
                color = value)) + 
  coord_equal() + 
  scale_fill_manual(values = c("TRUE" = "black", "FALSE" = "white")) + 
  scale_color_manual(values = c("TRUE" = "white", "FALSE" = "black")) + 
  theme_bw()

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X