Как визуализировать большую сеть в R?

Сетевые визуализации становятся обычным явлением в науке на практике. Но по мере увеличения размеров сетей обычные визуализации становятся менее полезными. Просто слишком много узлов / вершин и ссылок / ребер. Часто усилия по визуализации заканчиваются образованием «комков шерсти».

Для решения этой проблемы были предложены некоторые новые подходы, например:

Уверен, что подходов гораздо больше. Таким образом, мой вопрос: Как решить проблему волосяного комка, то есть как визуализировать большие сети с помощью R?

Вот код, имитирующий примерную сеть:

# Load packages
lapply(c("devtools", "sna", "intergraph", "igraph", "network"), install.packages)
library(devtools)
devtools::install_github(repo="ggally", username="ggobi")
lapply(c("sna", "intergraph", "GGally", "igraph", "network"), 
       require, character.only=T)

# Set up data
set.seed(123)
g <- barabasi.game(1000)

# Plot data
g.plot <- ggnet(g, mode = "fruchtermanreingold")
g.plot

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

Эти вопросы относятся к Визуализации неориентированного графа, который слишком велик для GraphViz? . Однако здесь я ищу не общие рекомендации по программному обеспечению, а конкретные примеры (с использованием данных, представленных выше), методы которых помогают сделать хорошую визуализацию большой сети с помощью R (сравнимо с примерами в этот поток: R: диаграмма рассеяния со слишком большим количеством точек).


person majom    schedule 17.03.2014    source источник
comment
Я боюсь, что это может быть закрыто как слишком широкое, но мне нравятся усилия и внимание, которые вы вложили в этот вопрос, и я действительно думаю, что с некоторыми хорошо продуманными ответами это может быть полезным ресурсом. +1 от меня (и никакого закрытого голосования).   -  person Simon O'Hanlon    schedule 17.03.2014
comment
Все описанные выше подходы направлены на решение проблемы с уделением повышенного внимания конкретным деталям сети. Итак, возникает вопрос: какой аспект сети для визуализации вас интересует? Отсюда можно начать обсуждение, чтобы найти правильный способ решения вашей проблемы.   -  person MarcoL    schedule 17.03.2014
comment
@ MarcoCI: Я искал довольно общие советы / лучшие практики, которые применимы ко многим различным сетям. Конечно, можно было бы добавить дополнительный случайно сгенерированный атрибут на уровне узла или края - при необходимости.   -  person majom    schedule 17.03.2014
comment
Общий совет - всегда удалять / уменьшать шум в сети: удаляйте неподключенные узлы, узлы с затуханием / призраками / фильтрами с более низким индексом для определенной оценки (метрики SNA, оценка Klout, обычно ...). Если вам нужно агрегированное значение информации, вы можете сгруппировать узлы / ссылки вместе, чтобы минимизировать шум: на этом этапе полезна проверка по запросу.   -  person MarcoL    schedule 17.03.2014
comment
Но в большинстве случаев сосредоточение внимания на вопросе о визуализации побуждает вас к полезным и более творческим подходам, которые могут решить вашу проблему.   -  person MarcoL    schedule 17.03.2014
comment
@ MarcoCI: Полностью согласен. Я думаю, что было бы целесообразно собрать основные методы, которые можно было бы применить, чтобы сделать более доступными визуализации больших сетей. Не стесняйтесь редактировать вопрос, если считаете, что это улучшит ответы.   -  person majom    schedule 18.03.2014


Ответы (5)


Еще один способ визуализировать очень большие сети - использовать BioFabric (www.BioFabric.org), который использует горизонтальные линии вместо точек для представления узлов. Затем края отображаются с помощью вертикальных отрезков. Быстрая демонстрация этой техники на D3 представлена ​​по адресу: http://www.biofabric.org/gallery/pages/SuperQuickBioFabric.html.

BioFabric - это приложение Java, но простая версия R доступна по адресу: https://github.com/wjrl/RBioFabric < / а>.

Вот фрагмент кода R:

 # You need 'devtools':
 install.packages("devtools")
 library(devtools)

 # you need igraph:
 install.packages("igraph")
 library(igraph)

 # install and load 'RBioFabric' from GitHub
 install_github('RBioFabric',  username='wjrl')
 library(RBioFabric)

 #
 # This is the example provided in the question:
 #

 set.seed(123)
 bfGraph = barabasi.game(1000)

 # This example has 1000 nodes, just like the provided example, but it 
 # adds 6 edges in each step, making for an interesting shape; play
 # around with different values.

 # bfGraph = barabasi.game(1000, m=6, directed=FALSE)

 # Plot it up! For best results, make the PDF in the same
 # aspect ratio as the network, though a little extra height
 # covers the top labels. Given the size of the network,
 # a PDF width of 100 gives us good resolution.

 height <- vcount(bfGraph)
 width <- ecount(bfGraph)
 aspect <- height / width;
 plotWidth <- 100.0
 plotHeight <- plotWidth * (aspect * 1.2)
 pdf("myBioFabricOutput.pdf", width=plotWidth, height=plotHeight)
 bioFabric(bfGraph)
 dev.off()

Вот снимок версии BioFabric данных, предоставленных опрашивающим, хотя сети, созданные со значениями m> 1, более интересны. На вставке крупным планом показан верхний левый угол сети; узел BF4 - это узел с наивысшей степенью в сети, а компоновка по умолчанию - это поиск в ширину сети (игнорируя направления краев), начиная с этого узла, с пересечением соседних узлов в порядке убывания степени узла. Обратите внимание, что мы сразу можем видеть, что, например, около 60% соседей узла BF4 имеют степень 1. Мы также можем видеть по строгому 45-градусному нижнему краю, что эта сеть из 1000 узлов имеет 999 ребер и, следовательно, является деревом.

Представление образцов данных BioFabric

Полное раскрытие: BioFabric - это инструмент, который я написал.

person wjrl    schedule 19.03.2014

Это интересный вопрос, я не знал большинства перечисленных вами инструментов, поэтому спасибо. Вы можете добавить в список HivePlot. Это детерминированный метод, заключающийся в проецировании узлов на фиксированное количество осей (обычно 2 или 3). Посмотрите на связанную страницу, есть много наглядных примеров.

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

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

Затем вам нужен другой атрибут, на этот раз он должен быть числовым (или, по крайней мере, порядковым). Он используется для определения положения узла на его оси. Вы также можете использовать некоторую топологическую меру, например степень или транзитивность (коэффициент кластеризации).

Как построить улей
(источник: hiveplot.net)

Тот факт, что метод является детерминированным, интересен тем, что он позволяет сравнивать разные сети, представляющие разные (но сопоставимые) системы. Например, вы можете сравнить два университета (при условии, что вы используете одни и те же атрибуты / меры для определения осей и положения). Это также позволяет описывать одну и ту же сеть различными способами, выбирая различные комбинации атрибутов / показателей для создания визуализации. Это рекомендуемый способ визуализации сети благодаря так называемой панели улья.

Несколько программ, способных генерировать эти графики-ульи, перечислены на странице, которую я упомянул в начале этого сообщения, включая реализации на Java и R.

person Vincent Labatut    schedule 18.03.2014

Я недавно столкнулся с этой проблемой. В результате я придумал другое решение. Свернуть график по сообществам / кластерам. Этот подход аналогичен третьему варианту, описанному выше в ОП. В качестве предупреждения, этот подход лучше всего работает с неориентированными графами. Например:

library(igraph)

set.seed(123)
g <- barabasi.game(1000) %>%
  as.undirected()

#Choose your favorite algorithm to find communities.  The algorithm below is great for large networks but only works with undirected graphs
c_g <- fastgreedy.community(g)

#Collapse the graph by communities.  This insight is due to this post http://stackoverflow.com/questions/35000554/collapsing-graph-by-clusters-in-igraph/35000823#35000823

res_g <- simplify(contract(g, membership(c_g))) 

Результатом этого процесса является рисунок ниже, где имена вершин представляют членство в сообществе.

plot(g, margin = -.5)

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

Вышеупомянутое явно лучше, чем этот ужасный беспорядок

plot(r_g, margin = -.5)

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

Чтобы связать сообщества с исходными вершинами, вам понадобится что-то вроде следующего

mem <- data.frame(vertices = 1:vcount(g), memeber = as.numeric(membership(c_g)))

ИМО, это хороший подход по двум причинам. Во-первых, теоретически он может работать с графом любого размера. Процесс поиска сообществ можно непрерывно повторять на свернутых графах. Во-вторых, использование интерактивного подхода даст очень удобочитаемые результаты. Например, можно представить, что пользователь может щелкнуть вершину свернутого графа, чтобы развернуть это сообщество, открыв все его исходные вершины.

person Jacob H    schedule 25.01.2016

Я осмотрелся и не нашел хорошего решения. Мой подход заключался в том, чтобы удалить узлы и поиграть с прозрачностью краев. Это скорее дизайнерское решение, чем техническое, но я смог без особых сложностей построить на своем ноутбуке gephi-подобные сети до 50 000 ребер.

с вашим примером:

plot(simplify(g), vertex.size= 0.01,edge.arrow.size=0.001,vertex.label.cex = 0.75,vertex.label.color = "black"  ,vertex.frame.color = adjustcolor("white", alpha.f = 0),vertex.color = adjustcolor("white", alpha.f = 0),edge.color=adjustcolor(1, alpha.f = 0.15),display.isolates=FALSE,vertex.label=ifelse(page_rank(g)$vector > 0.1 , "important nodes", NA))

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

Пример твиттера упоминает сеть с 30000 ребер:

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

person supercontra    schedule 05.08.2019
comment
приведенный выше график не показывает никаких краев. Я безуспешно пытался настроить alpha.f. - person adm; 16.06.2020
comment
@supercontra: можете ли вы использовать это вместе с библиотекой visnetwork в R? - person stats555; 06.11.2020
comment
@ stats555 Не знаю ... Я им не пользовался. - person supercontra; 18.07.2021

Еще один интересный пакет - networkD3. В этой библиотеке есть множество средств представления графиков. В частности, я считаю forceNetwork интересным вариантом. Он интерактивен и, следовательно, позволяет вам по-настоящему исследовать вашу сеть. Это замечательно для EDA, но может быть слишком "шатким" для финальной работы.

person Jacob H    schedule 22.01.2016
comment
у тебя есть пример? - person stats555; 06.11.2020