Wprowadzanie LaTeX do wykresów R.

119

Chciałbym dodać LaTeXskład do elementów działek w R(np .: tytuł, etykiety osi, adnotacje itp.) Używając kombinacji base/latticelub z ggplot2.

Pytania:

  • Czy jest sposób, aby dostać się LaTeXdo działek za pomocą tych pakietów, a jeśli tak, jak to się robi?
  • Jeśli nie, czy są potrzebne dodatkowe pakiety, aby to osiągnąć.

Na przykład podczas Python matplotlibkompilacji LaTeXza pośrednictwem text.usetexpakietów, jak omówiono tutaj: http://www.scipy.org/Cookbook/Matplotlib/UsingTex

Czy istnieje podobny proces, w którym można wygenerować takie wykresy R?

DrewConway
źródło
1
Ten samouczek może Ci się przydać (dla mnie zdziałał
Pragyaditya Das
Ten pakiet do renderowania LaTeX na wykresach może być pomocny: github.com/stefano-meschiari/latex2exp
Stefano Meschiari

Odpowiedzi:

48

Oto przykład wykorzystujący ggplot2:

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

tekst alternatywny

Christopher DuBois
źródło
17
Niestety, nie ma to prawie funkcji LaTeX.
Myles Baker,
Jaka jest teraz sytuacja? Myślę, że poprawiło się trochę z R 3.1.1.
Léo Léopold Hertz 준영
35

Jak skradziono stąd , poniższe polecenie poprawnie używa LaTeX do narysowania tytułu:

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

Zobacz, ?plotmathaby uzyskać więcej informacji.

Christopher DuBois
źródło
12
Ciekawe, również dobre rzeczy z demo (plotmath) Więc notacja matematyczna musi zostać ponownie zinterpretowana przez składnię plotmatha? Wydaje się to wspaniałą stratą czasu, zwłaszcza jeśli masz zaangażowaną ekspresję LaTeX. Dlatego podoba mi się zdolność matplotlib do kompilowania samego LaTeX. Czy jest coś, co może wziąć LaTeX i wygenerować składnię plotmath?
DrewConway
Nie żebym o tym wiedział. Na RWiki jest ciekawy post na temat uruchamiania lateksu do pracy z ggplot2: wiki.r-project.org/rwiki/ ...
Christopher DuBois
34

Pakiet CRAN latex2exp zawiera TeXfunkcję, która tłumaczy formuły LaTeX na wyrażenia plotmath języka R. Można go używać wszędzie tam, gdzie można wprowadzić adnotacje matematyczne, takie jak etykiety osi, etykiety legendy i ogólny tekst.

Na przykład:

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)

produkuje ten wykres .

Stefano Meschiari
źródło
To jest świetne! Czy mógłbyś w przybliżeniu wyjaśnić, co masz na myśli ? Jak to działa?
Frans Rodenburg
1
W przybliżeniu miałem na myśli, że łańcuchy LaTeX są tłumaczone na wyrażenia plotmath R - co oznacza, że ​​jeśli plotmath nie obsługuje określonego symbolu LaTeX, to albo nie będzie renderowany, albo będzie renderowany przez połączenie dostępnych symboli.
Stefano Meschiari
Ale to nie jest świetne. Wygląda obrzydliwie i obsługuje tylko ograniczoną liczbę symboli. Co gorsza, wydaje się, że nie ma niczego, co mogłoby pomóc w fabułach "jakości publikacji" (coś, do czego ludzie fałszywie twierdzą, że R jest w stanie). Chyba czas nauczyć się Pythona ...
glony
6

Oto coś z moich własnych raportów laboratoryjnych.

  • tickzDeviceeksportuje tikzobrazy doLaTeX
  • Zauważ, że w niektórych przypadkach "\\"staje się "\"i "$"staje się "$\"jak w następującym kodzie R:"$z\\frac{a}{b}$" -> "$\z\frac{a}{b}$\"

  • Również xtable eksportuje tabele do kodu Latex

Kod:

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
źródło
4

Oto fajna funkcja, która pozwala używać funkcji plotowania, ale z wyrażeniami przechowywanymi jako obiekty trybu znakowego. Umożliwia to programowe manipulowanie nimi za pomocą funkcji wklejania lub wyrażeń regularnych. Nie używam ggplot, ale powinno też tam działać:

    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
źródło
2

Zrobiłem to kilka lat temu, wysyłając dane do formatu .fig zamiast bezpośrednio do pliku .pdf; piszesz tytuły, w tym kod latex, i używasz fig2ps lub fig2pdf do tworzenia ostatecznego pliku graficznego. Konfiguracja, którą musiałem to zrobić, zepsuła się z R 2.5; gdybym musiał to zrobić ponownie, zamiast tego przyjrzałbym się tikz, ale i tak uwzględniam to tutaj jako kolejną potencjalną opcję.

Moje notatki na temat tego, jak to zrobiłem za pomocą Sweave, są tutaj: http://www.stat.umn.edu/~arendahl/computing

Aaron opuścił Stack Overflow
źródło