tkplot в латексе через Knitr и igraph

Это может быть дикий странный сон. Я мечтал, что смогу поместить tkplot из igraph в латексный документ через knitr. Я знаю, что Yihui известен своими анимационными вещами, поэтому я подумал, что, возможно, это возможно. Поиск в Google не показал, что мне нужно, поэтому вот нерабочая попытка:

\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}

person Tyler Rinker    schedule 10.10.2012    source источник
comment
должно быть возможно, но у меня нет времени написать ответ; ключ в том, чтобы вызвать tkplot.export.postscript в ловушке чанка; посмотрите, как я определил hook_rgl для захвата графика rgl: github.com /yihui/knitr/blob/master/R/hooks-extra.R   -  person Yihui Xie    schedule 10.10.2012
comment
@Yihui Спасибо за ваш ответ. Является ли hook_rgl моментальным снимком или анимация встроена в выходной файл PDF?   -  person Tyler Rinker    schedule 10.10.2012
comment
Могу я спросить вас, почему вы хотите это сделать? Что еще есть у tkplot по сравнению с простым plot? Вы можете сделать фон plot(), если хотите. :)   -  person Gabor Csardi    schedule 10.10.2012
comment
@Gabor, tkplot можно манипулировать. т.е. это квази анимация.   -  person Tyler Rinker    schedule 10.10.2012
comment
Хм, я все еще не понимаю, извините. Хорошо, этим можно манипулировать. Но вы хотите поместить это в PDF, верно? Вам бы анимированный сюжет в PDF? Действительно? Или вы просто хотите иметь несколько снимков сети в формате PDF? Потому что последнее можно сделать и с plot().   -  person Gabor Csardi    schedule 10.10.2012
comment
@ Габор, извини, я не ясно выразил свои мысли. К чему вы клоните, так это мой вопрос; могу ли я поместить управляемый сюжет из вашего пакета в pdf? Я хочу, чтобы читатель статьи мог взаимодействовать с графиком так же, как я, когда я использую tkplot, так как иногда сетевой график может запутаться. Статический сюжет может скрывать то, что позволяет вам увидеть управляемый сюжет. Я предполагаю, что это сумасшествие, но идея кажется довольно хорошей, особенно когда журналы начинают появляться в Интернете, было бы неплохо, если бы читатель мог взаимодействовать.   -  person Tyler Rinker    schedule 10.10.2012
comment
@TylerRinker Понятно. Это было бы действительно круто! Посмотрите на это: tinyurl.com/7ae3awm PDF-файл находится внизу, и вам потребуется Adobe Reader. Это не будет работать с tkplot(), потому что AFAIK не поддерживает Tcl/Tk в PDF-файлах. Но было бы, наверное, не слишком сложно собрать что-то подобное, просто чтобы просматривать и летать по сети в 3D, используя JavaScript. Если вы хотите перемещать вершины/ребра по отдельности, это намного сложнее, вам нужно будет переопределить tkplot() в JavaScript. Вы можете отправить запрос функции здесь: :) bugs.launchpad.net/igraph   -  person Gabor Csardi    schedule 10.10.2012


Ответы (1)


Хорошо, быстрый и грязный ответ:

\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}

Не стесняйтесь полировать его с помощью hook_plot_custom.

person Yihui Xie    schedule 12.10.2012
comment
Я бы хотел использовать диаграммы Diagrammer с Knitr, но это не работает, некоторые люди говорят, что это из-за использования htmlwidgets. Знаете ли вы решение или какой-либо другой пакет для упрощения создания диаграмм с помощью R+knitr -> latex или pdf? - person skan; 29.10.2015