############################################################## ############################################################## ### Graphen - eine Einführung in Rgraphviz ### ### im Rahmen des Bachelorseminars "Graphikenen in R" ### ### von Henrik Nyhus ### ### ### ### 20. Januar 2011 ### ### Ludwig-Maximilians-Universität München ### ############################################################## ############################################################## ### 1. Installation ### ### ### ### 2. Rgraphviz - Direktes Plotten ### ### 2.1 Graphentheorie - Adjazenzmatrix in R ### ### 2.2 Nodes und Edges Anlegen ### ### 2.3 Nodes ### ### 2.3.2 Nodes: Attribute ### ### 2.3.3 Nodes: Labels ### ### 2.4 Edges ### ### 2.4.1 Edges: Labels ### ### 2.4.2 Edges: Attribute ### ### 2.4.3 Edges: Gewichtung ### ### 2.5 Rankdirection ### ### 2.6 Subgraph ### ### 2.7 Clusters ### ### ### ### 3 Rgraphviz - Rendern ### ### 3.1 Nodes und Edges anlegen ### ### 3.2 Nodes ### ### 3.2.1 Nodes: Labels ### ### 3.2.2 Nodes: Attribute ### ### 3.3 Edges ### ### 3.3.1 Edges: Attribute und Labels ### ### 3.4 Pfeile und Überschrift ### ### ### ### 4 graphNEL als .dot exportieren ### ### ### ### 5 Angepasste Nodes ### ### ### ### 6 Syntax: Graphen aus der Presentation ### ### ### ############################################################## ############################################################## # In Verbindung mit der Presenation "Graphen - eine Einführung" # Unterlagen sind hier zu erhalten # http://www.stat.uni-muenchen.de/institut/ag/leisch/teaching/seminar1011/13-graphen-4.pdf ############################################################## ############################################################## ### 1. Installation und Paket Aufrufen ############################################################## ############################################################## source("http://bioconductor.org/biocLite.R") biocLite("Rgraphviz") library("Rgraphviz") # man muss auch Graphviz externt installiert haben: # http://www.graphviz.org/ ############################################################## ### 2 Rgraphviz - Direktes Plotten ### 2.1 Graphentheorie - Adjazenmatrix ############################################################## # graphen werden über nodes (knoten) und edges (kanten) definiert. # wie das graph-objekt definiert ist, hängt vom jeweiligen paket ab. # graphen kønnen z.b in einer from-to matrix, in einer adjazenzmatrix # oder in einer indizenzmatrix gespeichert sein. # man kann z.B eine from-to matrix, in ein graphNEL-Objekt # (was man plotten kann) umwandeln. dazu muss man das paket graph aufrufen: library("graph") From <- c("A","A","C","C") To <- c("B","C","B","D") L <- cbind(From,To) # hier sieht man den from-to matrix L # jetzt als adjazenzmatrix ftM2adjM(L) # um zu plotten, muss der graph ein graphNEL objekt sein L_als_graphNEL <- ftM2graphNEL(L) L_als_graphNEL plot(L_als_graphNEL) # für die plot-funktion, muss das rgraphviz paket geladaden sein # wieder zurück als adjazenzmatrix as(L_als_graphNEL, "matrix") ############################################################## ### 2.2 Nodes und Edges anlegen ############################################################## # in diesem beispiel nehmen wir die buchstaben a bis o als nodes. # edgemode sagt ob der graph gerichtet oder ungerichtet sein soll beispiel1 <- new("graphNEL", nodes = letters[1:15], edgemode = "directed") # um dies direkt zu plotten, rufen wir die funktion plot auf # der default layout ist "dot", dh. man kann "dot" weglassen plot(beispiel1, "dot") # wir kønnen die einzellne edges selber über die funktion definieren. # zuerst wird eine verbindung zwischen a und b gezeichnet beispiel1 <- addEdge("a", "b", beispiel1) beispiel1 <- addEdge("c", "b", beispiel1) beispiel1 <- addEdge("d", "b", beispiel1) beispiel1 <- addEdge("b", "f", beispiel1) beispiel1 <- addEdge("f", "g", beispiel1) beispiel1 <- addEdge("f", "i", beispiel1) beispiel1 <- addEdge("i", "j", beispiel1) beispiel1 <- addEdge("k", "j", beispiel1) beispiel1 <- addEdge("l", "j", beispiel1) beispiel1 <- addEdge("m", "a", beispiel1) beispiel1 <- addEdge("o", "b", beispiel1) beispiel1 <- addEdge("e", "i", beispiel1) beispiel1 <- addEdge("e", "o", beispiel1) beispiel1 <- addEdge("o", "m", beispiel1) beispiel1 <- addEdge("b", "a", beispiel1) # wenn man edgemode = "undirected" zeihnet, erhält man bei "b" -> "a" ein warning # message da dies gleich "a" -> "b" ist, was schon gezeichnet wurde # noch mal plotten, mit edges. # distinct heisst, dass edges, die in beide richtungen gehen, # einzell aufgezeichnet werden (hier: zwei edges zwischen a und b) plot(beispiel1, recipEdges="distinct", "dot") # das gleich mit neato und twopi layout plot(beispiel1, "neato") plot(beispiel1, "twopi") ############################################################## ### 2.3 Nodes ### 2.3.1 Nodes: Attribute ############################################################## # in der plott-funktion kann man attribute angeben die global # gelten sollen (alle nodes), und speziell für einzellne # oder mehrere nodes. # wir definieren jeweils eine liste globalattrs = list() nodeattrs <- list() # WICHTIG: die default attribute kann man aus der folgenden # liste lesen. nicht alle funktionieren! in diesem beispiel # werde ich die meisten von den attributen angenben, die # auch tatsächlich funktionieren getDefaultAttrs() # eine liste aller erlaubte Rgraphviz attribute. viele sind # noch nicht implementiert ? GraphvizAttributes # eine erklärung der variabeln der attribute: # http://www.graphviz.org/pub/scm/graphviz2/doc/info/attrs.html # attribute die für alle nodes gelten sollen. globalattrs$node <- list(fillcolor = "grey", fontcolor = "black", shape = "rectangle", color = "blue", fixedsize = FALSE, fontsize = "80") # attribute für spezielle nodes nodeattrs$shape <- c(c = "circle", d = "plaintext", m = "ellipse") nodeattrs$color <- c(h = "red") nodeattrs$fillcolor <- c(g = "yellow") nodeattrs$fontcolor <- c(i = "white") nodeattrs$height <- c(k = "3") nodeattrs$width <- c(n = "3") # merke, dass wir jetzt die zwei listen in der plot- # funktion aufnehmen plot(beispiel1, attrs = globalattrs, nodeAttrs = nodeattrs) ############################################################## ### 2.3.2 Nodes: Labels ############################################################## # ein vektor mit den verschiedenen labels die wir angeben møchten teilnehmer <- c("Azizi", "Nguyen", "Kaldhusdal", "Kappler", "Endres", "Hutter", "Snedden", "Eifler", "Mayer", "Mittermayer", "Schlesinger", "Casalicchio", "Nyhus", "Wang", "Engelhardt") # die namen der jeweiligen stellen des vektors muss mit den des # graphen übereinstimmen names(teilnehmer) = nodes(beispiel1) # unsere labels werden auf unsere nodes-attribute liste auf # der stelle "label" zugewiesen nodeattrs$label <- teilnehmer plot(beispiel1, attrs = globalattrs, nodeAttrs = nodeattrs) ############################################################## ### 2.4 Edges ### 2.4.1 Edges: Labels ############################################################## # um die edges zu beschriften, definieren wir, genauso wie bei # den nodes, eine spezielle edges-attribut liste edgeattrs <- list() # edge liste edgeNames(beispiel1) # jetzt wissen wir wo die edge-labels hin sollen und definieren # für die jeweiligen edges die labels edgeattrs$label <- c("o~b" = "label 1", "b~f" = "label 2", "l~j" = "label 3") # wie müssen jetzt die dritte liste auch in unsere plot-funktion # angeben plot(beispiel1, attrs = globalattrs, nodeAttrs = nodeattrs, edgeAttrs = edgeattrs) ############################################################## ### 2.4.2 Edges: Attribute ############################################################## # in die gleie globale attribut-lise wie oben, definieren wir # jetzt auf der stelle "$edge" (statt $node) die globale # edge-attribute globalattrs$edge <- list(color = "brown", arrowsize = "0.7", lty = "longdash", lwd = 3, fontcolor = "darkblue") # einige der variablen (z.b. lty) stammen aus dem graphics paket. # eine liste aller graphics parameter: ? par # in der spezielle edge-attribute liste kann man für spezielle # edges attribute angeben edgeattrs$color <- c("k~j" = "black", "l~j" = "red", "i~j" = "green", "f~i" = "blue", "f~g" = "grey", "e~i" = "yellow") plot(beispiel1, attrs = globalattrs, nodeAttrs = nodeattrs, edgeAttrs = edgeattrs) ############################################################## ### 2.4.3 Edges: Gewichtung ############################################################## # mit gewichtung, werden die edges zwischen gegebenen nodes # in einem intervall [0.1,1] angegeben. eine stärke beziehung # gibt ein kurzere und geradere edge # in der edge-attribut liste werden für die jeweiligen edges # die gewichtung aufgelistet edgeattrs$weight <- c("a~b" = 1, "b~f" = 0.2, "c~b" = 1, "d~b" = 1, "e~i" = 0.7, "e~o" = 1, "f~g" = 0.3, "f~i" = 1, "i~j" = 0.9, "k~j" = 0.4, "l~j" = 0.2, "m~a" = 0.4, "o~b" = 0.7, "o~m" = 0.6) # zum veranschaulichen, geben wir die gewichtung für die gleichen # edges als label an edgeattrs$label <- edgeattrs$weight plot(beispiel1, attrs = globalattrs, nodeAttrs = nodeattrs, edgeAttrs = edgeattrs) ############################################################## ### 2.5 Rankdirection ############################################################## # mir rankdirection kønnen wir die richtung des ganzen # graphens angeben. # davor, wollen wir die gewichtungen, edge-labels und node-labels # zurücksetzen edgeattrs$weight <- NULL edgeattrs$label <- NULL nodeattrs$label <- NULL # diese parametereinstellugn gibt man in bei den globalen # attributen auf der stelle "$graph" an # TB = top bottom globalattrs$graph <- list(rankdir = "TB") plot(beispiel1, attrs = globalattrs, nodeAttrs = nodeattrs, edgeAttrs = edgeattrs) # bottom-top globalattrs$graph <- list(rankdir = "BT") plot(beispiel1, attrs = globalattrs, nodeAttrs = nodeattrs, edgeAttrs = edgeattrs) # right-left globalattrs$graph <- list(rankdir = "RL") plot(beispiel1, attrs = globalattrs, nodeAttrs = nodeattrs, edgeAttrs = edgeattrs) # left-right globalattrs$graph <- list(rankdir = "LR") plot(beispiel1, attrs = globalattrs, nodeAttrs = nodeattrs, edgeAttrs = edgeattrs) ############################################################## ### 2.6 Subgraph ############################################################## # wir kønnen subgraphs als ein für uns organisatorisches # werkzeug definieren. die elemente eines subgraphs werden # in der nähe von einander geplottet, aber nicht unbedingt # neben einander sub1 <- subGraph(c("e", "c", "j"), beispiel1) sub2 <- subGraph(c("h", "a", "m"), beispiel1) # die jeweiligen subgraphs müssen in eine liste eingetragen werden sublist <- list(list(graph=sub1, cluster = FALSE), list(graph=sub2, cluster = FALSE)) # mann muss die subliste in der plot-funktion aufnehmen plot(beispiel1, attrs = globalattrs, nodeAttrs = nodeattrs, edgeAttrs = edgeattrs, subGList = sublist) ############################################################## ### 2.7 Cluster ############################################################## # als cluster, werden die beziehung zwischen den elementen eines # subgraphs starker. theoretisch soll man ein rektangel um den # elementen malen kønnen. # man setz einfach den cluster boolean wert als TRUE sublist <- list(list(graph=sub1, cluster = TRUE), list(graph=sub2, cluster = TRUE)) plot(beispiel1, attrs = globalattrs, nodeAttrs = nodeattrs, edgeAttrs = edgeattrs, subGList = sublist) ############################################################## ############################################################## ### 3. Rgraphviz - Rendern ### 3.1 Nodes und Edges anlegen ############################################################## ############################################################## # beim rendern wird erst die nodes und edges von graphviz # ausgelegt, danach kønnen wir die einzellne parameter setzen # wie beim dirkten plotten, müssen wir unsere graphNEL objekt # definieren. jetzt probieren wir es mit vektoren statt # alles einzelln einzugeben nodes = c("bank", "name1", "kunde", "name2", "saldo", "nummer", "VISA", "name3", "PIN", "V-B", "K-V", "K-B") from = c(rep("bank", 3), rep("kunde", 5), rep("VISA", 4)) to = c("name1", "K-B", "V-B", "name2", "K-B", "K-V", "nummer", "saldo", "name3", "K-V", "V-B", "PIN") beispiel2 <- new("graphNEL", nodes = nodes) beispiel2 <- addEdge(from, to, beispiel2) # bis jetzt ist war alles gleich # jetzt gibt rgraphviz den graphen an graphviz weiter # hier als "neato" ausgelegt beispiel2 <- layoutGraph(beispiel2, layoutType = "neato") # der graph wird mit folgendem funktion geplottet renderGraph(beispiel2) ############################################################## ### 3.2 Nodes ### 3.2.1 Nodes: Labels ############################################################## # um einzellne labels in den nodes zu definiren, muss man erst # alle einen "default" label geben, sonst werden alle die man # nicht spezifisch definiert hat, leer # wir sagen einfach, dass die namen der nodes gleich das was in # den jeweiligen nodes steht names(nodes) = nodes # wie beim direkte plotten, kann man alle nodes labels geben. # hier geben wir attribute für alle nodes an globalattrs_rend = list() globalattrs_rend$node <- list(label = nodes) # das gleich kønnte man so machen # nodeattrs_rend = list() # nodeattrs_rend$label <- nodes # und den kommanto nodeAttrs = nodeattrs in der layout-funktion # aufnehmen # da wir jetzt attribute angegeben haben, die in die layoutGraph # angegeben werden muss, muss man alles noch mal auslegen beispiel2 <- layoutGraph(beispiel2, attrs = globalattrs_rend, layoutType = "neato") # jetzt geben wir mit folgendem funktion, die nur für die nodes # gillt, die spezielle labels die man angeben møchte an. # wir wollten statt "name1, 2, 3" einfach "name" haben nodeRenderInfo(beispiel2) <- list(label = c(name1 = "name", name2 = "name", name3 = "name")) renderGraph(beispiel2) ############################################################## ### 3.2.2 Nodes: Attribute ############################################################## # mit der funktion grap.par bestimmen wir, wie bei der # funktion attrs beim direkten plotten, die globale attribute # für die nodes und edges # die møglich attribute sind theoretisch die gleichen wie beim # direkten plotten (siehe oben) graph.par(list(nodes = list(fill = "lightgray", lty = "dotted", lwd = 2))) renderGraph(beispiel2) # wir wollen jetzt für einzellne nodes, spezielle attribute # definieren mit der funktion nodeRenderInfo nodeRenderInfo(beispiel2) <- list( fontsize = c("K-V" = 10, "V-B" = 10, "K-B" = 10), shape = c("K-V" = "box", "V-B" = "box", "K-B" = "box", "bank" = "box", "kunde" = "box", "VISA" = "box"), fill = c("K-V" = "lightblue", "V-B" = "lightblue", "K-B" = "lightblue", "saldo" = "red"), lty = c("K-V" = "blank", "V-B" = "blank", "K-B" = "blank", "VISA" = "solid", "kunde" = "solid", "bank" = "solid")) # da wir jetzt den typ von node-shape ändern, was das layout # beeinflussen kønnte, müssen wir noch mal auslegen beispiel2 <- layoutGraph(beispiel2, layoutType = "neato") renderGraph(beispiel2) ############################################################## ### 3.3 Edges ### 3.3.1 Edges: Attribute und Labels ############################################################## # globale edges-attribute angeben graph.par(list(edges = list(col = "red", lty = "longdash", fontsize = 20, textCol = "blue", lwd = 2))) # spezielle edges-attribute edgeRenderInfo(beispiel2) <- list( lty = c("VISA~K-V" = "solid", "VISA~V-B" = "solid", "bank~K-B" = "solid", "bank~V-B" = "solid", "kunde~K-B" = "solid", "kunde~K-V" = "solid"), lwd = c("VISA~K-V" = 3, "VISA~V-B" = 3, "bank~K-B" = 3, "bank~V-B" = 3, "kunde~K-B" = 3, "kunde~K-V" = 3)) # edge-labels müsse wir wie beim direkten plotten angeben, # in einer besondere edegeattrs liste edgeattrs_rend = list() edgeattrs_rend$label <- c("VISA~K-V" = "n", "VISA~V-B" = "n", "bank~K-B" = "m", "bank~V-B" = "1", "kunde~K-B" = "n", "kunde~K-V" = "1") # da die edge-labels das layout beeinflussen kønnte, und da # wir sie überhaupt in unserem layout mit aufnehmen møchten, # müsse wir die layoutGraph funktion nochmal aufrufen und # die edgeattrs-liste mit aufnehmen beispiel2 <- layoutGraph(beispiel2, edgeAttrs = edgeattrs_rend, layoutType = "neato") # man kann auch, wie beim direkten plotten, subGList um # clusters abzubilden, edgemode etc. angeben renderGraph(beispiel2) ############################################################## ### 3.4 Pfeile und Überschrift ############################################################## # zuerst, wollen wir das "saldo" wieder grau ist nodeRenderInfo(beispiel2) <- list(fill = c("saldo" = "lightgray")) # in unsere grap.par funktion, geben wir unsere überschrift an graph.par(list(graph = list(main = "let's direct the edges", sub = "...and change the arrows!", cex.main = 1.5, cex.sub = 1.5, col.sub = "red"))) # bis jetzt war unser graph undirected, um die pfeile jetzt # einsetzen zu kønnen, müssen wir unser graph gerichten edgemode(beispiel2) <- "directed" # eine beschreibung der pfeile gibt es auf der graphviz seite: # http://www.graphviz.org/pub/scm/graphviz2/doc/info/attrs.html # in R kann man nur einige von den definierten pfeile benutzen # wir definieren alle pfeile edgeRenderInfo(beispiel2) <- list( arrowtail = "tee", arrowhead = c("bank~name1" = "open", "bank~K-B" = "normal", "bank~V-B" = "dot", "kunde~name2" = "odot", "kunde~K-B" = "box", "kunde~K-V" = "obox", "kunde~nummer" = "diamond", "kunde~saldo" = "odiamond", "VISA~name3" = "none", "VISA~K-V" = "open", "VISA~V-B" = "normal", "VISA~PIN" = "dot" )) # da wir jetz so viel geändert haben, müssen wir es noch mal # auslegen beispiel2 <- layoutGraph(beispiel2, layoutType = "neato") renderGraph(beispiel2) ############################################################## ############################################################## ### 4 graphNEL als .dot exportieren ############################################################## ############################################################## # wir kønnen unser graphNEL objekt in ein Ragraph objekt # transformieren mit der funktion agopen ? agopen # wir müsse alle attribute angeben. unten ist das objekt vom # beispiel 1 mit den oben genanngen attributten angegeben agopen_beispiel1 <- agopen(beispiel1, "random_name", attrs = globalattrs, edgeAttrs = edgeattrs, nodeAttrs = nodeattrs, subGList = sublist) # dies erlaubt uns, unter anderen, mit der funktion agwrite # unser objekt in .dot-sprache auszugeben ? agwrite agwrite(agopen_beispiel1, "beispiel1.dot") # man kann auch ein .dot file in R einlesen mit der # funktion agread. ein objekt der klasse Ragraph # wird angelegt ? agread # ein objekt von R als .dot, und umgekehrt führt in den # meisten fällen zu schlechten ergebnissen da die # parameter der funktionen anders definiert sind. # ganz einfache graphen (ohne definierte attribute) # gehen allerdings problemlos ############################################################## ############################################################## ### 5 Angepasste Nodes ############################################################## ############################################################## # wir kønnen auch angepasste nodes anlegen. hier ist ein beispiel # mit einem boxplot. daten der boxplots sind rnorm(100) set.seed(123) V <- letters[1:10] M <- 1:4 g1 <- randomGraph(V, M, 0.2) g1 <- layoutGraph(g1) renderGraph(g1) myNode <- function(x, col, fill, obs = rnorm(100), width = 2, ...){ b <- boxplot(obs, plot=FALSE)$stats h <- abs(b[4, 1] - b[2, 1]) w <- width low <- abs(b[1, 1] - b[2,1]) high <- abs(b[5, 1] - b[4,1]) median <- abs(b[2, 1] - b[3,1]) / h symbols( x = mean(x[,1]), y = mean(x[,2]), boxplots = cbind(w, h, low, high, median), inches = 0.5, fg = "red", bg = fill, add = TRUE) } nodeRenderInfo(g1) <- list( shape = list(d = myNode, f = myNode), fill=c(d="lightgreen", f="lightgreen"), col=c(d="blue", f="bue")) edgeRenderInfo(g1) <- list( col = "lightblue") g1 <- layoutGraph(g1) renderGraph(g1) ############################################################## ############################################################## ### 6 Graphen aus der Presentation ############################################################## ############################################################## ####################### ####################### ### Frontpage ####################### ####################### a1 <- "Graphen - eine Einfuehrung" b1 <- "Henrik Nyhus" c1 <- "Betreuer: Armin Monecke" d1 <- "im Rahmen des Bachelorseminars Graphen in R" e1 <- "Prof. Dr. Friedrich Leisch" f1 <- "Institut fuer Statistik" g1 <- "Ludwig-Maximilians-Universitaet Muenchen" h1 <- "20. Januar 2011" front <- new("graphNEL", nodes = letters[1:8], edgemode = "directed") front <- addEdge("a", "d", front) front <- addEdge("b", "c", front) front <- addEdge("c", "e", front) front <- addEdge("d", "b", front) front <- addEdge("d", "e", front) front <- addEdge("e", "f", front) front <- addEdge("e", "d", front) front <- addEdge("f", "g", front) subf1 <- subGraph(c("a", "d"), front) subf2 <- subGraph(c("c", "e"), front) sublist <- list(list(graph=subf1, cluster = TRUE), list(graph=subf2, cluster = FALSE)) var <- c(a1,b1,c1,d1,e1,f1,g1,h1) names(var) = nodes(front) nAttrs <- list() nAttrs$label <- var attrs <- list( node = list(shape = "rectangle", fixedsize = FALSE), graph = list(rankdir = "TB")) ### bare til plotten nAttrs$fillcolor <- c(a = "lightgrey", g = "#339933") nAttrs$fontsize <- c(h = "12", a = "16") # dette er den eneste som ikke går nAttrs$shape <- c(h = "plaintext") plot(front, attrs = attrs, nodeAttrs = nAttrs, subGList = sublist) ### front <- layoutGraph(front, subGList = sublist, attrs = attrs, nodeAttrs = nAttrs) nodeRenderInfo(front) <- list(fill = c(a = "lightgrey", g = "#339933"), fontsize = c(h ="12", a = "16"), shape = c(h = "plaintext")) png("front.png", width = 1024, height = 640, units = "px") renderGraph(front) dev.off() ####################### ####################### ### Nodes ####################### ####################### pres1 <- new("graphNEL", nodes = letters[1:4], edgemode = "undirected") pres1 <- layoutGraph(pres1, layoutType = "dot") nodeRenderInfo(pres1) <- list(fontsize = "10") renderGraph(pres1) png("pres1.png", width = 700, height = 250, units = "px") renderGraph(pres1) dev.off() ####################### ####################### ### Edges ####################### ####################### pres2 <- new("graphNEL", nodes = letters[1:4], edgemode = "undirected") pres2 <- addEdge("a", "b", pres2) pres2 <- addEdge("b", "c", pres2) pres2 <- addEdge("b", "d", pres2) pres2 <- addEdge("c", "d", pres2) png("pres2.png", width = 700, height = 250, units = "px") plot(pres2, attrs = list(graph = list(rankdir = "LR"), node = list(width = "2"))) dev.off() ####################### ####################### ### Directed ####################### ####################### pres3 <- new("graphNEL", nodes = letters[1:4], edgemode = "directed") pres3 <- addEdge("a", "b", pres3) pres3 <- addEdge("b", "c", pres3) pres3 <- addEdge("b", "d", pres3) pres3 <- addEdge("c", "d", pres3) pres3 <- addEdge("d", "b", pres3) png("pres3.png", width = 700, height = 250, units = "px") plot(pres3, attrs = list(graph = list(rankdir = "LR"), node = list(width = "1"))) dev.off() ####################### ####################### ### Distinct ####################### ####################### pres4 <- new("graphNEL", nodes = letters[1:4], edgemode = "directed") pres4 <- addEdge("a", "b", pres4) pres4 <- addEdge("b", "c", pres4) pres4 <- addEdge("b", "d", pres4) pres4 <- addEdge("c", "d", pres4) pres4 <- addEdge("d", "b", pres4) png("pres4.png", width = 700, height = 250, units = "px") plot(pres4, attrs = list(graph = list(rankdir = "LR"), node = list(width = "1")), recipEdges="distinct") dev.off() ####################### ####################### ### Undirected - Matrix ####################### ####################### pres5 <- new("graphNEL", nodes = letters[1:4], edgemode = "undirected") pres5 <- addEdge("a", "b", pres5) pres5 <- addEdge("b", "c", pres5) pres5 <- addEdge("b", "d", pres5) pres5 <- addEdge("c", "d", pres5) png("pres5.png", width = 700, height = 250, units = "px") plot(pres5, attrs = list(graph = list(rankdir = "LR"), node = list(width = "1"))) dev.off() ####################### ####################### ### Directed - Matrix ####################### ####################### pres6 <- new("graphNEL", nodes = letters[1:4], edgemode = "directed") pres6 <- addEdge("a", "b", pres6) pres6 <- addEdge("b", "c", pres6) pres6 <- addEdge("b", "d", pres6) pres6 <- addEdge("c", "d", pres6) png("pres6.png", width = 700, height = 250, units = "px") plot(pres6, attrs = list(graph = list(rankdir = "LR"), node = list(width = "1"))) dev.off() ####################### ####################### ### Unirected - Indizes ####################### ####################### pres7 <- new("graphNEL", nodes = letters[1:4], edgemode = "undirected") pres7 <- addEdge("a", "b", pres7) pres7 <- addEdge("b", "c", pres7) pres7 <- addEdge("b", "d", pres7) pres7 <- addEdge("c", "d", pres7) eAttrs <- list() eAttrs$label <- c("a~b"="1", "b~c"="2", "b~d"="4", "c~d"="3") attrs <- list( edge = list(fontsize = "30"), graph = list(rankdir = "LR"), node = list(width = "1")) png("pres7.png", width = 700, height = 250, units = "px") plot(pres7, attrs = attrs, edgeAttrs = eAttrs) dev.off() ####################### ####################### ### Directed - Indizes ####################### ####################### pres8 <- new("graphNEL", nodes = letters[1:4], edgemode = "directed") pres8 <- addEdge("a", "b", pres8) pres8 <- addEdge("b", "c", pres8) pres8 <- addEdge("b", "d", pres8) pres8 <- addEdge("c", "d", pres8) eAttrs <- list() eAttrs$label <- c("a~b"="1", "b~c"="2", "b~d"="4", "c~d"="3") attrs <- list( edge = list(fontsize = "30"), graph = list(rankdir = "LR"), node = list(width = "1")) png("pres8.png", width = 700, height = 250, units = "px") plot(pres8, attrs = attrs, edgeAttrs = eAttrs) dev.off() ####################### ####################### ### rgraphviz - plot ####################### ####################### b2 <- "Rgraphviz" a2 <- "graph (grid, graphics, grDevices, methods, utils)" c2 <- "Graphviz" d2 <- "Output" rplot <- new("graphNEL", nodes = letters[1:4], edgemode = "directed") rplot <- addEdge("a", "b", rplot) rplot <- addEdge("b", "c", rplot) rplot <- addEdge("c", "b", rplot) rplot <- addEdge("b", "d", rplot) var2 <- c(a2,b2,c2,d2) names(var2) = nodes(rplot) nAttrs <- list() nAttrs$label <- var2 sub <- subGraph(c("b", "d"), rplot) sublist <- list(list(graph=sub, cluster = FALSE)) eAttrs <- list() eAttrs$label <- c("a~b" = "plot anfragen", "b~c" = "nodes/edges\ninformation", "c~b" = "layout", "b~d" = "graph") attrs <- list(node = list(shape = "rectangle", fixedsize = FALSE, lwd = 2, fontsize = 32), graph = list(rankdir = "TB"), edge = list(fontsize = 40)) rplot <- layoutGraph(rplot, subGList = sublist, attrs = attrs, nodeAttrs = nAttrs, edgeAttrs = eAttrs, recipEdges = "distinct") nodeRenderInfo(rplot) <- list(fontsize = 15) edgeRenderInfo(rplot) <- list(fontsize = 20) png("pres9.png", width = 500, height = 400, units = "px") renderGraph(rplot) dev.off() ####################### ####################### ### rgraphviz - render ####################### ####################### b3 <- "Rgraphviz" a3 <- "graph (grid, graphics, grDevices, methods, utils)" c3 <- "Graphviz" d3 <- "Output" rend <- new("graphNEL", nodes = letters[1:4], edgemode = "directed") rend <- addEdge("a", "b", rend) rend <- addEdge("b", "c", rend) rend <- addEdge("c", "b", rend) rend <- addEdge("b", "d", rend) var3 <- c(a3,b3,c3,d3) names(var3) = nodes(rend) nAttrs <- list() nAttrs$label <- var3 sub <- subGraph(c("b", "d"), rend) sublist <- list(list(graph=sub, cluster = FALSE)) eAttrs <- list() eAttrs$label <- c("a~b" = "1. layout anfragen\n2. render Graph\n 3. re-render Graph", "b~c" = "nodes/edges\ninformation", "b~d" = "graph", "c~b" = "layout\nwird gespeichert") attrs <- list(node = list(shape = "rectangle", fixedsize = FALSE, lwd = 2, fontsize = 32), graph = list(rankdir = "TB"), edge = list(fontsize = 40)) rend <- layoutGraph(rend, subGList = sublist, attrs = attrs, nodeAttrs = nAttrs, edgeAttrs = eAttrs, recipEdges = "distinct") nodeRenderInfo(rend) <- list(fontsize = 15) edgeRenderInfo(rend) <- list(fontsize = 20) png("pres10.png", width = 500, height = 400, units = "px") renderGraph(rend) dev.off() ####################### ####################### ### Cluster-Graph ####################### ####################### eks <- new("graphNEL", nodes = letters[1:15], edgemode = "directed") eks <- addEdge("a", "b", eks) eks <- addEdge("c", "b", eks) eks <- addEdge("d", "b", eks) eks <- addEdge("b", "f", eks) eks <- addEdge("f", "g", eks) eks <- addEdge("f", "i", eks) eks <- addEdge("i", "j", eks) eks <- addEdge("k", "j", eks) eks <- addEdge("l", "j", eks) eks <- addEdge("m", "a", eks) eks <- addEdge("o", "b", eks) eks <- addEdge("e", "i", eks) eks <- addEdge("e", "o", eks) eks <- addEdge("o", "m", eks) eks <- addEdge("b", "a", eks) attrs <- list( node = list(fillcolor="lightblue", shape = "circle", fixedsize = FALSE), edge = list(color = "black"), graph = list(rankdir = "TB") ) png("pres11.png", width = 350, height = 400, units = "px") plot(eks, "dot", attrs = attrs, main = "dot") dev.off() png("pres12.png", width = 350, height = 400, units = "px") par(bg="#e0e0e0") plot(eks, "neato", attrs = attrs, main = "neato") dev.off() png("pres13.png", width = 350, height = 400, units = "px") plot(eks, "twopi", attrs = attrs, main = "twopi") dev.off()