2016-12-23 1 views
1

В настоящее время я пытаюсь отобразить круговой график в R с возможностью размещения меток каждого узла рядом с ним, но вне его.Свободно размещающие метки вершин за пределами вершин для кругового графа в R

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

radian.rescale <- function(x, start=0, direction=1) { 
    c.rotate <- function(x) (x + start) %% (2 * pi) * direction 
    c.rotate(scales::rescale(x, c(0, 2 * pi), range(x))) 
} 
lab.locs <- radian.rescale(x=1:n, direction=-1, start=0) 
plot(sev, layout=la, vertex.size=25, vertex.label.dist=5, 
    vertex.label.degree=lab.locs, vertex.label.color="black") 

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

Посмотрев еще несколько ответов, которые я смог найти, что существует следующая команда: текст («метки», локатор (1)) , который, как предполагается, позволит интерактивно поместить текст с указателем мыши. Однако, когда я бегу, я получаю следующее сообщение об ошибке:

In xy.coords(x, y, recycle = TRUE) : NAs introduced by coercion 

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

##testing graph labeling 
library(igraph) 
library(ggplot2) 
library(scales) 

##making a 7-node circle graph 
sev=make_graph(c(1,2, 2,3, 3,4, 4,5, 5,6, 6,7, 7,1)) 
sev=as.undirected(sev) 
#relabel specific nodes blue 
j=1;#index of vertex to start coloring 
V(sev)$color="white"; #Need to default to white, otherwise will color all blue 
V(sev)$color[(j)%%7]="dodgerblue"; 
V(sev)$color[(j+1)%%7]="dodgerblue"; 
V(sev)$color[(j+2)%%7]="dodgerblue"; 
la<-layout.circle(sev) 
plot(sev) 
text("label",locator(1)) 

Я заранее прошу прощения за любые трудности, форматирования, я, вероятно, изменить вопрос, чтобы настроить их.

+1

Это не выглядит, как у вас есть параметры для 'текста()' в правильной форме и порядке. Что относительно 'with (locator (1), text (x, y," label "))'. Это помогло бы обеспечить [воспроизводимый пример] (http://stackoverflow.com/questions/19226816/how-can-i-view-the-source-code-for-a-function) для вашей первой попытки. Прямо сейчас «lab.locs» не определяется, если мы используем данные из – MrFlick

+2

Или еще в духе вашего кода «text (локатор (1),« label »)' У вас были только аргументы в неправильном порядке. – G5W

+0

Благодарим вас, оба этих решения являются жизнеспособными способами решения моих проблем! – BLP92

ответ

1

Глядя на ваши две версии.

Вторая версия, text(locator(1),"label") должна позволить вам поместить ярлык вручную.

Но ваша первая версия выглядела не так уж плохо. Поскольку ваша вторая версия помещает метки внутри узлов, я переместил эти метки и сделал шрифт вдвое большим, чтобы показать, как это сделать (vertex.label.cex вместо cex). Я не уверен, какого размера вы хотели, но вы должны быть в состоянии настроить отсюда.

radian.rescale <- function(x, start=0, direction=1) { 
    c.rotate <- function(x) (x + start) %% (2 * pi) * direction 
    c.rotate(scales::rescale(x, c(0, 2 * pi), range(x))) 
} 
lab.locs <- radian.rescale(x=1:n, direction=-1, start=0) 
plot(sev, layout=la, vertex.size=25, vertex.label.dist=0, 
    vertex.label.degree=lab.locs, vertex.label.color="black", 
    vertex.label.cex=2) 

Node graph

+0

Отлично, спасибо! Я закончил использовать подход локатора, но, как вы указали, vertex.label.cex также является правильным способом настройки размера метки. – BLP92

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