2

I use diagrammeR library in R to create and render binary trees. I find it very simple to use and it creates high quality renders. However creating a tree that is not fully (perfect) generates messy renders.

Here is what I get when my tree has 16 leaves (h = 4): Fully binary tree

To be clear, every node label is the row name of nodes data.frame which indicates the sequence of nodes passed to the graph:

nodes$label = rownames(nodes)

And here is what I get if I add one node [32] from node [31] - either manually or by add_node() and add_edge() functions: Non-perfect binary tree

As you can see, everything goes messy. I would like to have node [32] directly under node [31] with edge of straight vertical line. Is it even possible with this library? I can't figure out the proper order of nodes in nodes data.frame.

Here is how my full code looks like:

library(DiagrammeR)

from = c(1, 1, 2, 2, 3, 3, 4, 4, 7, 7, 10, 10, 11, 11, 14, 14, 17, 17, 18, 18, 19, 19, 22, 22, 25, 25, 26, 26, 29, 29)
to = c(2, 17, 3, 10, 4, 7, 5, 6, 8, 9, 11, 14, 12, 13, 15, 16, 18, 25, 19, 22, 20, 21, 23, 24, 26, 29, 27, 28, 30, 31)

h=4
n = 2^(h+1)-1

edges = data.frame(from, to)
nodes = data.frame(id = 1:n, label=1:n, shape='circle')

g1 = create_graph(nodes, edges)
render_graph(g1, layout='tree', title='g1')

# add node [32] and edge [31-32]

edges2 = rbind(edges, c(31, 32))
nodes2 = nodes
nodes2[32, 1:2] = 32
nodes2[32, 3] = 'circle'

g2 = create_graph(nodes2, edges2)
render_graph(g2, layout='tree', title='g2')
lmo
  • 37,904
  • 9
  • 56
  • 69
Karol Daniluk
  • 506
  • 4
  • 10

0 Answers0