with rmarkdown knit example cache and align r latex knitr subfigure

rmarkdown - ¿Subfiguras o Subcaptions con knitr?



r knitr cache (3)

Actualizando la respuesta de Yihui para reflejar los cambios en Rmarkdown en los últimos años, y también el alejamiento de los archivos Rnw.

Como se enumeran en las opciones de fragmentos de knitr, las subfiguras requieren que se establezcan algunas configuraciones adicionales en el encabezado del fragmento:

  • fig.subcap es una lista de las leyendas para las subfiguras
  • fig.ncol : el número de columnas de subfiguras
  • out.width : el ancho de salida de las figuras. Normalmente establecerá este 100% dividido por el número de subcolumnas.

Las subfiguras también requieren el subfig paquete LaTeX. Por lo tanto, la línea /usepackage{subfig} debe incluirse dentro del YAML, o si está usando una plantilla externa de tex puede agregar esto a ese archivo.

Aquí hay una plantilla básica:

--- output: pdf_document header-includes: - /usepackage{subfig} --- ```{r fig-sub, fig.cap=''two plots'', fig.subcap=c(''one plot'', ''the other one''), out.width=''.49//linewidth'', fig.asp=1, fig.ncol = 2} plot(1:10) plot(rnorm(10), pch=19) ```

Usando con ggplot2

Si está trazando subfiguras que contienen múltiples gráficos de ggplot, puede desordenar, ya que no se alinean entre los gráficos. Si lo desea, puede consultar esta publicación aquí sobre cómo utilizar el diagrama de vacas para forzar a los gráficos de puntos a tener las mismas dimensiones.

Esta publicación de stackoverflow te ayudará a asegurarte de que todos los gráficos se alinean como se muestra en la imagen a continuación:

Proporcionar una lista a las subfiguras

Solo compartiendo esto como una posible extensión de subfiguras. Algo para lo que me gusta usarlos es darles una lista de figuras. Tal vez haya producido una función que necesita ejecutar en cuatro grupos de prueba diferentes, o en cuatro ubicaciones separadas. Por ejemplo, aquí hay una lista de cuatro ciudades en el Reino Unido:

```{r} locations <- c("Southampton, UK", "London, UK", "Bristol, UK", "Birmingham, ```

Esta lista puede usarse luego dentro de fig.sub y un lapply para producir una lista de subfiguras. Si necesita ejecutar el

```{r fig-sub-2, fig.cap=''A collection of maps'', fig.subcap= locations, out.width=''.49//linewidth'', fig.asp=1, fig.ncol = 2} library(ggmap) lapply(locations, function(x) ggmap(get_map(x)) ) ```

Esto hace que las subfiguras sean bastante robustas. Si necesito ejecutar mi modelo en un par de ciudades adicionales, todo lo que debo hacer es agregar valores adicionales a la lista de location y las cifras secundarias tendrán la misma longitud.

¿Es posible producir subfiguras (con subcapciones asociadas) utilizando knitr? Aquí hay un mínimo ejemplo de trabajo:

/documentclass{article} /begin{document} <<echo = FALSE, fig.cap = c("Some numbers.", "Some more numbers."), out.width = "0.5//textwidth", fig.align = "center">>= plot(1:10) plot(30:100) @ /end{document}

Esto da como resultado dos figuras etiquetadas como la Figura 1 y la Figura 2 con títulos como se definen (respectivamente). Pero quiero que estén etiquetados como "Figura 1a" y "Figura 1b", como puede hacer con el paquete LaTeX de subcaption.

Sé que hay un knitr opciones "fig.env", pero esto no lo resuelve (al menos no usa, por ejemplo, "fig.env = ''subfigure''"). Hay una publicación similar aquí con respecto a Sweave, pero la solución es un hack no elegante: http://texblog.org/2011/12/01/sweave-subfig-controlling-figure-size-and-placement/


Puedes usar el paquete de subcaption de subcaption .

/documentclass{article} /usepackage{subcaption} /begin{document} /begin{figure} /centering /begin{subfigure}[b]{0.3/textwidth} /centering <<echo = FALSE, out.width = "0.5//textwidth", fig.align = "center">>= plot(1:10) @ /caption{text for first figure} /label{fig:gull} /end{subfigure}% /begin{subfigure}[b]{0.3/textwidth} /centering <<echo = FALSE, out.width = "0.5//textwidth", fig.align = "center">>= plot(30:100) @ /caption{text for second figure} /label{fig:tiger} /end{subfigure} /caption{Figure caption} /end{figure} /end{document}


knitr (> = v1.5) soporta subfigures . Puedes usar la opción chunk fig.subcap . Aquí hay un ejemplo mínimo.

/documentclass{article} /usepackage{subfig} /begin{document} <<fig-sub, fig.cap=''two plots'', fig.subcap=c(''one plot'', ''the other one''), out.width=''.49//linewidth''>>= plot(1:10) plot(rnorm(10), pch=19) @ /end{document}