Я хочу создать функцию, которая строит ориентированные графы с выровненными вершинами и добавляет некоторый текст под каждой вершиной, то есть что-то вроде приведенного ниже примера графика. Функция построения графика должна иметь возможность обрабатывать круговые диаграммы как вершины, поэтому я использовал пакет 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
не дает мне никакой кривизны. Любые идеи о том, что попробовать дальше?