rigraphknitrtkplot

tkplot in latex via knitr and igraph


This may be a wild strange dream. I dreampt that I could put a tkplot from igraph inside a latex document via knitr. I know Yihui is know for animation stuff so I thought maybe this is possible. A google search didn't show what I was after so here's a non working attempt:

\documentclass[a4paper]{scrartcl}
\begin{document}

<<setup, include=FALSE, cache=FALSE>>=
library(igraph)
@

<<network>>=
edges <- structure(c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 
    "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "A", "B", "C", 
    "D", "E", "F", "G", "H", "I", "J", "E", "G", "G", "F", "H", "G", 
    "D", "J", "J", "D", "B", "C", "D", "I", "I", "H", "A", "B", "G", 
    "I", "F", "D", "F", "J", "D", "B", "E", "E", "A", "E"), .Dim = c(30L, 
    2L), .Dimnames = list(NULL, c("person", "choice")))

g <- graph.data.frame(edges, directed=TRUE)
tkplot(g)
@ 

\end{document}

Solution

  • OK, a quick and dirty answer:

    \documentclass{article}
    \begin{document}
    
    <<setup, include=FALSE, cache=FALSE>>=
    library(igraph)
    library(tcltk)
    knit_hooks$set(igraph = function(before, options, envir) {
      if (before) return()
      path = knitr:::fig_path('.eps')
      tkpostscript(igraph:::.tkplot.get(options$igraph)$canvas,
                         file = path)
      sprintf('\\includegraphics{%s}', path)
    })
    @
    
    <<network, igraph=1>>=
    edges <- structure(c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 
        "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "A", "B", "C", 
        "D", "E", "F", "G", "H", "I", "J", "E", "G", "G", "F", "H", "G", 
        "D", "J", "J", "D", "B", "C", "D", "I", "I", "H", "A", "B", "G", 
        "I", "F", "D", "F", "J", "D", "B", "E", "E", "A", "E"), .Dim = c(30L, 
        2L), .Dimnames = list(NULL, c("person", "choice")))
    
    g <- graph.data.frame(edges, directed=TRUE)
    tkplot(g)
    @ 
    
    \end{document}
    

    Feel free to polish it with hook_plot_custom.