2016-04-25 4 views
3

Я рисую сетевой граф в R, используя `igraph1. Сеть имеет 1380 узлов и около 150 Кб. Вот резюме от igraph:Цветная палитра для вершин в сети igraph в R

IGRAPH UN-- 1380 159718 -- 
+ attr: name (v/c), rels (v/n), label (v/n), degree (v/n), btw (v/n), color (v/c), rels (e/n) 

Я пытаюсь добавить градиент цвета, который окрашивает узлы на основе их центральности. Я пробовал несколько различных версий кода, первый из этого example:

# calculate betweenness 
V(g_yearly)$btw <- betweenness(g_yearly) 

# construct color palette 
fine <- 100 
palette <- colorRampPalette(c('blue','green')) 

# assign palette to nodes 
V(g_yearly)$color <- palette(fine) [as.numeric(cut(V(g_yearly)$btw,breaks=fine))] 

# plot network 
plot.igraph(g_yearly,vertex.shape="circle",vertex.size=1,vertex.label.cex=0.6,layout=lgl(g_yearly),edge.arrow.size=0,edge.width=E(g_yearly)$rels/50) 

Я получаю следующее сообщение об ошибке и отслеживающий:

Error in seq.int(0, 1, length.out = n) : 
    'length.out' must be a non-negative number 
    9 .approxfun(x, y, v, method, yleft, yright, f) 
    8 palette[[1L]](x) 
    7 cbind(palette[[1L]](x), palette[[2L]](x), palette[[3L]](x), if (alpha) palette[[4L]](x)) 
    6 pmin(rgb, 1) 
    5 pmax(pmin(rgb, 1), 0) 
    4 roundcolor(cbind(palette[[1L]](x), palette[[2L]](x), palette[[3L]](x), 
if (alpha) palette[[4L]](x))) 
    3 ramp(seq.int(0, 1, length.out = n)) 
    2 palette(palette) 
    1 plot.igraph(g_yearly, vertex.shape = "circle", vertex.size = 1, 
vertex.label.cex = 0.6, layout = layout.lgl(g_yearly), edge.arrow.size = 0, 
edge.width = E(g_yearly)$rels/50) 

In addition: Warning message: 
In .approxfun(x, y, v, method, yleft, yright, f) : 
NAs introduced by coercion 

Если я использую функцию rainbow вместо этого, это прекрасно работает :

V(g_yearly)$color <- rainbow(V(g_yearly)$btw,start=3/6,end=4/6) 

Как ни странно, после того, как я бежал первый бит кода один раз, я не могу показаться, чтобы запустить участок в сети, не получая ту же ошибку - даже если я г Выполните вызовы на palette.

Что я делаю неправильно с palette?

+0

Как вы получите отслеживающий?!? –

ответ

1

Я думаю, что проблемы в этой строке:

# assign palette to nodes 
V(g_yearly)$color <- palette(fine [as.numeric(cut(V(g_yearly)$btw,breaks=fine))] 

Аргумент palette должно быть одно целое и fine вектор длины 1 поэтому попытка индексировать его с чем-нибудь другим, чем 1 потерпит неудачу. Попробуйте:

V(g_yearly)$color <- palette(fine)[ as.numeric(cut(V(g_yearly)$btw, breaks=fine)] 

(Непроверенный в отсутствии воспроизводимого примера.)

+0

Ну, это досадная опечатка, но я думаю, что это было в моем посте только. Несмотря на это, я дважды проверен и тот же результат. – tchaymore

+0

Существует код, но нет данных по ссылке, которую вы вызываете «пример». Так что это не совсем ... пример. –

+0

Я посмотрю, могу ли я поделиться фрагментом данных. Это часть совместного исследовательского проекта, данные мои, но я не могу участвовать полностью. – tchaymore

-1

В TRACEBACK ошибки у вас есть строка: 2 палитры (палитры). Я думаю, что вы перезаписать переменную, попробуйте: бледные < - colorRampPalette (с («синий», «зеленый»))

1

меня были те же проблемы, но нашли проблему. Когда вы делаете

palette <- colorRampPalette(c('blue','green')) 

вы переопределить функцию «палитра», и так igraph позже производите как ошибка (я предполагаю, что igraph использует «палитру» в одном или другом способе.

Это также объясняет, почему ошибка остается, когда

palette <- colorRampPalette(c('blue','green')) 

было сделано один раз.

+0

Релевантно: https://github.com/igraph/rigraph/issues/252 – OganM

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