2016-05-04 2 views
0

Используя пакет igraph в R, я пришел к следующему неожиданному поведению. Если edge.arrow.mode для графика (в моем случае неориентированный, но он не имеет значения) указан как 3 (или "<->", стрелки на обоих концах), а edge.color указан как rgb() с опцией alpha < 1, стрелки становятся по-разному цветной. Похоже, на одном конце есть два наконечника стрелки, а перекрытие создает более темный цвет.Неожиданное поведение цвета стрелки с полупрозрачными краями (igraph, R)

Это нежелательно, так как на графике показаны некоторые стрелки как более темные (более «важные»), чем другие. Фактический график, который я пытаюсь визуализировать, неориентирован, стрелки на концах (все серые, полупрозрачные) ребра будут просто использованы для иллюстрации того, сколько соединений имеет конкретная вершина (граф довольно большой (100-500) вершины) с перекрывающимися краями, поэтому непросто определить визуально, где ребро соединяется с вершиной, что также является причиной использования полупрозрачных ребер и вершин).

Вот некоторые рабочие примеры:

library("igraph") 
plot(make_tree(5, mode="undirected"), vertex.size=10, edge.arrow.mode=3, edge.color=rgb(0,0,0,0.2)) 
plot(make_tree(5, mode="undirected"), vertex.size=10, edge.arrow.mode=3, edge.color=rainbow(5, alpha=0.3)) 

enter image description here

Вопрос заключается в том, есть способ обойти это, поэтому стрелки будут выглядеть все-таки?

Отображение числа (и, желательно, «направления») связей между вершинами визуально каким-либо другим способом также можно рассматривать (но обратите внимание, что цвет вершин (полноцветный спектр) уже используется для другого визуального средства и вершина края окраски на вершине, что сделает вещи слишком rainbow'sy). Изменение формы вершин, указывающее степень связности, не является хорошим решением (редактировать - благодаря Tad). При этом все стрелки будут иметь сплошной цвет (но, похоже, не существует способа изменить цвет стрелки отдельно от цвета края).

(Bonus: это ошибка или особенность igraph?)

ответ

0

Не могли бы вы просто изменить размер вершины на основе степени узла?

grph <- make_tree(5, mode="undirected") 
plot(grph, vertex.size=degree(grph)*5, edge.arrow.mode=0, 
    edge.color='black') 

graph

Кроме того, можно изменить толщину краев (edge.width), которые могли бы дать представление о прочности узла в весовой сети. На самом деле это не так.

Редактировать: Как насчет изменения альфа-канала цвета, чтобы более прозрачные узлы имели меньшую степень? Кроме этого, я в недоумении. Помещение стрелок на неориентированном графике кажется плохой идеей в целом, особенно если это просто средство визуализации степени узла.

colShift <- function(x, alpha){ 
         x <- col2rgb(x)/255 
         rgb(x[1], x[2], x[3], alpha=alpha) 
        } 

grph <- make_tree(5, mode="undirected") %>% 
     set_vertex_attr('color', value='dodgerblue4') 

vertAlpha <- 1.1 - 1/degree(grph) 
vertColor <- colShift(vertex_attr(grph, 'color'), vertAlpha) 

V(grph)$color <- vertColor 

plot(grph, vertex.size=degree(grph)*5, edge.arrow.mode=0, 
    edge.color='black') 

enter image description here

+0

Это будет работать для небольшой сети и без меток, но у меня есть 100-500 вершины, и каждая вершина имеет короткую метку (всегда), состоящее из трех цифр. Изменение размеров вершин приведет к тому, что метки остаются частично за пределами вершинной формы для менее связанных вершин, которые я бы хотел избежать (и изменение размера текста могло бы сделать его нечитаемым), в то время как суперсвязные вершины покрывали бы слишком большую часть уже перегруженный сетевой сюжет. Я отредактирую вопрос, чтобы включить это ограничение. – user3554004

+0

Комментарий к редактированию.Спасибо, что придумали больше идей. К сожалению, вершинная альфа не будет работать хорошо в моем случае, так как цвет вершин информативен. Я использую все три значения 'rgb()', поэтому низкая альфа на белом фоне будет вводить в заблуждение визуальную вершину, как будто она имеет светлый цвет (или значения, близкие к 1 по всем трем цветным каналам). Поскольку сеть представляет собой социальные отношения, отсутствие стрелок или наличие обеих стрелок семантически эквивалентно; это не проблема. Оба конца просто должны выглядеть эквивалентными/идентичными. – user3554004

Смежные вопросы