Llevando LaTeX a R Plots

119

Me gustaría agregar LaTeXcomposición tipográfica a los elementos de los gráficos en R(por ejemplo: el título, las etiquetas de los ejes, las anotaciones, etc.) usando la combinación de base/latticeo con ggplot2.

Preguntas:

  • ¿Hay alguna forma de entrar LaTeXen gráficos utilizando estos paquetes y, de ser así, cómo se hace?
  • Si no es así, ¿se necesitan paquetes adicionales para lograrlo?

Por ejemplo, en Python matplotlibcompila a LaTeXtravés de los text.usetexpaquetes como se describe aquí: http://www.scipy.org/Cookbook/Matplotlib/UsingTex

¿Existe un proceso similar mediante el cual se puedan generar tales gráficos R?

DrewConway
fuente
1
Este tutorial podría funcionar para usted (funcionó de maravilla para mí :)): r-bloggers.com/latex-in-r-graphs
Pragyaditya Das
Este paquete para convertir LaTeX en gráficos podría ser útil: github.com/stefano-meschiari/latex2exp
Stefano Meschiari

Respuestas:

48

Aquí hay un ejemplo usando ggplot2:

q <- qplot(cty, hwy, data = mpg, colour = displ)
q + xlab(expression(beta +frac(miles, gallon)))

texto alternativo

Christopher DuBois
fuente
17
Desafortunadamente, esto no tiene las características de LaTeX.
Myles Baker
¿Cuál es la situación ahora? Creo que ha mejorado un poco con la R 3.1.1.
Léo Léopold Hertz 준영
35

Como lo robaron de aquí , el siguiente comando usa correctamente LaTeX para dibujar el título:

plot(1, main=expression(beta[1]))

Consulte ?plotmathpara obtener más detalles.

Christopher DuBois
fuente
12
Interesante, también es bueno con la demostración (plotmath) ¿Entonces la notación matemática tiene que ser reinterpretada a través de la sintaxis de plotmath? Eso parece una gloriosa pérdida de tiempo, especialmente si tiene una expresión de LaTeX involucrada. Por eso me gusta la capacidad de matplotlib para compilar LaTeX. ¿Hay algo que pueda tomar LaTeX y generar sintaxis plotmath?
DrewConway
No que yo sepa. Hay una publicación interesante en RWiki sobre cómo hacer que el látex funcione con ggplot2: wiki.r-project.org/rwiki/…
Christopher DuBois
34

El paquete CRAN latex2exp contiene una TeXfunción que traduce las fórmulas LaTeX a las expresiones plotmath de R. Puede usarlo en cualquier lugar donde pueda ingresar anotaciones matemáticas, como etiquetas de eje, etiquetas de leyenda y texto general.

Por ejemplo:

x <- seq(0, 4, length.out=100)
alpha <- 1:5

plot(x, xlim=c(0, 4), ylim=c(0, 10), 
     xlab='x', ylab=TeX('$\\alpha  x^\\alpha$, where $\\alpha \\in 1\\ldots 5$'), 
     type='n', main=TeX('Using $\\LaTeX$ for plotting in base graphics!'))

invisible(sapply(alpha, function(a) lines(x, a*x^a, col=a)))

legend('topleft', legend=TeX(sprintf("$\\alpha = %d$", alpha)), 
       lwd=1, col=alpha)

produce esta trama .

Stefano Meschiari
fuente
¡Esto es genial! ¿Podría explicar lo que quiere decir con aproximadamente ? ¿Cómo funciona?
Frans Rodenburg
1
Por aproximadamente, quise decir que las cadenas de LaTeX se traducen en expresiones de plotmath de R, lo que significa que si plotmath no admite un símbolo LaTeX específico, no se procesará o se procesará combinando símbolos que estén disponibles.
Stefano Meschiari
Aunque no es genial. Parece repugnante y solo admite un número limitado de símbolos. Lo que es peor es que no parece haber nada que ayude con los gráficos de "calidad de publicación" (algo de lo que la gente afirma falsamente que R es capaz de hacer). Es hora de aprender Python, supongo ...
algas
6

Aquí hay algo de mis propios informes de laboratorio.

  • tickzDeviceexporta tikzimágenes paraLaTeX
  • Tenga en cuenta que, en ciertos casos, se "\\"convierte en "\"y se "$"convierte "$\"en el siguiente código R:"$z\\frac{a}{b}$" -> "$\z\frac{a}{b}$\"

  • También xtable exporta tablas a código latex

El código:

library(reshape2)
library(plyr)
library(ggplot2)
library(systemfit)
library(xtable)
require(graphics)
require(tikzDevice)

setwd("~/DataFolder/")
Lab5p9 <- read.csv (file="~/DataFolder/Lab5part9.csv", comment.char="#")

AR <- subset(Lab5p9,Region == "Forward.Active")

# make sure the data names aren't already in latex format, it interferes with the ggplot ~  # tikzDecice combo
colnames(AR) <- c("$V_{BB}[V]$", "$V_{RB}[V]$" ,  "$V_{RC}[V]$" , "$I_B[\\mu A]$" , "IC" , "$V_{BE}[V]$" , "$V_{CE}[V]$" , "beta" , "$I_E[mA]$")

# make sure the working directory is where you want your tikz file to go
setwd("~/TexImageFolder/")

# export plot as a .tex file in the tikz format
tikz('betaplot.tex', width = 6,height = 3.5,pointsize = 12) #define plot name size and font size

#define plot margin widths
par(mar=c(3,5,3,5)) # The syntax is mar=c(bottom, left, top, right).

ggplot(AR, aes(x=IC, y=beta)) +                                # define data set 
    geom_point(colour="#000000",size=1.5) +                # use points
    geom_smooth(method=loess,span=2) +                     # use smooth
    theme_bw() +                    # no grey background
    xlab("$I_C[mA]$") +                 # x axis label in latex format
    ylab ("$\\beta$") +                 # y axis label in latex format
    theme(axis.title.y=element_text(angle=0)) + # rotate y axis label
    theme(axis.title.x=element_text(vjust=-0.5)) +  # adjust x axis label down
    theme(axis.title.y=element_text(hjust=-0.5)) +  # adjust y axis lable left
    theme(panel.grid.major=element_line(colour="grey80", size=0.5)) +# major grid color
    theme(panel.grid.minor=element_line(colour="grey95", size=0.4)) +# minor grid color 
    scale_x_continuous(minor_breaks=seq(0,9.5,by=0.5)) +# adjust x minor grid spacing
    scale_y_continuous(minor_breaks=seq(170,185,by=0.5)) + # adjust y minor grid spacing
    theme(panel.border=element_rect(colour="black",size=.75))# border color and size

dev.off() # export file and exit tikzDevice function
N8TRO
fuente
4

Aquí hay una función interesante que te permite usar la funcionalidad plotmath, pero con las expresiones almacenadas como objetos del modo de personaje. Esto le permite manipularlos mediante programación usando pegar o funciones de expresión regular. No uso ggplot, pero debería funcionar allí también:

    express <- function(char.expressions){
       return(parse(text=paste(char.expressions,collapse=";")))
    }
    par(mar=c(6,6,1,1))
    plot(0,0,xlim=sym(),ylim=sym(),xaxt="n",yaxt="n",mgp=c(4,0.2,0),
       xlab="axis(1,(-9:9)/10,tick.labels,las=2,cex.axis=0.8)",
       ylab="axis(2,(-9:9)/10,express(tick.labels),las=1,cex.axis=0.8)")
    tick.labels <- paste("x >=",(-9:9)/10)
    # this is what you get if you just use tick.labels the regular way:
    axis(1,(-9:9)/10,tick.labels,las=2,cex.axis=0.8)
    # but if you express() them... voila!
    axis(2,(-9:9)/10,express(tick.labels),las=1,cex.axis=0.8)
mwrowe
fuente
2

Hice esto hace unos años enviando la salida a un formato .fig en lugar de directamente a un .pdf; usted escribe los títulos incluyendo el código latex y usa fig2ps o fig2pdf para crear el archivo gráfico final. La configuración que tenía para hacer esto se rompió con R 2.5; si tuviera que hacerlo de nuevo, buscaría en tikz, pero de todos modos incluiré esto aquí como otra opción potencial.

Mis notas sobre cómo lo hice usando Sweave están aquí: http://www.stat.umn.edu/~arendahl/computing

Aaron dejó Stack Overflow
fuente