2015-02-16 13 views
6

Chcę utworzyć funkcję, która kreśli skierowane wykresy z wyrównanymi wierzchołkami i dodaje trochę tekstu poniżej każdego wierzchołka, tj. Coś jak przykładowy wykres poniżej. Funkcja kreślenia powinien być w stanie obsługiwać wykresy kołowe jak wierzchołków, więc użyłem igraph pakiet w R.igraph: pozycjonowanie etykiet i usuwanie pustej przestrzeni w układzie siatki

adjm <- matrix(c(0,1,0,1, 
       0,0,1,1, 
       0,0,0,1, 
       0,0,0,0), nrow=4, byrow=TRUE) 

g1 <- graph.adjacency(adjm, mode="directed") 

values <- lapply(1:4, function(x) sample(1:4,4)) 

windows(width=7, height=3.5) 

plot(g1, layout=layout.grid(g1, width=4), 
    vertex.shape="pie", vertex.pie=values, 
    vertex.pie.color=list(heat.colors(4)), 
    edge.curved=TRUE, 
    vertex.label=LETTERS[1:4], vertex.size=50, 
    vertex.label.dist=5, vertex.label.degree=pi/2, 
    edge.label=1:5, rescale=FALSE, 
    xlim=c(-0.2,3.5), ylim=c(0,0.5)) 

enter image description here

Mam dwa problemy.

  1. Dlaczego im dłuższa jest etykieta wierzchołka, tym dłuższa odległość do środka wierzchołka, jak w poniższym przykładzie? Czy mogę zmusić ich do pojawienia się na tym samym poziomie bez ręcznego znajdowania i określania ich na odpowiednią odległość?

    windows(width=7, height=3.5) 
    
    plot(g1, layout=layout.grid(g1, width=4), 
        vertex.shape="pie", vertex.pie=values, 
        vertex.pie.color=list(heat.colors(4)), 
        edge.curved=TRUE, 
        vertex.label=c("A", "AA", "AAAA", "AAAAAA"), vertex.size=50, 
        vertex.label.dist=5, vertex.label.degree=pi/2, 
        edge.label=1:5, rescale=FALSE, 
        xlim=c(-0.2,3.5), ylim=c(0,0.5)) 
    

    enter image description here

  2. Jak usunąć pustą przestrzeń podczas kreślenia wyrównane działek? Jeśli wykonam poziomy wykres, zostanie on umieszczony w dolnej części okna z dużą ilością pustego miejsca. Im bardziej płaski obraz, tym mniejszy wykres, jak w trzecim spisku. (Wydaje się, że wielkość wykresu jest określona tak, że fabuła będzie zmieścić się w każdej pozycji pionowej lub poziomej.)

    plot(g1, layout=layout.grid(g1, width=4), 
        vertex.shape="pie", vertex.pie=values, 
        vertex.pie.color=list(heat.colors(4)), 
        edge.curved=TRUE, 
        vertex.label=c("A", "AA", "AAAA", "AAAAAA"), vertex.size=20, 
        vertex.label.dist=2, vertex.label.degree=pi/2, edge.label=1:5) 
    

    enter image description here mogę napisać argumentu asp=0 zachować wierzchołki odpowiedni rozmiar w płaski okna, ale zmieniają się automatyczne zakrzywienia i pozycje etykiet wierzchołków. Mogę ręcznie poprawić ujemny górny margines, odległości etykiet i krzywiznę krawędzi, ale oczywiście nie jest to rozwiązanie dla ogólnej funkcji. Najlepszy wynik do tej pory był wynikiem rescale=FALSE jak w kodzie pierwszego wykresu, ale krzywizny krawędzi są nadal zbyt małe i przy większych wierzchołkach dostają się całkowicie za wierzchołki. (Problem z różnymi odległościami w etykietach wierzchołków wciąż pozostaje.) Bezpośrednie użycie autocurve.edges nie daje mi żadnej krzywizny. Jakieś pomysły na następne próby?

Odpowiedz

4

Aby to naprawić, może być konieczne poprawienie funkcji plot.igraph. Aby to zrobić, możesz eksperymentować używając trace(plot.igraph,edit=TRUE) i zmodyfikować kod funkcji.

kilka wskazówek, aby uzyskać to, co chcesz: Na etykietach, linia 319 funkcji jest:

y <- layout[, 2] + label.dist * sin(-label.degree) * (vertex.size + 6 * 8 * log10(nchar(labels) + 1))/200 

więc umieszczanie etykiet y jest proporcjonalna do liczby znaków etykiety, po prostu usuń log10(nchar(labels) + 1), a etykiety pozostaną na tym samym poziomie.

do wydania rozmiar, jeśli chcesz zachować rescale pozycja y działki jest określona linia 55

layout <- layout.norm(layout, -1, 1, -1, 1) 

Można zmienić trzeci numer, aby cokolwiek chcecie, a fabuła będzie wyższa (na przykład layout <- layout.norm(layout, -1, 1, 0, 1) will center the vertexes on 0). You can also change the margins by changing the ustawienia par.Można na przykład zrobić:

oldMargins<-par("mar") 
par(mar=c(10,4,4,4)) 

i po działce par(mar=oldMargins)

Jest to działka zostanę przy użyciu tego kodu po korektach:

enter image description here

Wyszedłem osie, aby łatwiej jest poprawić i usunąć ciasta, ponieważ w twoim poście nie podano wartości.

oldMargins<-par("mar") 
par(mar=c(10,4,4,4)) 
plot(g1, layout=layout.grid(g1, width=4), 
    vertex.pie.color=list(heat.colors(4)), 
    edge.curved=TRUE, 
    vertex.label=c("A", "AA", "AAAA", "AAAAAA"), vertex.size=20, 
    vertex.label.dist=1, vertex.label.degree=pi/2, edge.label=1:5,axes=TRUE, 
    ylim=c(-0.5,0.5),xlim=c(-1,1)) 
par(mar=oldMargins) 

Po ponownym uruchomieniu R, wszelkie zmiany wprowadzone do funkcji zostaną usunięte, lub użyć untrace wrócić do pierwotnej funkcji. Aby uzyskać więcej informacji, patrz: this post.

Powiązane problemy