Хобрук: Ваш путь к мастерству в программировании

Пакет Geomnet - ошибка с пользовательскими координатами

Я пытаюсь создать сетевой график с заданными пользователем координатами в пакете geomnet для 11 узлов. После быстрого исследования я обнаружил, что это можно сделать, установив для layout.alg значение NULL и передав координаты x и y графику, но не указано, следует ли использовать координаты для «от» или «до». Я пробовал оба подхода, но все еще есть ошибка:

Error in scale_apply(layer_data, x_vars, "train", SCALE_X, x_scales) :  

Может быть, я тот, кто делает что-то не так, и это очень очевидно, но, честно говоря, я вообще понятия не имею. Буду очень признателен за любую помощь в этом.

Мои данные:

# A tibble: 11 x 4
    from    to     x     y
   <chr> <chr> <chr> <chr>
 1    z1    z3    40    30
 2    z2    z4    20    30
 3    z3    z5    15    30
 4    z4    z8    60    30
 5    z5    z9    10    50
 6    z6    z4    30    60
 7    z7    z4    50    50
 8    z8    z4    65    50
 9    z9    z5    20    80
10   z10    z8    40    90
11   z11    z7    60    70

Мой код:

p <- ggplot(data=fromto, aes(from_id = from, to_id = to, x=x,y=y)) 
p + geom_net(directed = TRUE,
               layout.alg = NULL,
               size = 6, arrowsize = 0.5,
               curvature = 0.05,
               arrowgap = 0.02,
               linewidth = 0.5)

Когда я использую меньший набор данных, он работает вполне нормально.

  from to  x  y
1   z1 z3 10 25
2   z2 z1 20 30
3   z3 z2 40 30

p <- ggplot(data=fromto, aes(from_id = from, to_id = to, x=x,y=y)) 

p + geom_net(directed = TRUE,
           layout.alg = NULL,
           size = 6, arrowsize = 0.5,
           curvature = 0.05,
           arrowgap = 0.02,
           linewidth = 0.5)

Результат - простой сюжет

26.10.2017

Ответы:


1

После тщательного анализа кода geom_net я обнаружил, что понимание того, как работает geomnet:::StatNet$compute_network, имеет основополагающее значение для решения вашей проблемы.

Ввод

geomnet:::StatNet$compute_network(data=fromto, layout.alg =NULL)

дает (неправильный) результат:

# A tibble: 21 x 7
# Groups:   from, to [21]
     from     to     x     y  xend  yend weight
   <fctr> <fctr> <int> <int> <int> <int>  <int>
 1     z1     z3    NA    NA    NA    NA      1
 2     z1     z5    40    30    10    50      1
 3    z10     z6    40    90    30    60      1
 4    z10     z8    NA    NA    NA    NA      1
 5    z11     z7    60    70    50    50      1
 6     z2    z10    20    30    40    90      1
 7     z2     z4    NA    NA    NA    NA      1
 8     z3     z5    NA    NA    NA    NA      1
 9     z3     z9    15    30    20    80      1
10     z4     z6    60    30    30    60      1
# ... with 11 more rows

Внутри geomnet:::StatNet$compute_network важным шагом является построение матрицы edgelist:

net <- network::as.network(na.omit(fromto[, 1:2]), matrix.type = "edgelist")
summary(net)
( edgelist <- sna::as.edgelist.sna(net) )

Результат:

### summary(net)
Network adjacency matrix:
    z1 z10 z11 z2 z3 z4 z5 z6 z7 z8 z9
z1   0   0   0  0  1  0  0  0  0  0  0
z10  0   0   0  0  0  0  0  0  0  1  0
z11  0   0   0  0  0  0  0  0  1  0  0
z2   0   0   0  0  0  1  0  0  0  0  0
z3   0   0   0  0  0  0  1  0  0  0  0
z4   0   0   0  0  0  0  0  0  0  1  0
z5   0   0   0  0  0  0  0  0  0  0  1
z6   0   0   0  0  0  1  0  0  0  0  0
z7   0   0   0  0  0  1  0  0  0  0  0
z8   0   0   0  0  0  1  0  0  0  0  0
z9   0   0   0  0  0  0  1  0  0  0  0

### edgelist
      [,1] [,2] [,3]
 [1,]    1    5    1
 [2,]    4    6    1
 [3,]    5    7    1
 [4,]    6   10    1
 [5,]    7   11    1
 [6,]    8    6    1
 [7,]    9    6    1
 [8,]   10    6    1
 [9,]   11    7    1
[10,]    2   10    1
[11,]    3    9    1
attr(,"n")
[1] 11
attr(,"vnames")
 [1] "z1"  "z10" "z11" "z2"  "z3"  "z4"  "z5"  "z6"  "z7"  "z8"  "z9" 

В первой строке матрицы смежности мы видим, что z1 и z3 (правильно) связаны, но метки строк-столбцов упорядочены по символьному значению, не принимая во внимание, что метки содержат встроенные числа, которые (на наш взгляд) должны быть отсортированы в числовом виде. .

Функция sna::as.edgelist.sna опирается на позиции строк и столбцов, а не на их метки, поэтому в первой строке вывода она дает [1,] 1 5 1. Это явно неправильно.

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

fromto$from_id <- LETTERS[as.numeric(gsub("z","",as.character(fromto$from_id)))]
fromto$to_id <- LETTERS[as.numeric(gsub("z","",as.character(fromto$to_id)))]
fromto

#    from_id to_id  x  y
# 1        A     C 40 30
# 2        B     D 20 30
# 3        C     E 15 30
# 4        D     H 60 30
# 5        E     I 10 50
# 6        F     D 30 60
# 7        G     D 50 50
# 8        H     D 65 50
# 9        I     E 20 80
# 10       J     H 40 90
# 11       K     G 60 70

library(geomnet)
ggplot(data=fromto, aes(from_id=from_id, to_id=to_id)) +
  geom_net(aes(x=x, y=y),layout.alg = NULL)+
  geom_text(aes(x=x, y=y, label=from_id), hjust=-1) 

введите здесь описание изображения

28.10.2017
  • Твоего ответа более чем достаточно, чтобы все понять! Это также может быть полезным советом для всех — иногда более глубокий взгляд на код может решить сложные проблемы. Спасибо, что вдохновили меня немного больше изучить R. 29.10.2017
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..