Colocando o LaTeX em gráficos R


119

Eu gostaria de adicionar LaTeXtipografia aos elementos das plotagens R(por exemplo: o título, os rótulos dos eixos, as anotações etc.) usando a combinação de base/latticeou com ggplot2.

Questões:

  • Existe uma maneira de entrar LaTeXem parcelas usando esses pacotes e, se sim, como é feito?
  • Caso contrário, existem pacotes adicionais necessários para fazer isso.

Por exemplo, nas Python matplotlibcompilações LaTeXpor meio dos text.usetexpacotes, conforme discutido aqui: http://www.scipy.org/Cookbook/Matplotlib/UsingTex

Existe um processo semelhante pelo qual esses gráficos podem ser gerados R?


1
Este trabalho poderia tutorial para você (trabalhou maravilhas para mim :)): r-bloggers.com/latex-in-r-graphs
Pragyaditya Das

Este pacote para renderizar o LaTeX em plotagens pode ser útil: github.com/stefano-meschiari/latex2exp
Stefano Meschiari

Respostas:



35

Como roubado daqui , o comando a seguir usa corretamente o LaTeX para desenhar o título:

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

Veja ?plotmathpara mais detalhes.


12
Interessante, também coisas boas com demo (plotmath) Então a notação matemática precisa ser reinterpretada através da sintaxe do plotmath? Isso parece uma gloriosa perda de tempo, especialmente se você tiver uma expressão envolvida do LaTeX. É por isso que eu gosto da capacidade do matplotlib de compilar o LaTeX. Existe algo que possa usar o LaTeX e gerar sintaxe de plotagem?
DrewConway 08/09/09

Não que eu saiba. Há um interessante post no RWiki sobre a obtenção de látex para o trabalho com ggplot2: wiki.r-project.org/rwiki/...
Christopher DuBois

34

O pacote CRAN latex2exp contém uma TeXfunção que converte fórmulas LaTeX em expressões de plotagem de R. Você pode usá-lo em qualquer lugar em que possa inserir anotações matemáticas, como rótulos de eixos, rótulos de legenda e texto geral.

Por exemplo:

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)

produz esse enredo .


Isso é ótimo! Você poderia explicar o que você quer dizer com aproximadamente ? Como isso funciona?
quer

1
Por aproximadamente, eu quis dizer que as seqüências de caracteres LaTeX são traduzidas nas expressões de plotmath de R - o que significa que, se plotmath não suportar um símbolo específico de LaTeX, ela não será renderizada ou renderizada pela combinação de símbolos disponíveis.
Stefano Meschiari 19/07/19

Não é ótimo. Parece nojento e suporta apenas um número limitado de símbolos. O pior é que não parece haver nada que ajude nos gráficos de "qualidade da publicação" (algo que as pessoas afirmam falsamente que R é capaz). Hora de aprender Python, eu acho ..
algas


6

Aqui está algo dos meus próprios relatórios de laboratório.

  • tickzDeviceexporta tikzimagens paraLaTeX
  • Observe que, em certos casos, "\\"torna "\"- "$"se e torna - se "$\"como no código R a seguir:"$z\\frac{a}{b}$" -> "$\z\frac{a}{b}$\"

  • Também xtable exporta tabelas para código de látex

O 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

4

Aqui está uma função interessante que permite usar a funcionalidade de plotagem, mas com as expressões armazenadas como objetos do modo de caractere. Isso permite manipulá-los programaticamente usando colar ou funções de expressão regular. Eu não uso o ggplot, mas deve funcionar lá também:

    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)

2

Eu fiz isso alguns anos atrás, produzindo para um formato .fig em vez de diretamente para um .pdf; você escreve os títulos, incluindo o código de látex, e usa fig2ps ou fig2pdf para criar o arquivo gráfico final. A configuração que eu tive que fazer isso quebrou com o R 2.5; se eu tivesse que fazer isso de novo, procuraria o tikz, mas estou incluindo isso aqui como qualquer outra opção em potencial.

Minhas anotações sobre como eu fiz isso usando o Sweave estão aqui: http://www.stat.umn.edu/~arendahl/computing



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.