Loris Bennett
2015-Sep-01 10:11 UTC
[R] igraph tree: increase vertex separation within tier
Hi, I am collecting data about network errors and would like to visualise the results in some sort of graph which reflects the hierarchy of the components in the network (i.e. core switches are connected to leaf switches and nodes are connected to leaf switches). The errors are in file which looks something like this: -------- 2015-07-15;coreswitch01;1;0 2015-07-15;coreswitch01;2;0 2015-07-15;leafswitch01;1;0 2015-07-15;leafswitch01;2;0 2015-07-15;leafswitch01;3;0 2015-07-15;leafswitch01;4;0 2015-07-15;leafswitch01;5;0 2015-07-15;leafswitch02;1;0 2015-07-15;leafswitch02;2;0 2015-07-15;leafswitch02;3;0 2015-07-15;leafswitch02;4;0 2015-07-15;leafswitch02;5;0 2015-07-15;leafswitch02;2;561 2015-07-15;node001;1;0 2015-07-15;node002;1;0 2015-07-15;node003;1;0 2015-07-15;node004;1;3 2015-07-15;node005;1;10529 2015-07-15;node007;1;0 2015-07-15;node008;1;2081 -------- and the topology file, which relates ports to ports and ports to multiport components, looks something like this: -------- coreswitch01;coreswitch01_01 coreswitch01;coreswitch01_02 leafswitch01;leafswitch01_01 leafswitch01;leafswitch01_02 leafswitch01;leafswitch01_03 leafswitch01;leafswitch01_04 leafswitch01;leafswitch01_05 leafswitch02;leafswitch02_01 leafswitch02;leafswitch02_02 leafswitch02;leafswitch02_03 leafswitch02;leafswitch02_04 leafswitch02;leafswitch02_05 coreswitch01_01;leafswitch01_01 coreswitch01_02;leafswitch02_01 leafswitch01_02;node001_01 leafswitch01_03;node002_01 leafswitch01_04;node003_01 leafswitch01_05;node004_01 leafswitch02_02;node005_01 leafswitch02_03;node006_01 leafswitch02_04;node007_01 leafswitch02_05;node008_01 -------- I'm plotting the data with the following: -------- library("igraph") error_data <- read.csv(file="errors.csv",head=FALSE,sep=";") colnames(error_data) <- c("datetime","name","portnumber","generic_error"); topo_data <- read.csv(file="topology.csv",head=FALSE,sep=";") G <-graph.data.frame(topo_data, directed=F) error_counter <- 'generic_error' error_counter_max <- max(error_data[,error_counter]) vcolours <- 100 - round(99*error_data[,error_counter]/error_counter_max) hc100 <- heat.colors(100) vcolour_values <- hc100[vcolours] l <- layout_(G,as_tree(root=c(1),rootlevel=c(1))) plot(G, layout = l, vertex.shape = "rectangle", vertex.color=vcolour_values) -------- This produces roughly what I want. However, even with this subset of the full network, there is quite a lot of overlapping of vertex labels within the lowest tier. The full data set has over 100 vertices on the lowest tier, which causes the labels to become illegible. I can adjust the aspect ratio of the plot and/or the canvas, but this doesn't affect the separation between the vertices. Does anyone have any advice about how to display such information? (Completely different approaches also welcome.) Cheers, Loris -- This signature is currently under construction.
Loris Bennett
2015-Sep-14 15:05 UTC
[R] igraph tree: increase vertex separation within tier (self-contained example)
Loris Bennett <loris.bennett at fu-berlin.de> writes:> Hi, > > I am collecting data about network errors and would like to visualise > the results in some sort of graph which reflects the hierarchy of the > components in the network (i.e. core switches are connected to leaf > switches and nodes are connected to leaf switches). > > The errors are in file which looks something like this: > > -------- > 2015-07-15;coreswitch01;1;0 > 2015-07-15;coreswitch01;2;0 > 2015-07-15;leafswitch01;1;0 > 2015-07-15;leafswitch01;2;0 > 2015-07-15;leafswitch01;3;0 > 2015-07-15;leafswitch01;4;0 > 2015-07-15;leafswitch01;5;0 > 2015-07-15;leafswitch02;1;0 > 2015-07-15;leafswitch02;2;0 > 2015-07-15;leafswitch02;3;0 > 2015-07-15;leafswitch02;4;0 > 2015-07-15;leafswitch02;5;0 > 2015-07-15;leafswitch02;2;561 > 2015-07-15;node001;1;0 > 2015-07-15;node002;1;0 > 2015-07-15;node003;1;0 > 2015-07-15;node004;1;3 > 2015-07-15;node005;1;10529 > 2015-07-15;node007;1;0 > 2015-07-15;node008;1;2081 > -------- > > and the topology file, which relates ports to ports and ports to > multiport components, looks something like this: > > -------- > coreswitch01;coreswitch01_01 > coreswitch01;coreswitch01_02 > leafswitch01;leafswitch01_01 > leafswitch01;leafswitch01_02 > leafswitch01;leafswitch01_03 > leafswitch01;leafswitch01_04 > leafswitch01;leafswitch01_05 > leafswitch02;leafswitch02_01 > leafswitch02;leafswitch02_02 > leafswitch02;leafswitch02_03 > leafswitch02;leafswitch02_04 > leafswitch02;leafswitch02_05 > coreswitch01_01;leafswitch01_01 > coreswitch01_02;leafswitch02_01 > leafswitch01_02;node001_01 > leafswitch01_03;node002_01 > leafswitch01_04;node003_01 > leafswitch01_05;node004_01 > leafswitch02_02;node005_01 > leafswitch02_03;node006_01 > leafswitch02_04;node007_01 > leafswitch02_05;node008_01 > -------- > > > I'm plotting the data with the following: > > -------- > library("igraph") > > error_data <- read.csv(file="errors.csv",head=FALSE,sep=";") > colnames(error_data) <- c("datetime","name","portnumber","generic_error"); > > topo_data <- read.csv(file="topology.csv",head=FALSE,sep=";") > G <-graph.data.frame(topo_data, directed=F) > > error_counter <- 'generic_error' > error_counter_max <- max(error_data[,error_counter]) > > vcolours <- 100 - round(99*error_data[,error_counter]/error_counter_max) > hc100 <- heat.colors(100) > vcolour_values <- hc100[vcolours] > > l <- layout_(G,as_tree(root=c(1),rootlevel=c(1))) > > plot(G, layout = l, vertex.shape = "rectangle", vertex.color=vcolour_values) > -------- > > This produces roughly what I want. However, even with this subset of > the full network, there is quite a lot of overlapping of vertex labels > within the lowest tier. The full data set has over 100 vertices on the > lowest tier, which causes the labels to become illegible. I can adjust > the aspect ratio of the plot and/or the canvas, but this doesn't affect > the separation between the vertices. > > Does anyone have any advice about how to display such information? > (Completely different approaches also welcome.) > > Cheers, > > LorisHere's a self-contained version of the above: ======= library("igraph") error_data <- structure(list(datetime = structure(c(1L, 1L, 1L, 1L, 1L, 1L,1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "2015-07-15", class = "factor"),name = structure(c(1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L,3L, 3L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), .Label = c("coreswitch01","leafswitch01", "leafswitch02", "node001", "node002", "node003","node004", "node005", "node007", "node008"), class = "factor"),portnumber = c(1L, 2L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L,5L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), generic_error = c(0L,0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 561L, 0L, 0L,0L, 3L, 10529L, 0L, 2081L)), .Names = c("datetime", "name","portnumber", "generic_error"), class = "data.frame", row.names = c(NA,-20L)) colnames(error_data) <- c("datetime","name","portnumber","generic_error"); #topo_data <- read.csv(file="topology.csv",head=FALSE,sep=";") topo_data <- structure(list(V1 = structure(c(1L, 1L, 4L, 4L, 4L, 4L, 4L, 9L, 9L, 9L, 9L, 9L, 2L, 3L, 5L, 6L, 7L, 8L, 10L, 11L, 12L, 13L), .Label = c("coreswitch01", "coreswitch01_01", "coreswitch01_02", "leafswitch01", "leafswitch01_02", "leafswitch01_03", "leafswitch01_04", "leafswitch01_05", "leafswitch02", "leafswitch02_02", "leafswitch02_03", "leafswitch02_04", "leafswitch02_05"), class = "factor"), V2 = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 3L, 8L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L), .Label = c("coreswitch01_01", "coreswitch01_02", "leafswitch01_01", "leafswitch01_02", "leafswitch01_03", "leafswitch01_04", "leafswitch01_05", "leafswitch02_01", "leafswitch02_02", "leafswitch02_03", "leafswitch02_04", "leafswitch02_05", "node001_01", "node002_01", "node003_01", "node004_01", "node005_01", "node006_01", "node007_01", "node008_01"), class = "factor")), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, -22L)) G <-graph.data.frame(topo_data, directed=F) error_counter <- 'generic_error' error_counter_max <- max(error_data[,error_counter]) vcolours <- 100 - round(99*error_data[,error_counter]/error_counter_max) hc100 <- heat.colors(100) vcolour_values <- hc100[vcolours] l <- layout_(G,as_tree(root=c(1),rootlevel=c(1))) plot(G, layout = l, vertex.shape = "rectangle", vertex.color=vcolour_values) ======= The question is how the aspect ratio can be changed to prevent the node labels overlapping. An ideal solution would accommodate around 100 nodes on the lowest tier of the diagram. Cheers, Loris -- This signature is currently under construction.