Візуалізація статичних і динамічних мереж на R, частина 1

Дуже багато системи і явища представимы у вигляді мереж, тобто набору об'єктів і зв'язків між ними. Мережа — не тільки абстракція, але і наочний інструмент візуалізації даних. Можна відобразити важливість того чи іншого об'єкта, вага кожної зв'язку, вказати ключові групи елементів, виділити їх і наголосити на зв'язку між ними. Головне завдання візуалізації — подати ключову інформацію про властивості системи або явища максимально простим способом. В ідеальному випадку аналіз системи та візуалізацію його результатів можна зробити в рамках одного інструмента. R з його великим набором пакетів дозволяє це.

Введення: візуалізація мереж

Головне при проектуванні візуалізації мережі — мета, яку потрібно досягти. Які структурні властивості ми хотіли б виділити?


Карти мереж — далеко не єдиний інструмент візуалізації графів — в деяких випадках більш кращі інші формати представлення мереж, навіть прості графіки ключових властивостей.


У картах мереж, як і в інших форматах візуалізації, є кілька ключових параметрів, що впливають на кінцевий результат. Головні — колір, розмір, форма і взаємне розташування.


Сучасні уявлення графів оптимізують виходячи з вимог ефективності та естетичних міркувань. Зокрема, потрібно мінімізувати накладення і перетинання ребер, встановити однакову довжину ребер в графі.


Формат даних, розмір та підготовка

У цьому керівництві ми в основному будемо працювати з двома невеликими масивами даних. Обидва містять інформацію про засобах масової інформації. Один містить мережа гіперпосилань і згадок в новинних ресурсах. Інший — мережа посилань між об'єктами і споживачами масової інформації. Хоча даних у прикладах трохи, багато ідей згенерованих візуалізацій можна поширити на середні і великі мережі. З цієї ж причини ми рідко будемо використовувати візуальні засоби, наприклад, форму символів-вершин: їх практично неможливо розрізнити у великих графах. Більш того, при відображенні дуже великих мереж можна навіть приховати ребра, оскільки потрібно зосередитися на виявленні і відображенні груп вершин. Взагалі кажучи, розмір мереж, які можна візуалізувати за допомогою R, обмежений лише обсягом оперативної пам'яті вашої машини. Але слід підкреслити, що у багатьох випадках візуалізація великих мереж у вигляді гігантського помпона куди менш корисна, ніж графіки з ключовими властивостями графа.

У цьому посібнику використовуються кілька ключових пакетів, які потрібно встановити, перш ніж продовжити. Будуть згадані ще кілька бібліотек, але вони не є обов'язковими, і їх можна пропустити. Будуть використані наступні основні бібліотеки — igraph (підтримується Габором Царди, Раджасом Непушем, sna network (підтримується Картером Баттсом і командою Statnet і ndtv (підтримується Скаєм Бендер-деМолль).
install.packages("igraph")
install.packages("network")
install.packages("sna")
install.packages("ndtv")


Набір даних 1: список ребер

Перший набір даних, з яким доведеться працювати, складається з двох файлів: «Media-Example-NODES.csv» і «Media-Example-EDGES.csv» (скачати можна тут).
nodes <- read.csv("Dataset1-Media-Example-NODES.csv", header=T as.is=T)
links <- read.csv("Dataset1-Media-Example-EDGES.csv", header=T as.is=T)

Досліджуємо дані:
head(nodes)
head(links)
nrow(nodes); length(unique(nodes$id))
nrow(links); nrow(unique(links[,c("from","to")]))

Зверніть увагу, що ребер більше, ніж унікальних комбінацій «from»-«to». Це означає, що в даних є випадки, коли між двома вершинами більше однієї зв'язку. Ми звернемо всі ребра одного типу між двома вузлами, підсумувавши їх ваги за допомогою функції
aggregate()
з «from», «to» та «type»:
links <- aggregate(links[,3], links[,-3], sum)
links <- links[order(links$from, links$to),]
colnames(links)[4] <- "weight"
rownames(links) <- NULL


Набір даних 2: матриця

nodes2 <- read.csv("Dataset2-Media-User-Example-NODES.csv", header=T as.is=T)
links2 <- read.csv("Dataset2-Media-User-Example-EDGES.csv", header=T, row.names=1)

Досліджуємо дані:
head(nodes2)
head(links2)

Можна переконатися, що links2 — матриця сполучення для двосторонньої мережі:
links2 <- as.matrix(links2)
dim(links2)
dim(nodes2)


Візуалізація мереж: перші крокиigraph

Почнемо з перетворення вихідних даних у мережу igraph. Для цього використовуємо функцію igraph graph.data.frame, яка приймає на вхід два блоки даних: d і vertices.
  • d описує ребра мережі. У перших двох колонках містяться ідентифікатори початкової і кінцевої вершини для кожного ребра. У наступних колонках знаходяться параметри ребра (вага, тип, мітка, інше).
  • vertices починається з колонки ідентифікаторів вершин. Всі наступні колонки інтерпретуються як параметри вершини.
library(igraph)

net <- graph.data.frame(links, nodes, directed=T)
net

## IGRAPH DNW - 17 49 -- 
## + attr: name (v/c), media (v/c), media.type (v/n), type.label
## (v/c), audience.size (v/n), type (e/c), weight (e/n)

Опис об'єкта igraph починається з чотирьох літер:
  1. D або U — для спрямованого або ненаправленного графа відповідно.
  2. N — іменований графа (де вузлів є атрибут
    name
    ).
  3. W — для зваженого графа (де зв'язків є атрибут
    weight
    ).
  4. B — для двостороннього графа (де вузлів є атрибут
    type
    ).
Наступні два числа (17 49) вказують кількість вершин та ребер в графі. В описі також вказані властивості вершин і ребер, наприклад:
  • (g/c)
    — властивість-рядок на рівні графа
  • (v/c)
    — властивість-рядок на рівні вершини
  • (e/n)
    — властивість-число на рівні ребра
Також легко отримати доступ до вершин, ребер та їх атрибутів:
E(net) # Ребра об'єкта "net"
V(net) # Вершини об'єкта "net"
E(net)$type # Властивість ребра "type"
V(net)$media # Властивість вершини "media"

# Можна працювати з матрицею мережі і безпосередньо:
net[1,]
net[5,7]

Тепер, коли є мережа igraph, можна зробити першу спробу побудувати її.
plot(net) # некрасива картинка!



Вийшло не дуже красиво. Давайте почнемо покращувати картинку, прибравши цикли в графі.
net <- simplify(net, remove.multiple = F, remove.loops = T) 

Ви можете відмітити, що можна було використовувати
simplify
, щоб згорнути кілька ребер в одне, підсумовуючи їх ваги за допомогою команди типу
simplify(net, edge.attr.comb=list(Weight="sum","ignore"))
. Проблема в тому, що при суміщенні не враховується тип ребра (в наших даних «hyperlinks» — посилання «mentions» — згадки).

Давайте також зменшимо розмір стрілок і приберемо мітки (встановивши їх у
NA
):
plot(net, edge.arrow.size=.4,vertex.label=NA)



У частині 2: шрифти і кольори в графіках R.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.