Неправильное позиционирование при построении матрицы смежности - R ggplot - PullRequest
0 голосов
/ 22 октября 2018

Я хочу построить матрицу смежности графика как шахматную доску (черный для 1 с, белый для 0 или наоборот)

     [,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

Используя следующий код:

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))

Я получаю этот вывод:

enter image description here

Почему?

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Во-первых, индекс матрицы и прямоугольная координата различны.Я делаю матрицу, например:

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

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

Вы можете видеть, что индекс [1, 1] равен 1.Он расположен в левом верхнем углу матрицы.Но когда я строю эту матрицу с помощью image(), значение 1 находится в левой кнопке:

enter image description here

Это потому, что система индексирования матрицы[1, 1] и прямоугольная система координат (1, 1) не совпадают.

Чтобы выполнить преобразование из индекса матрицы в прямоугольную координату, вы можете попробовать:

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

enter image description here

Вам удалось представить матрицу на тепловой карте с той же позицией.


Итак, с вашими данными вы можете сначала преобразовать ее в прямоугольную координату и построить графикэто:

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

0 голосов
/ 22 октября 2018

Следующий код должен возвращать то, что вы ищете:

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

Объяснение:

  1. Этокак правило, безопаснее использовать именованные векторы с scale_XX_manual, чтобы обеспечить отображение правильных значений;
  2. По умолчанию источник графика находится в левом нижнем углу, а не в верхнем левом углу.Если вы хотите, чтобы он начинался сверху, переверните ось Y.

Примечание: вы можете свести к минимуму такие проблемы в будущем, оставив код, связанный с внешним видом, до тех пор, пока не закончите настройкуболее важные аспекты вашего сюжета.Если бы вы оставили метки осей и легенды на графике, вышеперечисленные проблемы было бы легче обнаружить:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...