Создание аккордовой сети в R

Я пытаюсь использовать библиотеку networkD3 в R для создания диаграммы аккордов для моих данных. Я следую логике, представленной в этом сообщении stackoverflow: Проблемы с сетевой хордовой диаграммой в R

Меня особенно интересует создание диаграммы аккордов с использованием igraph и networkd3, поскольку у меня нет прав администратора на моем компьютере для установки других библиотек (например, circlize).

Я создал фальшивые данные в R:

library(igraph)
library(dplyr)
library(networkD3)

#create file from which to sample from
x5 <- sample(1:100, 1100, replace=T)
#convert to data frame
x5 = as.data.frame(x5)

#create first file (take a random sample from the created file)
a = sample_n(x5, 1000)
#create second file (take a random sample from the created file)
b = sample_n(x5, 1000)

#combine
c = cbind(a,b)
#create dataframe
c = data.frame(c)
#rename column names
colnames(c) <- c("a","b")

Далее я создал матрицу смежности:

# создать матрицу смежности

g1 <- graph_from_adjacency_matrix(c)

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

chordNetwork(Data = c, 
             width = 500, 
             height = 500,
            )

Error in chordNetwork(Data = g, width = 500, height = 500, ) : 
  Data must be of type matrix or data frame

Кто-нибудь знает, что я делаю не так?

Спасибо


person stats555    schedule 02.11.2020    source источник
comment
Не cbind вещей перед созданием фреймов данных, просто вызовите data.frame(a, b) - вы создаете матрицу, а затем приводите ее к фрейму данных, что вызовет проблемы, если ваши переменные не одного типа. На самом деле лучше не называть переменные c, так как это обычная функция.   -  person alistaire    schedule 02.11.2020
comment
@alistaire: спасибо за ответ! Раньше я пытался запустить этот код без cbind, но он тоже не работает. Если я запустил код без cbind, он тоже не сработает. Я не могу создать матрицу смежности или диаграмму аккордов: #create file from which to sample from x5 ‹- sample (1: 100, 1100, replace = T) x5 = as.data.frame (x5) a = sample_n (x5, 1000) b = sample_n (x5, 1000) c = data.frame (a, b) colnames (c) ‹- c (a, b) g1‹ - graph_from_adjacency_matrix (c) chordNetwork (Data = c, width = 500, height = 500,)   -  person stats555    schedule 02.11.2020
comment
Да, мой комментарий был скорее указанием на то, чтобы избежать других проблем, а не на решение вашей текущей. CJ упоминает ниже проблему, вызывающую сбой: функции не созданы для обработки вводимых вами данных, поэтому вам нужно либо реструктурировать данные, либо использовать другую функцию. Может быть, вам нужно что-то вроде igraph::graph_from_edgelist(as.matrix(c))?   -  person alistaire    schedule 03.11.2020
comment
@alistaire: спасибо за ответ. Кажется, это работает: d = igraph :: graph_from_edgelist (as.matrix (c)); однако d по-прежнему несовместима с командой chordNetwork. Я буду искать способ исправить это. Вот как все выглядит на данный момент: chordNetwork (Data = d, width = 500, height = 500,) # Ошибка в chordNetwork (Data = d, width = 500, height = 500,): данные должны быть матричного типа или фрейм данных   -  person stats555    schedule 03.11.2020
comment
Посмотрите на ?chordNetwork; ему не нужен объект igraph в качестве входных данных, ему нужна матрица, как он вам говорит. Вы можете привести объект igraph к матрице смежности с помощью as_adjacency_matrix() (установить sparse = FALSE) или перейти прямо туда (что есть много способов сделать, например, unclass(table(c))). Тем не менее, у этого графа слишком много узлов, чтобы его можно было использовать с таким типом визуализации.   -  person alistaire    schedule 05.11.2020


Ответы (1)


Обе функции igraph::graph_from_adjacency_matrix и networkD3::chordNetwork требуют ввода квадратной матрицы. Вводимые вами данные не квадратные (то есть одинаковое количество строк и столбцов). Вот два рабочих примера, основанных на примерах из их файлов помощи ...

adjm <- matrix(sample(0:1, 100, replace=TRUE, prob=c(0.9,0.1)), nc=10)

graph_from_adjacency_matrix(adjm)

chordNetwork(Data = adjm)


#####


hairColourData <- matrix(c(11975,  1951,  8010, 1013,
                           5871, 10048, 16145,  990,
                           8916,  2060,  8090,  940,
                           2868,  6171,  8045, 6907),
                         nrow = 4)

graph_from_adjacency_matrix(hairColourData)

chordNetwork(Data = hairColourData, 
             labels = c("red", "brown", "blond", "gray"))
person CJ Yetman    schedule 02.11.2020
comment
Спасибо за ваш ответ! Я тоже видел пример цвета волос. Я подумал с этой строкой: g1 ‹- graph_from_adjacency_matrix (c) я превращаю свои данные в квадратную матрицу. Но, видимо, это не работает. У тебя есть идеи? Благодарить - person stats555; 03.11.2020
comment
Как я уже сказал, и как это четко указано в файлах справки, обе функции, включая igraph::graph_from_adjacency_matrix, требуют в качестве входных данных квадратную матрицу. - person CJ Yetman; 03.11.2020