Проблемы с ggplot и pgfSweave - PullRequest
       36

Проблемы с ggplot и pgfSweave

6 голосов
/ 18 ноября 2010

Я начал использовать 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.С pgfSweave это занимает примерно 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: В целом, я хотел бы спросить, если кто-нибудь вообще успешно использует pgfSweave?Успешно я имею в виду, что все, что работает в Sweave, также работает в pgfSweave, с дополнительным преимуществом хороших шрифтов и улучшенной скоростью.;)

Большое спасибо за ответы!

Ответы [ 3 ]

4 голосов
/ 19 ноября 2010

Q1: У кого-нибудь есть объяснения этому поведению?

Три причины, по которым tikzDevice выдает ошибку при попытке построить свой график:

  • Когда вы добавляете эстетическое отображение, которое создает легенду, например aes(colour=que_id), ggplot2 будет использовать имя переменной в качестве заголовка легенды - в данном случае que_id.

  • tikzDevice передает все строки, например заголовки легенды, в LaTeX для набора текста.

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

Когда tikzDevice пытается вычислить высоту и ширину заголовка легенды «que_id», он пропускает строкув LaTeX для набора текста и ожидает, что LaTeX вернет ширину и высоту строки.LaTeX имеет ошибку, потому что в строке за пределами математического режима используется неэкранированное подчеркивание.TikzDevice получает NULL для ширины строки вместо числа, которое приводит к сбою проверки if (width > 0).

Способы избежать проблемы

  1. Укажите заголовок легенды, который нужно использовать, добавив цветовую шкалу:

    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")
    
  2. Используйте функцию санации строк, представленную в tikzDevice 0.5.0 (но не работает до 0.5.2).В настоящее время при очистке строк будут использоваться только следующие символы: %, $, {, } и ^ по умолчанию.Однако вы можете указать дополнительные пары подстановки с помощью параметров 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 tikzDevice в следующей паренедели, чтобы обратиться к некоторым раздражающим предупреждающим сообщениям, которые теперь появляются из-за изменений в способе обработки R system().Я добавлю следующие изменения в эту следующую версию:

  • Лучшее предупреждающее сообщение, когда width равно NULL, указывающее, что, возможно, что-то не так с текстом графика.

  • Добавьте подчеркивания и несколько других символов к набору символов по умолчанию, который ищет средство для очистки строк.

Надеюсь, это поможет!

3 голосов
/ 19 ноября 2010

Q2: я поддерживаю pgfsweave.

Вот результаты теста, который я провел:

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

Я полагаю, что есть две причины разницы во времени, но для их точной проверки потребуется больше работы:

  • pgfSweave выполняет массу проверок и двойных проверок, чтобы убедиться, что он не повторяет дорогостоящие вычисления. Цель состоит в том, чтобы сделать возможным выполнение более дорогих расчетов и построение чертежей в документе. Шкала «дорого» в этом случае намного больше, чем дополнительная секунда или две для проверки.

В качестве примера кэширования рассмотрите следующий тестовый файл, чтобы увидеть реальные преимущества кэширования:

\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
  • Свив претерпел некоторые изменения в R 2.12. Изменения, возможно, ускорили процесс оценки фрагмента кода и оставили pgfSweave позади для этих небольших вычислений. Стоит заглянуть в

Q3: я все время использую pgfSweave для своей работы. Были некоторые изменения в Sweave в R 2.12, которые вызывали некоторые незначительные проблемы с pgfSweave, но готовится новая версия, которая исправляет все. Версия для разработчиков на github (https://github.com/cameronbracken/pgfSweave) уже содержит изменения. Если у вас возникли дополнительные проблемы, я был бы рад помочь.

1 голос
/ 18 ноября 2010

Q2: Вы используете \pgfrealjobname{<DOCUMENTNAME>} в заголовке и опцию external=TRUE для графических блоков? Я обнаружил, что это значительно увеличивает скорость (не для первой компиляции, а для последующих, если графика не изменилась). Вы найдете больше фона в виньетке pgfSweave.

В3: У меня все отлично работает, я использую Windows + Eclipse / StatEt / Texlipse, как вы.

...