Я пытаюсь выполнить следующую задачу с помощью Knitr, ggplot2 и xtables:
- Создайте несколько аннотированных графиков бета-распределений с помощью ggplot2
- Запишите результат в виде макета, чтобы у меня был график и соответствующая сводная таблица Stats после него для каждого графика.
- Напишите код так, чтобы отчеты в формате PDF и HTML можно было создавать в презентабельном виде.
Вот моя попытка выполнить эту задачу (файл Rnw):
\documentclass{article}
\begin{document}
Test for ggplot2 with Knitr
<<Initialize, echo=FALSE>>=
library(ggplot2)
library(ggthemes)
library(data.table)
library(grid)
library(xtable)
library (plyr)
pltlist <- list()
statlist <- list()
@
The libraries are loaded. Now run the main loop
<<plotloop, echo=FALSE>>=
for (k in seq(1,7)){
x <- data.table(rbeta(100000,1.6,14+k))
xmean <- mean(x$V1, na.rm=T)
xqtl <- quantile(x$V1, probs = c(0.995), names=F)
xdiff <- xqtl - xmean
dens <- density(x$V1)
xscale <- (max(dens$x, na.rm=T) - min(dens$x, na.rm=T))/100
yscale <- (max(dens$y, na.rm=T))/100
y_max <- max(dens$y, na.rm=T)
y_intercept <- y_max-(10*yscale)
data <- data.frame(x)
y <- ggplot(data, aes(x=V1)) + geom_density(colour="darkgreen", size=2, fill="green",alpha=.3) +
geom_vline(xintercept = xmean, colour="blue", linetype = "longdash") +
geom_vline(xintercept = xqtl, colour="red", linetype = "longdash") +
geom_segment(aes(x=xmean, xend=xqtl, y=y_intercept, yend=y_intercept), colour="red", linetype = "solid", arrow = arrow(length = unit(0.2, "cm"), ends = "both", type = "closed")) +
annotate("text", x = xmean+xscale, y = y_max, label = paste("Val1:",round(xmean,4)), hjust=0) +
annotate("text", x = xqtl+xscale, y = y_max, label = paste("Val2:",round(xqtl,4))) +
annotate("text", x = xmean+10*xscale, y = y_max-15*yscale, label = paste("Val3:",round(xdiff,4))) +
xlim(min(dens$x, na.rm=T), xqtl + 9*xscale) +
xlab("Values") +
ggtitle("Beta Distribution") +
theme_bw() +
theme(plot.title = element_text(hjust = 0, vjust=2))
pltlist[[k]] <- y
statlist[[k]] <- list(mean=xmean, quantile=xqtl)
}
stats <- ldply(statlist, data.frame)
@
Plots are ready. Now Plot them
<<PrintPlots, warning=FALSE, results='asis', echo=FALSE, cache=TRUE, fig.height=3.5>>=
for (k in seq(1,7)){
print(pltlist[[k]])
print(xtable(stats[k,], caption="Summary Statistics", digits=6))
}
@
Plotting Finished.
\end{document}
После запуска этого кода я столкнулся с несколькими проблемами.
- Когда я запускаю этот код так же, как код R, как только я пытаюсь распечатать графики в списке, горизонтальная линия из части
geom_segment
начинает перемещаться повсюду. Однако, если я нанесу цифры по отдельности, не помещая их в список, цифры будут хорошими, как я и ожидал. - Только последний график такой, как я ожидал, на всех других графиках линия
geom_segment
перемещается случайным образом. - Я также не могу поставить отдельную подпись для графиков, как могу для таблиц.
На заметку:
- Я храню бета-случайные числа в data.table, поскольку в нашем фактическом коде мы используем data.table. Однако в целях тестирования ggplot2 таким способом я конвертирую data.table в data.frame, как того требует ggplot2.
- Мне также нужно сгенерировать случайные числа в цикле и сгенерировать графики для каждой итерации (так что что-то вроде сначала генерации случайных чисел, а затем использования
melt
здесь не сработает), поскольку генерация случайных чисел имитирует сложный вызов базы данных на итерацию петля.
Я использую RStudio версии 0.98.1091 и R версии 3.1.2 (2014-10-31) в Windows 8.1
Это ожидаемый сюжет:
Это график, который я получаю при построении из списка:
Мой вывод в формате PDF: Вывод в PDF
Пожалуйста, посоветуйте, есть ли идеи для решения.
Спасибо,
SG