Подтвердить что ты не робот

Как включить сложный R-график в документ LaTeX?

У меня возникла проблема со следующим фрагментом кода:

\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{myscatterplot.pdf}
\end{document}

Где "myscatterplot.pdf" генерируется следующим кодом в R:

library(scatterplot3d)
pdf("myscatterplot.pdf")
scatterplot3d(rnorm(100), rnorm(100), 1:100, highlight.3d = TRUE)
dev.off()

Проблема заключается в том, что полученный документ LaTeX при компиляции с texworks (pdfLatex + makeindex + bibtex) имеет оси графика, но ни одна из точек на графике графика или оси (в этом случае это только три оси). Сообщения об ошибках и предупреждениях, выводимые R или LaTeX, отсутствуют. Я использую:

  • R 2.12.1 в Windows 7,
  • MiKTeX 2.8,
  • TeXworks
  • Adobe Reader 9 (не уверен, что это отношение...)

Мне удалось использовать команду \includegraphics для включения png-версии рисунка, а открытие "myscatterplot.pdf" с помощью adobe показывает цифру, которую я хочу в своем документе.

Я попытался использовать пакет tikz в качестве обходного пути, но, похоже, так много информации, генерируемой scalplot3d, что итоговая цифра не может быть включена в латексный документ из-за размера памяти (ошибка (мой фактический график будет иметь 10000 + точек!).

У меня есть подозрение, что проблема связана с шрифтами в файле .pdf, но я попытался изменить pdf-шрифты, используя

pdf("changefont.pdf")
par(family = "Helvetica")
scatterplot3d(rnorm(100), rnorm(100), 1:100, highlight.3d = TRUE)
dev.off()

с точно таким же результатом при использовании \includegraphics (changefont.pdf).

Другая возможная проблема, которую я рассматриваю, заключается в том, что, возможно, вывод scatterplot3d на самом деле представляет собой несколько изображений, а \includegraphics берет только первую фигуру (оси) из файла pdf. В этом случае я все еще не уверен, как обойти это.

Я был бы очень признателен за обходное решение, так как в конце концов мне захочется сделать все это с Sweave, и это заставляет меня горько относиться к красиво оформленному выпуску пакета!

Заранее благодарим за ваши ответы.

Изменить 1:

Итак, первая рекомендация заключалась в использовании формата EPS вместо pdf. Это дало некоторые результаты, но не то, что я хотел. Я запустил следующее:

\documentclass{article}
\usepackage{graphicx,epstopdf}
\begin{document}
\begin{figure}
\includegraphics[angle = 270, width= 6in, keepaspectratio=true]{change.eps}
\end{figure}
\end{document}

Я сгенерировал "change.eps", используя

postscript("change.eps")
scatterplot3d(rnorm(100), rnorm(100), 1:100, highlight.3d = TRUE)
dev.off()

Это привело к улучшению (несмотря на то, что он, как ни странно, повернул график на 90 градусов по часовой стрелке на выходе из латекса!), и теперь у меня есть оси и точки из диаграммы рассеяния в моем выходе из латекса! Тем не менее, метки оси все еще не фигурируют, хотя я открыл "change.eps" с помощью ghostview, а оси находятся в сюжете! Похоже, что данные dispplot3d не согласуются с тем, как \includegraphics ищет цифры...

Итак, я все еще ищу решение для этого, которое будет включать метки осей.

4b9b3361

Ответ 1

Глядя на myscatterplot.pdf, сгенерированный с помощью перечисленных вами команд, есть оси и метки. Тем не менее, формат PDF довольно большой (7in x 7in).

Помогает ли вам играть с параметрами веса/высоты в формате pdf()?

pdf("myscatterplot.pdf", height=3.5, width=3.5)

Ответ 2

Это побочная заметка, связанная с тем, что LaTeX превышает доступную память.

Я просто использовал ваш пример с tikzDevice для проведения стресс-тестов, и похоже, что результаты довольно сильно зависят от того, какой механизм TeX используется. Особо следует отметить luatex, sucessor to pdftex, который оказался способным обрабатывать графики со многими графическими элементами.

  • pdflatex:

    Сделал это через сюжет с 1000 точками, превысил память и умер на 10000.

  • xelatex:

    Также превысила память и умерла на 10000 пунктов.

  • lualatex:

    Прошло 10 000 пунктов за 45 секунд и подготовил файл в 1 МБ PDF. Провалился через 100,00 пунктов (входной файл 10 МБ) за ~ 7.5 минут, выплюнул файл PDF объемом 8,5 МБ и достиг пика в ~ 750 МБ использования памяти. Не пробовал 1 миллион тестов.

Похоже, что pdftex и xetex выделяют всю свою память спереди, когда программа выделяет и это все, что они когда-либо получат. luatex, с другой стороны, похоже, что он может динамически распределять память и поэтому ограничивается только объемом доступной оперативной памяти.

Итак, если pdflatex дает вам ошибки "из памяти", попробуйте взять lualatex для вращения!


Эти тесты проводились с использованием компиляторов TeX, включенных в дистрибутив TeX Live 2010. Я также являюсь одним из авторов tikzDevice

Ответ 3

Вы можете попробовать Sweave: http://www.statistik.lmu.de/~leisch/Sweave/ (Sweave - это инструмент, который позволяет встроить R-код для полного анализа данных в латексных документах)

Ответ 4

Если вы хотите вставить PDF-изображения в свой файл, я думаю, вы должны использовать pdflatex вместо стандартного латекса. Если это не установлено, я бы попробовал генерировать цифры в формате eps из R, а не pdf.

Ответ 5

Я вспоминаю борьбу с подобной проблемой. Не помню, мог ли я видеть ярлыки на рисунке. Оглядываясь назад на код, есть два параметра, которые я изменил на уровне R:

par(xpd=NA)
par(oma=c(3, 3, 0, 0))

также для постскриптума, чтобы не иметь графиков, повернутых на 90 градусов:

postscript(file="xx.eps", horizontal=FALSE)

НТН

Ответ 6

Я действительно пришел сюда с такой же проблемой (TexWorks, pdfLatex, Windows 7). И я нашел что-то интересное: когда я впервые запустил латекс, фигуры появились с топорами и всеми, и когда я снова запустил pdfLatex, оси исчезли снова. Это дало мне догадки, и я понял это: несмотря на то, что в латексном превью не отображаются оси, формат PDF делает. И вам даже не нужно сообщать команде \includegraphics, что графика находится в формате PDF.

pdf("C:/Users/Orr/Documents/Leiden University/Master thesis/Chapters/Images/bioRes/Boxplots mouse raw data.pdf")
boxplot(mouse_data_raw,main="Mouse raw data")
dev.off()

\begin{figure}[t]
\includegraphics[scale=0.5]{mouse-box-raw}
\includegraphics[scale=0.5]{human-box-raw}
\end{figure}