[Перевод] Визуализация статических и динамических сетей на R, часть 5
В первой части:
- визуализация сетей: зачем? каким образом?
- параметры визуализации
- best practices — эстетика и производительность
- форматы данных и подготовка
- описание наборов данных, которые используются в примерах
- начало работы с igraph
Во второй части: цвета и шрифты в графиках R.
В третьей части: параметры графов, вершин и ребер.
В четвертой части: размещения сети.
В этой части: акцентирование свойств сети, вершин, ребер, путей.
Акцентирование свойств сети
Обратите внимание, что наш график сети все еще не слишком полезен. Мы можем определить тип и размер вершин, но немногое можем сказать о структуре, поскольку исследуемые ребра очень близко расположены. Один из способов решить проблему — посмотреть, можно ли «проредить» сеть, оставив только самые значимые связи и отбросив остальные.
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)
Другой подход к решению проблемы — выводить два типа связей (ссылки и упоминания) по отдельности:
E(net)$width <- 1.5
plot(net, edge.color=c("dark red", "slategrey")[(E(net)$type=="hyperlink")+1],
vertex.color="gray40", layout=layout.circle)
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") # Связь: упоминание
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")
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])
Акцентирование некоторых вершин или ребер
Иногда нужно сфокусировать визуализацию на определенной вершине или группе вершин. В нашем примере сети средств массовой информации можно исследовать распространение информации между центральными объектами. Например, давайте выведем расстояние от 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")
Или можно показать всех ближайших соседей 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)
Другой способ привлечь внимание к группе вершин — «пометить» их:
plot(net, mark.groups=c(1,4,5,8), mark.col="#C5E5E7", mark.border=NA)
# Пометить несколько групп:
plot(net, mark.groups=list(c(1,4,5,8), c(15:17)),
mark.col=c("#C5E5E7","#ECD89A"), mark.border=NA)
Также можно выделить путь в сети:
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)