igraph: расположение меток и удаление пустого пространства в сетке
Я хочу создать функцию, которая строит ориентированные графы с выровненными вершинами и добавляет текст под каждую вершину, то есть что-то вроде примера графика ниже. Функция построения графиков должна иметь возможность обрабатывать круговые диаграммы как вершины, поэтому я использовал igraph
пакет в R.
adjm <- matrix(c(0,1,0,1,
0,0,1,1,
0,0,0,1,
0,0,0,0), nrow=4, byrow=TRUE)
g1 <- graph.adjacency(adjm, mode="directed")
values <- lapply(1:4, function(x) sample(1:4,4))
windows(width=7, height=3.5)
plot(g1, layout=layout.grid(g1, width=4),
vertex.shape="pie", vertex.pie=values,
vertex.pie.color=list(heat.colors(4)),
edge.curved=TRUE,
vertex.label=LETTERS[1:4], vertex.size=50,
vertex.label.dist=5, vertex.label.degree=pi/2,
edge.label=1:5, rescale=FALSE,
xlim=c(-0.2,3.5), ylim=c(0,0.5))
У меня две проблемы.
Почему чем длиннее метка вершины, тем больше расстояние до центра вершины, как в следующем примере? Могу ли я заставить их появляться на одном уровне, не находя и не определяя вручную правильное расстояние?
windows(width=7, height=3.5) plot(g1, layout=layout.grid(g1, width=4), vertex.shape="pie", vertex.pie=values, vertex.pie.color=list(heat.colors(4)), edge.curved=TRUE, vertex.label=c("A", "AA", "AAAA", "AAAAAA"), vertex.size=50, vertex.label.dist=5, vertex.label.degree=pi/2, edge.label=1:5, rescale=FALSE, xlim=c(-0.2,3.5), ylim=c(0,0.5))
Как убрать пустое пространство при построении выровненных участков? Если я сделаю горизонтальный график, он будет размещен в нижней части окна с большим количеством пустого пространства. Чем ровнее изображение, тем меньше график, как на третьем графике. (Кажется, что размер графика определяется таким образом, чтобы график соответствовал любой позиции, вертикальной или горизонтальной.)
plot(g1, layout=layout.grid(g1, width=4), vertex.shape="pie", vertex.pie=values, vertex.pie.color=list(heat.colors(4)), edge.curved=TRUE, vertex.label=c("A", "AA", "AAAA", "AAAAAA"), vertex.size=20, vertex.label.dist=2, vertex.label.degree=pi/2, edge.label=1:5)
Я могу написать аргумент
asp=0
чтобы сохранить вершины нужного размера в более плоском окне, но меняются автоматические кривизны и положения меток вершин. Я могу вручную настроить отрицательное верхнее поле, расстояния до меток и кривизну кромки, но, конечно, это не решение для универсальной функции. Лучший результат до сих пор был результатомrescale=FALSE
как в коде для первого графика, но искривления ребер все еще слишком малы, и с большими вершинами они полностью попадают за вершины. (Кроме того, проблема с изменением расстояния между метками вершин по-прежнему сохраняется.) Прямое использованиеautocurve.edges
не дает мне никакой кривизны. Есть идеи, что попробовать дальше?
1 ответ
Чтобы исправить это, вы можете настроить plot.igraph
функционировать немного. Для этого вы можете поэкспериментировать, используя trace(plot.igraph,edit=TRUE)
и измените код функции.
Несколько советов, чтобы получить то, что вы хотите: Для меток строка 319 функции:
y <- layout[, 2] + label.dist * sin(-label.degree) * (vertex.size + 6 * 8 * log10(nchar(labels) + 1))/200
Итак y
размещение меток пропорционально количеству символов метки, просто удалите log10(nchar(labels) + 1)
и ярлыки останутся на том же уровне.
Для размера вопроса, если вы хотите сохранить rescale
, y
Положение участка определяется линией 55
layout <- layout.norm(layout, -1, 1, -1, 1)
Вы можете изменить третье число на любое другое, и сюжет будет выше (например, layout <- layout.norm(layout, -1, 1, 0, 1) will center the vertexes on 0). You can also change the margins by changing the
настройки пар. Вы могли бы, например, сделать:
oldMargins<-par("mar")
par(mar=c(10,4,4,4))
и после сюжета par(mar=oldMargins)
Это график, который я получаю, используя этот код после корректировок:
Я оставил оси, чтобы облегчить настройку, и удалил пироги, потому что в вашем посте не было никакого значения.
oldMargins<-par("mar")
par(mar=c(10,4,4,4))
plot(g1, layout=layout.grid(g1, width=4),
vertex.pie.color=list(heat.colors(4)),
edge.curved=TRUE,
vertex.label=c("A", "AA", "AAAA", "AAAAAA"), vertex.size=20,
vertex.label.dist=1, vertex.label.degree=pi/2, edge.label=1:5,axes=TRUE,
ylim=c(-0.5,0.5),xlim=c(-1,1))
par(mar=oldMargins)
При перезапуске R любые изменения, внесенные вами в функцию, будут удалены, или вы можете использовать untrace
вернуться к первоначальной функции. Вы можете посмотреть на этот пост для получения дополнительной информации.