2012-03-27 4 views
1

Рассмотрим график очень простого неориентированного графика, созданного с помощью igraph.Сюжет неориентированной igraph показывает промежутки между краем и вершиной на одном конце края

library(igraph) 

edges = matrix(c(1,2), nrow=1, ncol=2) 
g = graph.edgelist(edges, directed=FALSE) 
set.seed(42) 
plot(g, edge.width=2, vertex.size=30, edge.color='black', main='') 

Существует небольшой зазор между краем и вершиной 2, но не между краем и вершины 1. Есть ли способ удалить этот пробел?

График, с которым я действительно работаю, больше и края много короче. Хотя этот пробел почти не замечен в приведенном выше примере, это запутывает в моем случае.

+0

Это работает для меня хорошо для меня. Я действительно знаю, что то, что вы описываете, имеет тенденцию происходить, если вы пытаетесь построить сюжет в области без квадратов, но я не помню, как вы на самом деле это делаете. Связанный, вы можете попробовать мою библиотеку пакетов («qgraph»), qgraph (edge), в которой это поведение не должно происходить. –

+1

Я вижу проблему под Windows. Разрыв увеличивается по размеру при изменении размера окна. В этом случае это очень маленький пробел, но я ценю ваши усилия для совершенствования. Не могли бы вы использовать 'layout()' (функция 'igraph') для возврата координат вершин, а затем построить собственный график с нуля. Сначала зачеркните края, а затем вершины сверху. – digitalmaps

+0

Может быть ошибкой. Btw. если вы измените размер сюжета, тогда лучше всего перерисовать его, потому что масштабирование может увеличивать ошибки округления. Лучше сообщать об ошибках igraph на странице https://bugs.launchpad.net/igraph. –

ответ

1

Это действительно ошибка в igraph, и это происходит потому, что igraph оставляет там какое-то пространство для стрелы, даже если стрелочной головки нет. Я исправлю это в следующей версии играфа.

Как обходной путь, вы можете сделать, чтобы каждый отрезок дважды, друг на друга. Для этого вам нужно сделать свой график направленным, а затем использовать опцию edge.arrow.mode, чтобы избежать стрелок. Это работает, потому что только один конец края изменяется с помощью плоттера стрелок. Немного глупо, чтобы строить ваши графики таким образом, но я пока не могу найти лучшего обходного пути. Как я уже сказал, новая версия (после 0.6.4) не будет иметь этой проблемы.

library(igraph) 

# Zoom in on the critical region, although the gap always has the 
# same size, unless you make the plotting window bigger 
g <- graph(c(1,2), directed=FALSE) 
par(mar=c(0,0,0,0)) 
plot(g, edge.width=2, vertex.size=20, edge.color='black', main='', 
    rescale=FALSE, xlim=c(0.9,1), ylim=c(0.9,1), 
    layout=rbind(c(0,0), c(1,1)), vertex.color="#ffffff11") 

gap

# This plot should have no gaps 
g2 <- as.directed(g, mode="mutual") 
par(mar=c(0,0,0,0)) 
plot(g2, edge.width=2, vertex.size=20, edge.color='black', main='', 
    rescale=FALSE, xlim=c(0.9,1), ylim=c(0.9,1), 
    layout=rbind(c(0,0), c(1,1)), vertex.color="#ffffff11", 
    edge.arrow.mode="-") 

no gap

+0

Спасибо за обходной путь! Это отлично работает для меня! – severin

1

Я прочитал страницу ?igraph и увидел рекомендацию использовать «красивое сглаженное устройство Cairo» ?igraph.

Итак, я попытался

library(Cairo) 
Cairo(1600, 1600, file="plot.png", type="png", bg="white") 
plot(g, edge.width=2, vertex.size=30, edge.color='black', main='') 
dev.off() 

и,

CairoPDF("plot.pdf", 6, 6, bg="transparent") 
plot(g, edge.width=2, vertex.size=30, edge.color='black', main='') 
dev.off() 

Как PNG и PDF версия выглядеть там не маленький разрыв.

Дайте мне знать, если это сработает для вас.

+0

Спасибо, что указали это! Я не пробовал, потому что на самом деле я использую устройство [tikz] (http://pgf.sourceforge.net/), которое также создает пробел. – severin

+0

@severin, и из того, что вы пишете, я предполагаю, что вы не можете использовать решение выше, но нужно использовать tikz-решение? –

+0

почему-то я пропустил ваш вопрос в прошлом году. Сожалею! Да, к сожалению, я должен использовать устройство tikz. – severin