2015-02-16 16 views
6

Yönlendirilmiş grafikleri köşeli hizalarla çizilen ve her köşe noktasının altına bir miktar metin ekleyen bir işlev oluşturmak istiyorum, örneğin aşağıdaki örnek çizim gibi bir şey. çizim fonksiyonu köşeler olarak pasta grafikleri işlemek gerekir, bu yüzden iki sorun var igraph: etiketleri yerleştirme ve ızgara düzenindeki boş alanı kaldırma

enter image description here

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)) 
R.

yılında igraph paketini kullandık.

  1. Neden vertex etiketi ne kadar uzun olursa, aşağıdaki örnekte olduğu gibi köşe merkezine olan uzaklık ne kadar uzun olur? Onları doğru mesafeyi elle bulup tanımlamaksızın aynı seviyede görünmeye zorlayabilir miyim? hizalanmış araziler çizdirirken

    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. nasıl boşluğu kaldırmak için? Yatay bir grafik oluşturursam, pencerenin alt kısmında çok fazla boş alan olacak. Görüntüyü daha düzleştirin, üçüncü çizimde olduğu gibi daha küçük grafik. (Grafiğin boyutu arsa dikey veya yatay herhangi pozisyon, uyabilecek şekilde belirlendiği gibi görünüyor.) Ben daha yassı girdaplar doğru boyutta tutmak için argüman asp=0 yazabilir

    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 Pencere ancak otomatik eğrilikler ve köşe etiketlerinin konumları değişir. Negatif üst kenar boşluğunu, etiket mesafelerini ve kenar eğriliğini manuel olarak ayarlayabilirim, ama tabii ki bu genel bir işlev için bir çözüm değildir. Şimdiye kadarki en iyi sonuç, ilk arsanın kodunda olduğu gibi rescale=FALSE sonucudur, ancak kenar eğrilikleri hala çok küçüktür ve daha büyük köşe noktaları ile köşelerin tamamen arkasına geçerler. (Ayrıca, değişken köşe uzaklık mesafeleriyle ilgili problem hala devam etmektedir.) autocurve.edges'un doğrudan kullanımı bana herhangi bir eğrilik vermez. Bir daha ne denemek istediğine dair bir fikrin var mı?

cevap

4

Bunu düzeltmek için, plot.igraph işlevini biraz düzeltmek isteyebilirsiniz. Bunu yapmak için trace(plot.igraph,edit=TRUE) kullanmayı deneyebilir ve işlevin kodunu değiştirebilirsiniz.

istediğini elde etmek Birkaç ipucu

: etiketler için, fonksiyonun hattı 319 geçerli:

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

Yani etiket y yerleştirme etiketin karakter sayısıyla orantılıdır, Sadece log10(nchar(labels) + 1)'u kaldırın ve etiketler aynı seviyede kalacaktır.

boyut sorunu için

, sen rescale tutmak istiyorsanız, komplo y pozisyonu tanımlanır çizgi (55

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

İstediğinizi üçüncü numarayı değiştirebilir ve arsa daha yüksek olacaktır örneğin, layout <- layout.norm(layout, -1, 1, 0, 1) will center the vertexes on 0). You can also change the margins by changing the par` ayarları.

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

ve arsa par(mar=oldMargins)

sonra bu ben düzeltmelerden sonra bu kodu kullanarak elde komplodur: Örneğin yapabilirdi enter image description here

ben yapmak eksenleri bıraktı Yumruğunuzda herhangi bir değer verilmediği için çimdiklemeyi kolaylaştırır ve turtaları çıkarırsınız. Eğer R yeniden başlattığınızda

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) 

, işleve yapılan tüm değişiklikler silinecektir ya da orijinal işlevine geri dönmek için untrace kullanabilirsiniz. Daha fazla bilgi için this post'a bakabilirsiniz.