У меня две колонки
temp <- read.delim(text = 'columnA columnB tnum
*Mickey Daffy 12345
*Minnie Donald 34567
Huey Minnie 21345
Donald Minnie 22345
Scrooge Mickey 22456', sep = ' ')
Я пытаюсь создать как направленный, так и неориентированный граф со степенью центральности (DoC) с этими людьми, чтобы показать, что у Минни высокий DoC.
Отредактировано: Извините, чтобы уточнить немного больше: я хочу создать график, как показано ниже, с каждым узлом, имеющим имя и номер.
Я также хотел бы знать, как продемонстрировать промежуточность, подобную приведенному изображению. Строка ниже
plot.igraph(g, edge.label = edge_attr(g, "tnum"))
вычислить веса ребер на основе того, насколько велико число tnum? - потому что я хочу вычислить экземпляры / частоты определенного числа tnum и нарисовать край / градус на основе этого.
Я немного расстроен тем, что вы ожидаете, что мы сделаем всю работу за вас и не укажете, что вы изо всех сил старались решить свои проблемы перед отправкой в SO. По сути, вы спросили: «Как мне это сделать, покажите мне, пожалуйста, весь код», что не так, как работает SO. Я отредактировал свой ответ с помощью некоторого графического кода, но вы могли бы сделать все это самостоятельно, предварительно проведя небольшое исследование, например прочитав эти вопросы: Цвет узлов в igraph, края графика в зависимости от веса
Просто любопытно, помог ли мой ответ вам хоть как-то решить эту проблему! Если да, я был бы рад, если бы вы отметили ответ как принятый. Если нет, возможно, мы сможем вам помочь
Хотя оба приведенных ниже метода работали, я пытался проверить все самостоятельно, прежде чем опубликовать здесь свой вопрос, поэтому не задавал с нуля. :) Приношу извинения, если так попалось. вот что я собирался, где я пытался измерить eigen_centrality (по сравнению со степенью центральности) (код добавлен ниже как комментарий к общему сообщению).
Мне совершенно непонятно, что вы пытаетесь сделать, какие комментарии или код имеете в виду, и почему вы переключаете полезные ответы. Я предлагаю вам, может быть, взять тур поближе познакомиться с этим сайтом, прежде чем вы разместите свой следующий вопрос.
сделайте график кадра данных с помощью igraph::graph_from_dataframe
, затем просто передайте график в igraph::degree
dirG <- graph_from_data_frame(temp)
degree(dirG)
даст тебе
*Mickey *Minnie Huey Donald Scrooge Daffy Minnie Mickey
1 1 1 2 1 1 2 1
Попытка построить график зависимости eigen_centrality от степени центральности (все еще просматриваю руководство igraph, чтобы выяснить разницу между ними и adv. Использования одного над другим) Функция eigen_centrality дает мне число с большим количеством значащих цифр; пытался округлить это число до приемлемого числа с помощью пары простых функций, представленных ниже, но по-прежнему получал неуправляемый график. Нижеприведенный:
Это зависит от того, что вы подразумеваете под «степенью центральности»: узел в графе имеет степень, то есть количество связей, которые он имеет с другими узлами; в ориентированных графах это сумма входящей и исходящей степени.
Кроме того, вы можете вычислить меру центральности для узла, которая, по сути, пытается ответить на вопрос, насколько «хорошо связанный», «встроенный» или просто «центральный» узел находится в графе (я, хорошо, знаю, что это сокращает много понятие центральности короткое, но это StackOverflow, а не Википедия). Существует довольно много разных типов центральности, каждый из которых использует свой подход. Опять же, Википедия или ваша любимая книга по теории графов - ваш друг.
Вот код, который показывает, как вычислить степень узла и меру центральности:
library(igraph)
df <- data.frame(
"from" = c("Mickey", "Minnie", "Huey", "Donald", "Scrooge"),
"to" = c("Daffy", "Donald", "Minnie", "Minnie", "Minnie")
)
g <- graph_from_data_frame(df, directed = TRUE) # or FALSE
g <- set_edge_attr(g, name = "tnum", value = c(12345, 34567, 21345, 22345, 22456))
plot.igraph(g, edge.label = edge_attr(g, "tnum"))
degree(g)
centralization.betweenness(g)
Если вам требуются другие меры центральности, поиск руководство igraph для centrality
или centralization
будет правильным решением.
Если вы хотите раскрасить свой график на основе этих мер центрильности, взгляните на этот код и обратитесь к отличному руководству igraph, если что-то неясно:
library(igraph)
df <- data.frame(
"from" = c("Mickey", "Minnie", "Huey", "Donald", "Scrooge"),
"to" = c("Daffy", "Donald", "Minnie", "Minnie", "Minnie")
)
# create an igraph object from the dataframe, which essentially is a list
# of edges between nodes
g <- graph_from_data_frame(df, directed = TRUE) # or FALSE
# each edge receives "tnum" as an attribute
g <-
set_edge_attr(g,
name = "tnum",
value = c(12345, 34567, 21345, 22345, 22456))
# calculate betweenness of nodes and store it in an attribute "color" of the
# vertices. The color-attribute is treated specially when plotting graphs.
V(g)$color <- betweenness(g)
plot.igraph(g,
# plot edge labels from the "tnum" attribute
edge.label = edge_attr(g, "tnum"),
# specify the palette of colours to use when plotting vertices
palette = heat.colors(n = 99))
# same as above; we multiply by 100 to make sure all values are > 0, otherwise
# the colour will be interpreted as 0 (usually, white)
V(g)$color <- (eigen_centrality(g)$vector) * 100
# assign edge weights based on the last digit of "tnum"
E(g)$weight <- E(g)$tnum %% 10
plot.igraph(
g,
edge.label = edge_attr(g, "tnum"),
edge.width = E(g)$weight,
edge.arrow.size = .8,
palette = heat.colors(n = 99)
)
Попытка сократить количество значащих цифр в eigen_centrality, используя часть кода @Oliver Baumann выше V (g) $ color <- (eigen_centrality (g) $ vector) V (g) $ doc <- (eigen_centrality (g) $ vector) V (g) $ doc = signif (V (g) $ doc, 1) V (g) $ doc = formatC (V (g) $ doc, format = "f", digits = 2) E (g) $ weight <- E (g) $ finfactor %% 10 plot.igraph (g, edge.label = edge_attr (g, "finfactor"), edge.width = E (g) $ weight, edge.arrow.size = .8, palette = heat.colors (n = 99))
Что вы хотите показать, что у Минни высокий степень или высокий центральность? Если центральность, то какого рода (степень, промежуточность, собственный вектор, ...)?