2012-06-14 11 views
10

jest prosty sposób (np. Poprzez opcję porcji), aby uzyskać kod źródłowy kawałka i wykres, który produkuje obok siebie, jak na stronie 8 (między innymi) z this document?knitr - Jak wyrównać kod i wykres obok siebie

Próbowałem użyć out.width="0.5\\textwidth", fig.align='right', która sprawia, że ​​wykres poprawnie zajmuje tylko połowę strony i wyrównany do prawej, ale kod źródłowy jest wyświetlany na wierzchu, co jest normalnym zachowaniem. Chciałbym go mieć po lewej stronie działki.

Dzięki kod

Próbka:

<<someplot, out.width="0.5\\textwidth", fig.align='right'>>= 
plot(1:10) 
@ 
+0

To prezentacja została najprawdopodobniej wprowadzone wraz z rzutnik wykorzystaniem kolumn '\ {}' środowiska. Czy próbujesz tego samego z beamerem w LaTeXie lub renderujesz za pomocą innego silnika (zwykły LaTeX, itp.)? –

+3

@GavinSimpson poprawne, [Użyłem '\ columns'] (https://github.com/baptiste/talks/blob/master/ggplot/presentation.rnw) – baptiste

+0

w standardowym dokumencie lateksowym, użyłbym' minipage' zamiast – baptiste

Odpowiedz

2

Można wyświetlić tekst w '' z PerformanceAnalytics textplot opakowaniu lub gplots.

(Mała) minusem: Według mojej wiedzy nie ma możliwości podświetlania składni.

Przykładowy kod:

```{r fig.width=8, fig.height=5, fig.keep = 'last', echo=FALSE} 
suppressMessages(library(PerformanceAnalytics)) 
layout(t(1:2)) 
textplot('plot(1:10)') 
plot(1:10) 
``` 
4

widzę 3 możliwości

  • dla beamer prezentacji, pójdę do \begin{columns} ... \end{columns} również.
  • Jeśli jest to tylko jeden taki wykres: Minipages
  • Here Użyłem tabeli (kod kolumny i wynik kolumny). (Ten przykład jest „normalne” Sweave)

Dla wszystkich trzech opcji chunk musiałby include = FALSE, a fabuła będzie „ręcznie” należy umieścić we właściwym miejscu przez \includegraphics[]{}.

+0

Ja po drugie to podejście. – user12202013

8

Cóż, to okazało się trudniejsze niż się spodziewałem.

Po stronie LaTeX, adjustbox package zapewnia doskonałą kontrolę nad wyrównaniem boków obok siebie, co zostało zademonstrowane na stronie tex.stackexchange.com pod adresem in this excellent answer. Tak więc moją ogólną strategią było owijanie sformatowanego, uporządkowanego, kolorowego wyjścia wskazanego fragmentu R za pomocą kodu LaTeX, który: (1) umieszcza go w środowisku adjustbox; i (2) zawiera graficzne wyjście porcji w innym środowisku regulacyjnym po jego prawej stronie. Aby to osiągnąć, musiałem zastąpić domyślny hak wyjścia porcji knitr z dostosowanym, zdefiniowanym w sekcji (2) fragmentu dokumentu <<setup>>=.

Sekcja (1) z <<setup>>= definiuje haczyk kawałek, który można wykorzystać, aby tymczasowo ustawić dowolny opcji globalnych R (oraz w szczególności tutaj, options("width")) na zasadzie per-klocek. See here za pytanie i odpowiedź, które traktują tylko jeden element tej konfiguracji.

Wreszcie, sekcja definiuje "szablon" dzianiny, pakiet kilku opcji, które należy ustawić za każdym razem, gdy mają zostać utworzone blok kodu i figura obok siebie. Po zdefiniowaniu pozwala użytkownikowi wywołać wszystkie wymagane akcje, wpisując po prostu opts.label="codefig" w nagłówku porcji.

\documentclass{article} 

\usepackage{adjustbox}   %% to align tops of minipages 
\usepackage[margin=1in]{geometry} %% a bit more text per line 

\begin{document} 

<<setup, include=FALSE, cache=FALSE>>= 
## These two settings control text width in codefig vs. usual code blocks 
partWidth <- 45 
fullWidth <- 80 
options(width = fullWidth) 

## (1) CHUNK HOOK FUNCTION 
## First, to set R's textual output width on a per-chunk basis, we 
## need to define a hook function which temporarily resets global R's 
## option() settings, just for the current chunk 
knit_hooks$set(r.opts=local({ 
    ropts <- NA 
    function(before, options, envir) { 
     if (before) { 
      ropts <<- options(options$r.opts) 
     } else { 
      options(ropts) 
     } 
    } 
})) 

## (2) OUTPUT HOOK FUNCTION 

## Define a custom output hook function. This function processes _all_ 
## evaluated chunks, but will return the same output as the usual one, 
## UNLESS a 'codefig' argument appeared in the chunk's header. In that 
## case, wrap the usual textual output in LaTeX code placing it in a 
## narrower adjustbox environment and setting the graphics that it 
## produced in another box beside it. 

defaultChunkHook <- environment(knit_hooks[["get"]])$defaults$chunk 

codefigChunkHook <- function (x, options) { 
     main <- defaultChunkHook(x, options) 
     before <- 
      "\\vspace{1em}\n 
      \\adjustbox{valign=t}{\n 
      \\begin{minipage}{.59\\linewidth}\n" 
     after <- 
      paste("\\end{minipage}} 
        \\hfill 
        \\adjustbox{valign=t}{", 
        paste0("\\includegraphics[width=.4\\linewidth]{figure/", 
          options[["label"]], "-1.pdf}}"), sep="\n") 
    ## Was a codefig option supplied in chunk header? 
    ## If so, wrap code block and graphical output with needed LaTeX code. 
    if (!is.null(options$codefig)) { 
     return(sprintf("%s %s %s", before, main, after)) 
    } else { 
     return(main) 
    } 
} 

knit_hooks[["set"]](chunk = codefigChunkHook) 


## (3) TEMPLATE 
## codefig=TRUE is just one of several options needed for the 
## side-by-side code block and a figure to come out right. Rather 
## than typing out each of them in every single chunk header, we 
## define a _template_ which bundles them all together. Then we can 
## set all of those options simply by typing opts.label="codefig". 

opts_template[["set"]](
codefig = list(codefig=TRUE, fig.show = "hide", 
       r.opts = list(width=partWidth), 
       tidy = TRUE, 
       tidy.opts = list(width.cutoff = partWidth))) 
@ 

A chunk without \texttt{opts.label="codefig"} set... 
<<A>>= 
1:60 
@ 

\texttt{opts.label="codefig"} \emph{is} set for this one 

<<B, opts.label="codefig", fig.width=8, cache=FALSE>>= 
library(raster) 
library(RColorBrewer) 

## Create a factor raster with a nice RAT (Rast. Attr. Table) 
r <- raster(matrix(sample(1:10, 100, replace=TRUE), ncol=10, nrow=10)) 
r <- as.factor(r) 
rat <- levels(r)[[1]] 
rat[["landcover"]] <- as.character(1:10) 
levels(r) <- rat 

## To get a nice grid... 
p <- as(r, "SpatialPolygonsDataFrame") 

## Plot it 
plot(r, col = brewer.pal("Set3", n=10), 
    legend = FALSE, axes = FALSE, box = FALSE) 
plot(p, add = TRUE) 
text(p, label = getValues(r)) 
@ 

\texttt{opts.label="codefig"} not set, and all settings back to ``normal''. 
<<C>>= 
lm(mpg ~ cyl + disp + hp + wt + gear, data=mtcars) 
@ 


\end{document} 

enter image description here

+0

Zajęło ci wystarczająco długo, szczerze :-) +1 –

Powiązane problemy