Проблемы с ggplot и pgfsweave
Вопрос
Я начал использовать Sweave некоторое время назад. Однако, как и большинство людей, я встречал довольно скоро главную проблему: скорость. Гравки Большой документ занимает века для бега, что делает эффективные работы вполне сложным. Обработка данных может быть очень ускорена с CacheSweave. Однако сюжеты - особенно GGPlot;) - все еще занимают слишком много времени, чтобы сделать. Вот так я хочу использовать PGFSweave.
После многих часов я наконец-то удался создать рабочую систему с Eclipse / StateT / Texlipse. Затем я хотел преобразовать существующий отчет для использования с PGFSWeave и имел плохой сюрприз: большинство моих GGPLOTS, похоже, больше не работают. Следующий сюжет, например, отлично работает в консоли и Sweave:
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point(aes(colour=que_id))
print(pl)
Запуск его с PGFSWEAVE, однако, я получаю эту ошибку:
Error in if (width > 0) { : missing value where TRUE/FALSE needed
In addition: Warning message:
In if (width > 0) { :
the condition has length > 1 and only the first element will be used
Error in driver$runcode(drobj, chunk, chunkopts) :
Error in if (width > 0) { : missing value where TRUE/FALSE needed
Когда я удаляю AES (...) от Geom_Point, сюжет отлично работает с PGFSWEAVE.
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point()
print(pl)
Редактировать: Я больше исследовал проблему и может снизить проблему к устройству Tikz.
Это работает просто хорошо:
quartz()
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point(aes(colour=que_id))
print(pl)
Это дает вышеуказанную ошибку:
tikz( 'myPlot.tex',standAlone = T )
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point(aes(colour=que_id))
print(pl)
dev.off()
Это работает просто хорошо:
tikz( 'myPlot.tex',standAlone = T )
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point()
print(pl)
dev.off()
Я мог бы повторить это с 5 различными GGPlots. Когда не используя цвет (или размер, альфа, ...) в сопоставлении, он работает с Tikz.
Q1: У кого-нибудь есть какие-то объяснения для этого поведения?
Кроме того, кэширование кусков не сюжетных кодов не очень хорошо работает. Следующий кусок кода не занимает времени вообще с Sweave. С PGFSweaveve требуется примерно 10 сек.
<<plot.opts,echo=FALSE,results=hide,cache=TRUE>>=
#colour and plot options are globally set
pal1 <- brewer.pal(8,"Set1")
pal_seq <- brewer.pal(8,"YlOrRd")
pal_seq <- c("steelblue1","tomato2")
opt1 <- opts(panel.grid.major = theme_line(colour = "white"),panel.grid.minor = theme_line(colour = "white"))
sca_fill_cont_opt <- scale_fill_continuous(low="steelblue1", high="tomato2")
ory <- geom_hline(yintercept=0,alpha=0.4,linetype=2)
orx <- geom_vline(xintercept=0,alpha=0.4,linetype=2)
ts1 <- 2.3
ts2 <- 2.5
ts3 <- 2.8
ps1 <- 6
offset_x <- function(x,y) 0.15*x/pmax(abs(x),abs(y))
offset_y <- function(x,y) 0.05*y/pmax(abs(x),abs(y))
plot_size <- 50*50
Это кажется довольно странным поведением, так как только некоторые переменные установлены для последующего использования.
Q2: У кого-нибудь есть какие-то объяснения для этого?
Q3: В целом, я хотел бы спросить, если кто-нибудь вообще использует PGFWAEVE? С успешно я имею в виду, что все вещи, которые работают в SWEAVE, также работают в PGFSCEAVE, с дополнительным преимуществом хороших шрифтов и улучшенной скорости. ;)
Большое спасибо за ответы!
Решение
Q1: У кого-нибудь есть какие-то объяснения для этого поведения?
Это три причины, позади того, почему Tikzdevice дает ошибку при попытке построить свой участок:
Когда вы добавляете эстетическое отображение, которое создает легенду, например,
aes(colour=que_id)
, GGPLOT2 будет использовать имя переменной как название легенды --- в этом случае Que_id.Тикздевице проходит все строки, такие как заголовки легенды, латекс для набора набора.
В латексе подчеркивающий персонаж,
_
, используется для обозначения индекса. Если подчеркивание используется вне математического режима, он вызывает ошибку.
Когда Tikzdevice пытается рассчитать высоту и ширину заголовка легенды, «Que_id», она передает строку в латекс для набора набора и ожидает латекс для возврата ширины и высоты строки. Латекс терпит ошибку, потому что в строке из MathMode используется необоснованная подчеркивание. Тикздевице получает NULL
для ширины строки вместо номера, который вызывает if (width > 0)
Проверьте неудачу.
Способы избежать проблемы
Укажите заголовок легенды для использования, добавив цветную масштаб:
p1 <- ggplot(plot_info, aes(elevation, area)) p1 <- p1 + geom_point(aes(colour=que_id)) # Add a name that is easier for humans to read than the variable name p1 <- p1 + scale_colour_brewer(name="Que ID") # Or, replace the underscore with the appropriate LaTeX escape sequence p1 <- p1 + scale_colour_brewer(name="que\\textunderscore id")
Используйте функцию Sning Sanitization, введенную в Tikzdevice 0.5.0 (но был сломан до 0,5,2). В настоящее время Sning Sanitization будет сбежать только в следующих персонажах:
%
,$
,{
,}
, а также^
по умолчанию. Тем не менее, вы можете указать дополнительные пары замены черезtikzSanitizeCharacters
а такжеtikzReplacementCharacters
опции:# Add underscores to the sanitization list options(tikzSanitizeCharacters = c('%','$','}','{','^', '_')) options(tikzReplacementCharacters = c('\\%','\\$','\\}','\\{', '\\^{}', '\\textunderscore')) # Turn on string sanitization when starting the plotting device tikz('myPlot.tex', standAlone = TRUE, sanitize = TRUE) print(p1) dev.off()
Мы будем публиковать версию 0.5.3 Тикздевице в ближайшие пару недель, чтобы решить некоторые раздражающие предупреждающие сообщения, которые теперь появляются из-за изменений в способе ручек R system()
. Отказ Я добавлю следующие изменения в эту следующую версию:
Лучшее предупреждающее сообщение, когда
width
являетсяNULL
Указывает на то, что есть, вероятно, что-то не так с текстом сюжета.Добавьте подчеркивание и несколько других символов набор символов по умолчанию, для которых Sning Siditizer ищет.
Надеюсь это поможет!
Другие советы
Q2: Я являюсь сопровождающим PGFWEAVE.
Вот результаты теста, который я побежал:
time R CMD Sweave time-test.Rnw
real 0m1.133s
user 0m1.068s
sys 0m0.054s
time R CMD pgfsweave time-test.Rnw
real 0m2.941s
user 0m2.413s
sys 0m0.364s
time R CMD pgfsweave time-test.Rnw
real 0m2.457s
user 0m2.112s
sys 0m0.283s
Я считаю, что есть 2 причины разницы во времени, но потребуется больше работы, чтобы их точно проверить:
- PGFWEAVEVE делает тонну проверки и двойной проверки, чтобы убедиться, что она не повторяла дорогие вычисления. Цель состоит в том, чтобы сделать это возможным делать более дорогих расчетов и построения в документ. Шкала «дорогостоящего» в этом случае намного больше, чем дополнительные секунды или два, чтобы проверить проверки.
В качестве примера кэширования рассмотрите следующий тестовый файл, чтобы увидеть реальные преимущества кэширования:
\documentclass{article}
\begin{document}
<<plot.opts,cache=TRUE>>=
x <- Sys.sleep(10)
@
\end{document}
И результаты:
time R CMD Sweave time-test2.Rnw
real 0m10.334s
user 0m0.283s
sys 0m0.047s
time R CMD pgfsweave time-test2.Rnw
real 0m12.032s
user 0m1.356s
sys 0m0.349s
time R CMD pgfsweave time-test2.Rnw
real 0m1.423s
user 0m1.121s
sys 0m0.266s
- Sweave претерпела некоторые изменения в R 2.12. Изменения, возможно, ускорили процесс оценки кусочки кода и покинули PGFWeave позади для этих меньших расчетов. Стоит заглянуть внутрь
Q3: Я все время использую PGFSweaveve для моей собственной работы. В R 2.12 были некоторые изменения в Sweave в R 2.12, которые вызывают некоторые незначительные проблемы с PGFsweave, но новая версия наступает, которая исправляет все. Версия для разработки на GitHub ( https://github.com/cameronbracken/pgfsweave.) уже есть изменения. Если у вас есть дополнительные проблемы, я был бы рад помочь.
Q2: вы используете \pgfrealjobname{<DOCUMENTNAME>}
В заголовке и варианте external=TRUE
Для графических кусков? Я обнаружил, что это значительно увеличивает скорость (не для первой компиляции, но для последующих, если графика не изменяется). Вы найдете больше фона в Vignette PGFsweave.
Q3: Для меня все работает нормально, я использую Windows + Eclipse / StateT / Texlipse, как вы.