убирать заговор Играфа - PullRequest
0 голосов
/ 29 декабря 2018

Учитывая следующие два вектора для построения графика, один из ребер и один из весов соответственно:

edg <- c("ES1-3", "ES4-6", "ES4-6", "ES6-8", "ES6-8", "ES7-9", "ES7-9", 
"ES10-12", "ES10-12", "ES13-15", "ES13-15", "ES16-18", "ES16-18", 
"ES19-21", "ES19-21", "ES22-24", "ES22-24", "ES25-27", "ES25-27", 
"ES28-30", "ES28-30", "ES31-33", "ES31-33", "ES34-36", "ES34-36", 
"ES37-38", "ES13-15", "SA1-3", "SA1-3", "SA4-6", "SA4-6", "SA7-9", 
"SA7-9", "SA10-12", "SA10-12", "SA13-15", "SA13-15", "SA16-18", 
"SA16-18", "SA19-21", "SA19-21", "SA22-25")

Код построения с указанным вектором:

g1 <- make_graph(edges=edg)

И весвектор:

E(g1)$weight = c(0.0051, 0.0022, 0.0152, 0.0257, 0.0039, 0.0109, 0.012, 
0.0275, 0.0108, 0.029, 0.0061, 0.0134, 0.0205, 0.0129, 0.0081, 0.0035, 
0.02, 0.0094, 0.0095, 0.0161, 0.0199)

Теперь, пожалуйста, посмотрите на график, который я получаю в результате с кодом ниже:

 plot(g1,
 edge.label = E(g1)$weight,
 edge.arrow.size=.4,
 vertex.color='orange',
 vertex.size=7, 
 vertex.frame.color="orange",
 vertex.label.color="black", 
 vertex.label.cex=0.8,
 vertex.label.dist=1.1,
 margin=-.2,
 vertex.shape='circle')

enter image description here

У меня есть несколько проблем на этом графике, которые я не могу решить правильно:

  1. Несмотря на то, что задана постоянная для edge.arrow.size=.4 размеры стрелок ребер имеют разные размеры, т. Е. Некоторые стрелки больше, чемдругие, и я хотел бы, чтобы они все были одинакового размера.

  2. Я хотел бы закрасить код другим цветом в правой ветви «SA», то есть «SA1-3»SA4-6 'и пр.Я читал, что это как-то связано с созданием атрибута, подобного вектору весов, который я создал, но не смог понять это правильно.

  3. Мне бы хотелось иметь более точный график, чтобыэто неперекрывающиеся метки ребер с номерами, которые должны быть над стрелками.Я попытался настроить несколько параметров, как вы можете видеть в коде plot(g1,...), но ни один из них не дал приличного и аккуратного графика, который хорошо выглядит.

  4. Каждый раз, когда я запускаю *Код 1036 *, описанный ниже на RI, получает другую форму графика.То есть меняются размеры ветвей, например, ветвь, которая была слева, оказывается справа, и наоборот.Это почему ?Почему igraph продолжает давать мне разные формы для одного и того же кода каждый раз, когда я запускаю код без каких-либо изменений ??

1 Ответ

0 голосов
/ 30 декабря 2018

Как прокомментировал @RuiBaradas, в макете по умолчанию есть случайный элемент.Чтобы сделать макет повторяемым, вы должны либо явно указать макет, либо задать начальное значение, например, set.seed(123).Тем не менее, у вас есть много конкурирующих меток на вашем графике.Почти все, что вы делаете случайным образом, будет иметь проблемы, поэтому я рекомендую вам сделать явный макет.Я покажу это ниже.Чтобы изменить цвета вершин, вам нужно просто указать вектор цветов вместо одной константы.Это также показано ниже.Я также настроил vertex.label.dist и vertex.label.degree, чтобы контролировать положение меток относительно узлов.Я не вижу вашей проблемы с разными размерами стрелок.

Использование ваших данных:

## First make a color map 
ColMap = rep("orange", vcount(g1))
ColMap[grep("^SA", V(g1)$name)] = "red"

## Create an explicit layout of the vertices 
## that will separate the labels
LO = matrix(0, nrow=22, ncol=2)
LO[1:5,1]   = 5:1
LO[7:14,1]  = (1:8)/1.7
LO[15:22,1] = (1:8)/1.7
LO[7:14,2]  = -(1:8)
LO[15:22,2] = 2:9


plot(g1, layout=LO,
  edge.label = E(g1)$weight,
  edge.label.cex = 0.8,
  edge.arrow.size=.4,
  vertex.color=ColMap,
  vertex.size=7, 
  vertex.frame.color="orange",
  vertex.label.color="black", 
  vertex.label.cex=0.8,
  vertex.label.dist=c(rep(1.2,5), rep(2.2,17)),
  vertex.label.degree = c(rep(-pi/2, 5), pi, rep(-0.1,8), rep(0.1,8)),
  margin=-.2,
  vertex.shape='circle')

Plot with explicit layout

Учитывая, сколько вы пытаетесь упаковать в этот график, это не выглядиточень плохо.По крайней мере, вы можете прочитать все.Если вам не нравится форма, вы можете настроить макет, чтобы расположить вещи, где вы хотите.

...