2016-08-17 2 views
1

ich auf einer Visualisierung politischer Bücher über Amazon gekauft zusammen mit R und IGRAPH arbeite. Ich bin in der Lage gewesen, den Netzwerkgraphen in einer Form zu erhalten, die zeigt, wie bestimmte Bücher in eine Position fallen, die anzeigt, dass sie nicht nur von Leuten gekauft wurden, die nur andere Bücher mit der gleichen politischen Perspektive kauften. Hier ist der Graph:Zunehmende Räume zwischen Eckpunkten für R IGRAPH

Mein Problem ist, dass mit all den Büchern in dem engeren Cluster, ist es ziemlich unmöglich ist, die Etiketten zu lesen. Ich würde gerne diese Cluster erweitern, wenn ich könnte, ohne die mittlere Position der wenigen Titel zu verdecken, die die Cluster verbinden.

Hat jemand irgendwelche Ideen, wie ich könnte dies getan?

Um diese Grafik zu erzeugen, las ich in this data als gml Datei und hat dann die folgende:

g<-read.graph("data/polbooks/polbooks.gml", format=c("gml")) 
V(g)$degree <- degree(g, mode="all") 
cut.off <- mean(V(g)$degree) 
sub <- induced_subgraph(g, which(V(g)$degree>cut.off)) 
plot(sub, vertex.shape="none", vertex.size=1,  
    vertex.label.color=ifelse(V(sub)$value=="l", "blue", "red"), 
    layout=layout_with_fr) 

Ich habe mehrere der eingebauten in Layouts versucht, aber keiner von ihnen wirklich produzieren das gewünschte Ergebnis.

+0

Wenn ich Ihren Code ausführen bekomme ich einen Fehler 'Fehler im Text. Standard (x, y, Etiketten = Etiketten, col = Etikett.Farbe, Familie = Etikett.Familie,: Null-Länge 'Etiketten' Spezifi ed. Ich bin mir nicht sicher, ob das Problem an meinem Ende ist oder ob etwas fehlt. Wenn Sie eine saubere Sitzung starten, wird der von Ihnen gepostete Code ohne Fehler auf Ihrem System ausgeführt? – eipi10

+0

Es gab einen Tippfehler in der vierten Zeile, den ich behoben habe. Versuch es noch einmal. Natürlich können sich Ihre Daten auch an einer anderen Stelle in der ersten Zeile befinden. – fraxture

+0

Datenposition war kein Problem. Ich werde Sie wissen lassen, ob ich eine Lösung gefunden habe. – eipi10

Antwort

3

Hier ist, was ich in einem Versuch gemacht habe, die Lesbarkeit des Diagramms zu verbessern:

  1. Wrapped langen Buchtitel.

  2. die Schriftgröße geschrumpft.

  3. Set ein Samen, so dass Layouts reproduzierbar sind, so dass Sie „random“ Layouts halten, die Sie mögen.

  4. Gebrauchte Graph Layout-Code von einem anderen SO beantworten Knoten Trennung zu erhöhen. Hier

ist die Umsetzung:

## Function to wrap long strings 
# Source: http://stackoverflow.com/a/7367534/496488 
wrap_strings <- function(vector_of_strings,width){ 
    as.character(sapply(vector_of_strings, FUN=function(x){ 
         paste(strwrap(x, width=width), collapse="\n") 
         })) 
    } 

# Apply the function to wrap the node labels 
V(sub)$label = wrap_strings(V(sub)$label, 12) 

## Shrink font 
V(sub)$label.cex = 0.8 

# Function to increase node separation (for explanatory details, see the link below) 
# Source: http://stackoverflow.com/a/28722680/496488 
layout.by.attr <- function(graph, wc, cluster.strength=1,layout=layout.auto) { 
    g <- graph.edgelist(get.edgelist(graph)) # create a lightweight copy of graph w/o the attributes. 
    E(g)$weight <- 1 

    attr <- cbind(id=1:vcount(g), val=wc) 
    g <- g + vertices(unique(attr[,2])) + igraph::edges(unlist(t(attr)), weight=cluster.strength) 

    l <- layout(g, weights=E(g)$weight)[1:vcount(graph),] 
    return(l) 
} 

## Make layout reproducible. Different values will produce different layouts, 
## but setting a seed will allow you to reproduce a layout if you like it. 
set.seed(3) 

Nun wollen wir den Graphen zeichnen:

plot(sub, vertex.shape="none", vertex.size=1,  
    vertex.label.color=ifelse(V(sub)$value=="l", "blue", "red"), 
    layout=layout.by.attr(sub, wc=1)) 

enter image description here

+0

Große Antwort. Vielen Dank! – fraxture

Verwandte Themen