#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 в одном фрагменте.