2017-01-20 7 views
1

У меня есть фрейм данных с именами животных:как поставить igraph края в правильном порядке

df <- data.frame(
    col1 = c("dog", "cat", "bird", "mammal", "avis", "canis", "feline"), 
    col2 = c("canis", "feline", "avis", "animal", "animal", "mammal", "mammal")) 

library(igraph) 

species <- union(df$col2, df$col1) 
df <- df[c('col2', 'col1')] 
names(df) <- c('from', 'to') 
species <- species[order(species)] 
species <- sort(union(df$col2, df$col1)) 
g <- graph.data.frame(df, directed = TRUE, vertices = species) 
plot(g,vertex.size=2, vertex.label.dist=0.5, vertex.color="cyan", 
edge.arrow.size=0.5, layout=layout.reingold.tilford(g)) 

После того как я запустить код, я получаю эту схему (изображение ниже). В кадре данных первые 3 элемента: "dog", "cat", "bird", а на графике - "bird", "dog", "cat". Короче говоря, порядок слов меняется на противоположный, и я хочу, чтобы они были в определенном порядке без изменения кадра данных.

enter image description here

Сказать igraph в каком порядке я хочу, чтобы мои данные были представлять я использую species <- species[order(species)] эту строку кода, в то время как он прекрасно работает с кадрами данных, которые имеют одну букву он не работает с этим или любым другим кадры данных, которые используют полные слова.

ответ

2

В настоящее время ваши вершины упорядочены в соответствии с заказом в векторе species. Без аргумента vertices порядок соответствует элементам объединения в двух столбцах кадра данных df.

> g <- graph.data.frame(df, directed = TRUE) 
> V(g)$name 
[1] "canis" "feline" "avis" "animal" "mammal" "dog" "cat" "bird" 
> g <- graph.data.frame(df, directed = TRUE, vertices = species) 
> V(g)$name 
[1] "animal" "avis" "bird" "canis" "cat" "dog" "feline" "mammal" 

Чтобы решить проблему, сортировать species вектор по объединению двух столбцов df, но принять второй столбец первой. Таким образом, последовательность "dog", "cat", "bird" выводит вектор species.

df <- data.frame(
    col1 = c("dog", "cat", "bird", "mammal", "avis", "canis", "feline"), 
    col2 = c("canis", "feline", "avis", "animal", "animal", "mammal",  "mammal")) 

library(igraph) 

df <- df[c('col2', 'col1')] 
names(df) <- c('from', 'to') 
species <- union(df$to, df$from) #NOTE do not sort the vector! 
g <- graph.data.frame(df, directed = TRUE, vertices = species) 
plot(g,vertex.size=2, vertex.label.dist=0.5, vertex.color="cyan", 
    edge.arrow.size=0.5, layout=layout.reingold.tilford(g)) 

Теперь вершины упорядочены в соответствии с порядком в виду, поставив "dog", "cat", "bird" первым.

> species 
[1] "dog" "cat" "bird" "mammal" "avis" "canis" "feline" "animal" 
> V(g)$name 
[1] "dog" "cat" "bird" "mammal" "avis" "canis" "feline" "animal" 

enter image description here

1

Вы имеете в виду вот это?

enter image description here

Я просто переставить порядок, например данных:

df <- data.frame(from = c('animal', 'animal', 'mammal', 'mammal', 'avis', 'canis', 'feline'), 
       to = c('mammal', 'avis', 'canis', 'feline', 'bird', 'dog', 'cat')) 

igraph участки ребер в порядке edgelist, который отличается от dataframe:

get.edgelist(g) 

Этот это информация, которую необходимо изменить. Я только создал небольшие графики и всегда вводил свои данные в том порядке, который я хотел, но я думаю, что это то, что нужно исследовать set.edge.attribute().

+0

Я не понимаю, как использовать 'get.edgelist (г)' или 'set.edge.attribute()' в моем коде –

 Смежные вопросы

  • Нет связанных вопросов^_^