Получение LaTeX в R-графиках

#r #plot

#r #Латекс #график

Вопрос:

Я хотел бы добавить LaTeX набор текста к элементам графиков в R (например: заголовок, метки осей, аннотации и т. Д.), Используя либо комбинацию base/lattice , либо с ggplot2 .

Вопросы:

  • Есть ли способ попасть LaTeX в графики с использованием этих пакетов, и если да, то как это делается?
  • Если нет, нужны ли дополнительные пакеты для этого.

Например, в Python matplotlib компиляции LaTeX через text.usetex пакеты, как описано здесь: http://www.scipy.org/Cookbook/Matplotlib/UsingTex

Существует ли аналогичный процесс, с помощью которого такие графики могут быть сгенерированы R ?

Комментарии:

1. Этот урок может сработать для вас (для меня он сотворил чудеса :)): r-bloggers.com/latex-in-r-graphs

2. Этот пакет для рендеринга LaTeX в графики может быть полезен: github.com/stefano-meschiari/latex2exp

Ответ №1:

Пакет CRAN latex2exp содержит TeX функцию, которая преобразует формулы LaTeX в выражения R plotmath. Вы можете использовать его везде, где можно вводить математические примечания, такие как метки осей, метки условных обозначений и общий текст.

Например:

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

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

for (a in alpha) {
  lines(x, a*x^a, col=a)
}

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

создает этот график.

Комментарии:

1. Это здорово! Не могли бы вы объяснить, что вы подразумеваете под приблизительно ? Как это работает?

2. Приблизительно, я имел в виду, что строки LaTeX преобразуются в выражения R plotmath, что означает, что если plotmath не поддерживает определенный символ LaTeX, он либо не будет отображаться, либо будет отображаться путем объединения доступных символов.

3. Хотя это не очень хорошо. Выглядит отвратительно и поддерживает только ограниченное количество символов. Что еще хуже, похоже, нет ничего, что могло бы помочь с графиками «качества публикации» (то, на что люди ложно утверждают, что R способен). Думаю, пора изучать Python..

4. Ссылка на график нарушена :/

5. Исправлена ссылка на график.

Ответ №2:

Вот пример использования ggplot2 :

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

альтернативный текст

Комментарии:

1. К сожалению, это не имеет почти всех возможностей LaTeX.

2. Какова ситуация сейчас? Я думаю, что это немного улучшилось с R 3.1.1.

Ответ №3:

Как украдено отсюда, следующая команда правильно использует LaTeX для рисования заголовка:

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

Смотрите ?plotmath для получения более подробной информации.

Комментарии:

1. Интересно, также хороший материал с demo (plotmath), поэтому математические обозначения должны быть переинтерпретированы через синтаксис plotmath? Это кажется великолепной тратой времени, особенно если у вас есть задействованное выражение LaTeX. Вот почему мне нравится способность matplotlib компилировать LaTeX сам. Есть ли что-то, что может использовать LaTeX и генерировать синтаксис plotmath?

2. Насколько я знаю, нет. В RWiki есть интересный пост о том, как заставить latex работать с ggplot2: wiki.r-project.org/rwiki /…

Ответ №4:

Вы можете сгенерировать код tikz из R: http://r-forge.r-project.org/projects/tikzdevice /

Комментарии:

1. Я просто обнаружил, что пакет был удален из CRAN.

2. Похоже, что пакет все еще доступен в r-forge. Кроме того, он доступен здесь: github.com/Sharpie/RTikZDevice

3. Удивительный пакет: сгенерированный код TikZ относительно короткий и простой; это позволяет полностью контролировать вывод LaTeX. 1. Кстати, пакет полностью доступен на CRAN

Ответ №5:

Вот кое-что из моих собственных лабораторных отчетов.

  • tickzDevice экспортирует tikz изображения для LaTeX
  • Обратите внимание, что в некоторых случаях "\" становится "" и "$" становится "$" , как в следующем R-коде: "$z\frac{a}{b}$" -> "$zfrac{a}{b}$"

  • Также xtable экспортирует таблицы в код latex

Код:

 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
  

Ответ №6:

Вот классная функция, которая позволяет вам использовать функциональность plotmath, но с выражениями, хранящимися как объекты символьного режима. Это позволяет вам программно манипулировать ими, используя функции вставки или регулярных выражений. Я не использую ggplot, но он должен работать и там:

     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)
  

Ответ №7:

Я сделал это несколько лет назад, выводя в формат .fig вместо прямого .pdf; вы пишете заголовки, включая код latex, и используете fig2ps или fig2pdf для создания конечного графического файла. Настройка, которую я должен был сделать, сломалась с R 2.5; если бы мне пришлось сделать это снова, я бы вместо этого заглянул в tikz, но в любом случае включаю это здесь как еще один потенциальный вариант.

Мои заметки о том, как я это сделал с помощью Sweave, здесь: http://www.stat.umn.edu /~арендал/вычислительная техника

Ответ №8:

У меня просто есть обходной путь. Сначала можно сгенерировать файл eps, а затем преобразовать его обратно в pgf с помощью инструмента eps2pgf. Смотрите http://www.texample.net/tikz/examples/eps2pgf /

Ответ №9:

h <- rnorm(mean = 5, sd = 1, n = 1000)
hist(h, main = expression(paste("Sampled values, ", mu, "=5, ", sigma,
"=1")))

Взято из очень полезной статьи здесь https://stats.idre.ucla.edu/r/codefragments/greek_letters /

Ответ №10:

Вы можете использовать следующее, например:

 title(sub=TeX(sprintf(paste("Some latex symbols are ", r'(lambda)', "and", r'(alpha)'))))
  

Просто не забудьте включить выражения LaTeX при paste() использовании r'()’
Вы также можете добавлять именованные объекты в paste() функцию. Например.,

 lambda_variable <- 3
title(sub=TeX(sprintf(paste(r'(lambda=)', lambda_variable))))
  

Не уверен, есть ли лучшие способы сделать это, но вышеприведенное сработало для меня 🙂