ggplot2 и sweave — plot находятся в Rplots вместо основного pdf?

#r #graphics #ggplot2 #sweave

#r #графика #ggplot2 #sweave

Вопрос:

Я следил за примерами в похожих сообщениях, но безрезультатно. Вот пример проблемы, которую я вижу.

Сохранено в tmp.Rnw:

 documentclass[10pt]{article}
title{Reproducible Example} 
begin{document}
maketitle
begin{center}

<<echo=FALSE,results=hide>>=
library(ggplot2)
plot.to.print  = qplot( 1:10, 1:10 ) 
@ 

section{No Figure Below This Section Title}
<<<fig=true>>=
print( plot.to.print )
@ 

end{center}
end{document}
  

В tmp.co.r я ввел следующий код:

 Sweave("tmp.Rnw",stylepath=T)
  

И я создаю текстовый файл следующим образом:

 /../../2.12.1/bin/R --no-save < tmp.co.r
  

а затем используйте pdflatex для файла tmp.tex, который выходит.

Результатом является tmp.pdf, который содержит заголовок, название раздела и код R, но без рисунка. Однако также создается файл Rplots.pdf, который содержит нужную мне цифру в tmp.pdf.

Я уверен, что совершаю ошибку новичка, но я не могу ее найти. Какие-нибудь советы?

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

1. вы пытались дать имя фрагменту рисунка?

Ответ №1:

Попробуйте это

 << label = figPlot1, include = FALSE >>=
plot.to.print  = qplot( 1:10, 1:10 ) 
print(plot.to.print)
@ 


begin{figure}
begin{center}
<< label = fig1, fig = TRUE, echo = FALSE >>=
<<figPlot1>>
@
end{center}
caption{Your Caption}
label{fig:figPlot1}
end{figure}
  

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

1. Это дает тот же результат. Rplots.pdf с рисунком и tmp.pdf только с текстом.

Ответ №2:

Проблема в том, что у вас лишний < кусок в вашем фиговом фрагменте.

Это приводит к тому, что он выглядит так <fig=TRUE , поэтому fig на самом деле значение TRUE не установлено должным образом. Вы заметите, что в вашем .tex файле также нет правильных includegraphics строк.

Почему вы получаете Rplots.pdf это немного сложно, но о нем стоит знать. Во-первых, каждый фрагмент, который создает графику, выполняется дополнительное время для каждого желаемого типа графики. Итак, если вы просто создаете PDF-файлы (я думаю, текущий по умолчанию), он запускается дважды; если вы создаете PDF-файлы и eps, он запускается три раза. При первом запуске он запускается без открытия графического устройства; На самом деле я не уверен, почему он запускается в это время, но это так. Для нескольких файлов необходимо запускать его отдельно, чтобы каждый файл открывался по очереди.

Таким образом, лучше всего делать то, что вы сделали, и запускать весь код, создающий фигуру в одном фрагменте, и просто отображать фигуру в фрагменте fig=TRUE ; это сводит к минимуму код, который выполняется несколько раз. Однако будьте осторожны, если вы используете случайные числа или увеличиваете что-то по fig=TRUE частям; поскольку он выполняется несколько раз, поведение, вероятно, будет не таким, как вы ожидаете.

Во-вторых, когда код, создающий графику, запускается без указания графического устройства, графический тип по умолчанию все равно открывается для кода для работы. При интерактивном запуске появляются всплывающие окна с изображениями в них. При неинтерактивном запуске обычно по умолчанию открывается файл pdf, а имя по умолчанию Rplots.pdf — . Поскольку это происходит со всеми фрагментами, создающими фигуры, этот файл в конечном итоге представляет собой многостраничный PDF-файл со всеми созданными в нем фигурами.

Наконец, методы, которые создают фигуру с использованием R-кода вместо fig=TRUE механизма, иногда могут быть предпочтительнее, чтобы код запускался только один раз; обычно это требует немного больше учета, хотя это можно свести к минимуму, создав функции, которые помогут. Очевидно, что пакет AFLP (см. Ответ Тьерри) имеет подобные функции, хотя я никогда им не пользовался. Не слишком сложно написать свой собственный, хотя, если хотите, аналогично тому, что рекомендуется в Sweave FAQ A.9 для создания нескольких графиков одновременно.

Наконец (заглядывает в crystal ball …), Я вижу, что вы используете Emacs в режиме Rnw, где ввод < текста дает вам <<>>= курсор посередине, поэтому ввод << текста дает вам <<<>>= .

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

1. Спасибо! Это было лишнее «<» и, да, это было потому, что я использовал Emacs в режиме Rnw.

Ответ №3:

Взгляните на функцию ggsave.latex() из пакета AFLP, который доступен на R-Forge

 install.packages("AFLP", repos="http://R-Forge.R-project.org")
  

Тогда ваш файл Sweave упрощается до этого

 documentclass[10pt]{article}
title{Reproducible Example} 
begin{document}
maketitle

<<echo=FALSE,results=hide>>=
library(ggplot2)
#just imports the function you need without loading the entire package
ggsave.latex <- AFLP:::ggsave.latex 

plot.to.print  = qplot( 1:10, 1:10 ) 
@ 

section{No Figure Below This Section Title}
<<result = tex>>=
ggsave.latex(plot.to.print, caption = "Your caption", label = "ThisIsTheLabel")
@ 
end{document}
  

Обратите внимание, что ggsave.latex установит для вас среду фигуры. И это позволяет создавать несколько фигур и / или другой вывод LaTeX в одном фрагменте.