[Перевод] Визуализация статических и динамических сетей на R, часть 5

В первой части:

  • визуализация сетей: зачем? каким образом?
  • параметры визуализации
  • best practices — эстетика и производительность
  • форматы данных и подготовка
  • описание наборов данных, которые используются в примерах
  • начало работы с igraph


Во второй части: цвета и шрифты в графиках R.

В третьей части: параметры графов, вершин и ребер.

В четвертой части: размещения сети.

В этой части: акцентирование свойств сети, вершин, ребер, путей.

Акцентирование свойств сети


177a106eed964631bd34694880db559d.png

Обратите внимание, что наш график сети все еще не слишком полезен. Мы можем определить тип и размер вершин, но немногое можем сказать о структуре, поскольку исследуемые ребра очень близко расположены. Один из способов решить проблему — посмотреть, можно ли «проредить» сеть, оставив только самые значимые связи и отбросив остальные.

hist(links$weight)
mean(links$weight)
sd(links$weight)


Есть и более сложные способы выделить ключевые ребра, но в этом примере мы оставим только те, вес которых превышает среднее значение для сети. В igraph можно удалить ребра с помощью delete.edges(net, edges):

cut.off <- mean(links$weight) 
net.sp <- delete.edges(net, E(net)[weight<cut.off])
l <- layout.fruchterman.reingold(net.sp, repulserad=vcount(net)^2.1)
plot(net.sp, layout=l) 


d1141cede63d4a78b5f62e79d1af3649.png

Другой подход к решению проблемы — выводить два типа связей (ссылки и упоминания) по отдельности:

E(net)$width <- 1.5
plot(net, edge.color=c("dark red", "slategrey")[(E(net)$type=="hyperlink")+1],
      vertex.color="gray40", layout=layout.circle)


1cf38301651040268c58d7db51008c5e.png

net.m <- net - E(net)[E(net)$type=="hyperlink"] # другой способ удалить ребра
net.h <- net - E(net)[E(net)$type=="mention"]

par(mfrow=c(1,2))
plot(net.h, vertex.color="orange", main="Tie: Hyperlink") # Связь: ссылка
plot(net.m, vertex.color="lightsteelblue2", main="Tie: Mention") # Связь: упоминание


e6dd053464a940e2a9371a5437dba739.png

l <- layout.fruchterman.reingold(net)
plot(net.h, vertex.color="orange", layout=l, main="Tie: Hyperlink")
plot(net.m, vertex.color="lightsteelblue2", layout=l, main="Tie: Mention")


bfc66b936f4c422b886274019ccecd48.png

dev.off()


Можно также попробовать сделать карту сети более полезной, показав объединения в ней:

V(net)$community <- optimal.community(net)$membership
colrs <- adjustcolor( c("gray50", "tomato", "gold", "yellowgreen"), alpha=.6)
plot(net, vertex.color=colrs[V(net)$community])

db65789699014606890680a382fa9019.png

Акцентирование некоторых вершин или ребер


Иногда нужно сфокусировать визуализацию на определенной вершине или группе вершин. В нашем примере сети средств массовой информации можно исследовать распространение информации между центральными объектами. Например, давайте выведем расстояние от NYT (New York Times). Функция shortest.paths (как показывает название) возвращает матрицу кратчайших путей между вершинами в сети.

dist.from.NYT <- shortest.paths(net, algorithm="unweighted")[1,]
oranges <- colorRampPalette(c("dark red", "gold"))
col <- oranges(max(dist.from.NYT)+1)[dist.from.NYT+1]

plot(net, vertex.color=col, vertex.label=dist.from.NYT, edge.arrow.size=.6, 
     vertex.label.color="white")


04f932ad2a7c4ee387667fad41a7a68f.png

Или можно показать всех ближайших соседей WSJ (Wall Street Journal). Обратите внимание, что функция neighbors находит все вершины за один шаг от центрального объекта. Аналогичная функция, которая находит все ребра для узла, называется incident.

col <- rep("grey40", vcount(net))
col[V(net)$media=="Wall Street Journal"] <- "#ff5100"

neigh.nodes <- neighbors(net, V(net)[media=="Wall Street Journal"], mode="out")

col[neigh.nodes] <- "#ff9d00"
plot(net, vertex.color=col)


9822d287f0b44a13b7e7bae0760989ca.png

Другой способ привлечь внимание к группе вершин — «пометить» их:

plot(net, mark.groups=c(1,4,5,8), mark.col="#C5E5E7", mark.border=NA)


499b479c00cf402a9a0e7873c66848dc.png

# Пометить несколько групп:
plot(net, mark.groups=list(c(1,4,5,8), c(15:17)), 
          mark.col=c("#C5E5E7","#ECD89A"), mark.border=NA)


d8254298ab0441c886a876f7f3177a11.png

Также можно выделить путь в сети:

news.path <- get.shortest.paths(net, V(net)[media=="MSNBC"], 
                                V(net)[media=="New York Post"],
                                mode="all", output="both")


# Создать переменную цвета ребер:
ecol <- rep("gray80", ecount(net))
ecol[unlist(news.path$epath)] <- "orange"

# Создать переменную ширины ребер:
ew <- rep(2, ecount(net))
ew[unlist(news.path$epath)] <- 4

# Создать переменную цвета вершин:
vcol <- rep("gray40", vcount(net))
vcol[unlist(news.path$vpath)] <- "gold"

plot(net, vertex.color=vcol, edge.color=ecol, 
     edge.width=ew, edge.arrow.mode=0)


171db66429044336afd10e5b2059a235.png

© Habrahabr.ru