У меня есть некоторые данные, похожие на data.frame
d
следующим образом.
d <- structure(list(ID = c("KP1009", "GP3040", "KP1757", "GP2243",
"KP682", "KP1789", "KP1933", "KP1662", "KP1718", "GP3339", "GP4007",
"GP3398", "GP6720", "KP808", "KP1154", "KP748", "GP4263", "GP1132",
"GP5881", "GP6291", "KP1004", "KP1998", "GP4123", "GP5930", "KP1070",
"KP905", "KP579", "KP1100", "KP587", "GP913", "GP4864", "KP1513",
"GP5979", "KP730", "KP1412", "KP615", "KP1315", "KP993", "GP1521",
"KP1034", "KP651", "GP2876", "GP4715", "GP5056", "GP555", "GP408",
"GP4217", "GP641"),
Type = c("B", "A", "B", "A", "B", "B", "B",
"B", "B", "A", "A", "A", "A", "B", "B", "B", "A", "A", "A", "A",
"B", "B", "A", "A", "B", "B", "B", "B", "B", "A", "A", "B", "A",
"B", "B", "B", "B", "B", "A", "B", "B", "A", "A", "A", "A", "A",
"A", "A"),
Set = c(15L, 1L, 10L, 21L, 5L, 9L, 12L, 15L, 16L,
19L, 22L, 3L, 12L, 22L, 15L, 25L, 10L, 25L, 12L, 3L, 10L, 8L,
8L, 20L, 20L, 19L, 25L, 15L, 6L, 21L, 9L, 5L, 24L, 9L, 20L, 5L,
2L, 2L, 11L, 9L, 16L, 10L, 21L, 4L, 1L, 8L, 5L, 11L), Loc = c(3L,
2L, 3L, 1L, 3L, 3L, 3L, 1L, 2L, 1L, 3L, 1L, 1L, 2L, 2L, 1L, 3L,
2L, 2L, 2L, 3L, 2L, 3L, 2L, 1L, 3L, 3L, 3L, 2L, 3L, 1L, 3L, 3L,
1L, 3L, 2L, 3L, 1L, 1L, 1L, 2L, 3L, 3L, 3L, 2L, 2L, 3L, 3L)),
.Names = c("ID", "Type", "Set", "Loc"), class = "data.frame",
row.names = c(NA, -48L))
Я хочу изучить отношения между членами d$ID
с использованием диаграммы аккордов, аналогичной той, которая приведена ниже.
Он видит несколько вариантов для этого в R
. (Chord diagram в R).
По моим данным, отношения соответствуют d$Set
(не направленным), а группировка соответствует d$Loc
. Ниже приведены мои попытки сопоставить отношения между ними как диаграммы аккордов.
Попытка 1: Использование igraph
Я пробовал igraph
следующим образом с размером node в зависимости от степени.
# Get vertex relationships
sets <- unique(d$Set[duplicated(d$Set)])
rel <- vector("list", length(sets))
for (i in 1:length(sets)) {
rel[[i]] <- as.data.frame(t(combn(subset(d, d$Set ==sets[i])$ID, 2)))
}
library(data.table)
rel <- rbindlist(rel)
# Get the graph
g <- graph.data.frame(rel, directed=F, vertices=d)
clr <- as.factor(V(g)$Loc)
levels(clr) <- c("salmon", "wheat", "lightskyblue")
V(g)$color <- as.character(clr)
# Plot
plot(g, layout = layout.circle, vertex.size=degree(g)*5, vertex.label=NA)
Как изменить сюжет, чтобы выглядеть как первый рисунок? Кажется, что нет никаких вариантов для изменения igraph
layout.circle
.
Попытка 2: Использование Circlize
В пакете R
Circlize
возможны более гладкие кривые Безье и группировка. Но здесь я не могу группировать узлы, а также корректировать их размер в зависимости от степени, как они построены как сектора.
par(mar = c(1, 1, 1, 1), lwd = 0.1, cex = 0.7)
circos.initialize(factors = as.factor(d$ID), xlim = c(0, 10))
circos.trackPlotRegion(factors = as.factor(d$ID), ylim = c(0, 0.5), bg.col = V(g)$color,
bg.border = NA, track.height = 0.05)
for(i in 1:nrow(rel)) {
circos.link(rel[i,1], 0, rel[i,2],0, h = 0.4)
}
Здесь, однако, нет параметров для изменения узлов. На самом деле они могут быть построены только как сектора? В этом случае есть ли способ изменить сектора на круговые узлы размера в соответствии со степенью?
Попытка 3: Использование edgebundleR
(https://github.com/garthtarr/edgebundleR)
require(edgebundleR)
edgebundle(g,tension = 0.1,cutoff = 0.5, fontsize = 18,padding=40)
Кажется, здесь есть ограниченные возможности для изменения эстетики.