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))
Mam dwa problemy.
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))
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)
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ł wynikiemrescale=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życieautocurve.edges
nie daje mi żadnej krzywizny. Jakieś pomysły na następne próby?