【发布时间】:2015-02-23 14:50:21
【问题描述】:
我正在尝试使用 Knitr、ggplot2 和 xtables 完成以下任务:
- 使用 ggplot2 生成多个带注释的 beta 分布图
- 在布局中编写输出,以便我有一个图,以及它后面的相应汇总统计表,用于每个图。
- 编写代码,以便可以以美观的方式生成 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线随机移动。 - 我也无法像为表格一样为图表添加单独的标题。
注意事项:
- 我将 beta 随机数存储在 data.table 中,因为在我们的实际代码中,我们使用的是 data.table。然而,为了以这种方式测试 ggplot2,我将 data.table 转换为 data.frame,因为 ggplot2 需要。
- 我还需要在循环中生成随机数并在每次迭代时生成图(所以像首先生成随机数然后使用
melt这样的方法在这里不起作用),因为生成随机数是在模拟一个复杂的每次循环迭代都会调用数据库。
我正在使用 RStudio 版本 0.98.1091 和 Windows 8.1 上的 R 版本 3.1.2 (2014-10-31)
这是预期的情节:
这是我从列表中绘制时得到的图:
我的 PDF 格式输出: PDF Output
如果有任何解决方案的想法,请提出建议。
谢谢,
SG
【问题讨论】:
-
1.您似乎正在使用 Sweave 生成输出。我在您的代码中没有看到大量的 LaTeX,因此 Knitr 包可能更适合您的目的。 Knitr 能够输出 PDF 和 HTML 文档。 2.“预期情节”和“列表情节”链接失效。
-
感谢zhaoy的评论。我更正了代码以与 knitr 一起使用。我不知道为什么这些数字的链接不能直接工作。但是,如果您右键单击并在新选项卡中打开图像,图像似乎就在那里。
标签: r ggplot2 rstudio knitr xtable