knitr:在循环中调用ggplot2函数时,如果伴有某些其他绘图函数则不会绘制

时间:2013-03-19 03:49:15

标签: r ggplot2 knitr

我不确定这是不是一个真正的错误,或者我错过了一些东西,但在这里它。 我有一个ggplot函数(plot_data),我想在循环中调用。我已将该功能包含在自己的块中。调用该函数在第一种情况(标题为“工作”的块)的循环中工作正常,在这种情况下,plot_data函数后跟一个条形图。但是,在第二种情况下,plot_data()函数后面跟着一个热图,但奇怪的是,热图会抑制plot_data函数。无论是否在plot_data函数周围调用plot()或print(),都会发生这种情况。

有没有办法让ggplots与knitr一起行动?如何在函数调用中抑制前一个函数调用的输出?

以下代码为我重现错误:

[preamble omitted]
\begin{document}

<<setup, eval=TRUE, echo=FALSE, cache=FALSE>>=
plot_data <- function(data) {
    require(ggplot2)
    require(reshape)
    d.melt <- melt(data)
    ggplot(data=d.melt, aes(x=X2, y=value, group=X1, colour=X1)) + geom_line(size=.5) +
          scale_x_discrete("") +
          scale_y_continuous("Value")
    }
@

<<works, echo=FALSE, results='asis', out.width='.3\\linewidth', dev='pdf', cache=TRUE >>=
set.seed(10010)
data <- matrix(runif(10000, 1,100), ncol=100)
for (i in 1:10) {
    ind <- sample(1:100, 10)
    plot(plot_data(data[ind,]))
    barplot(ind)
}
@

<<doesnt-work, echo=FALSE, results='asis', out.width='.3\\linewidth', dev='pdf', cache=TRUE >>=
set.seed(10010)
data <- matrix(runif(10000, 1,100), ncol=100)
for (i in 1:10) {
    ind <- sample(1:100, 10)
    plot(plot_data(data[ind,]))  # calling print instead of plot doesn't work either
    heatmap(data[ind,]  )
}
@

\end{document}

2 个答案:

答案 0 :(得分:3)

我想你从knitr那里问了很多。在R中对齐基本图形和网格图形并不是非常容易和具有挑战性。我不知道knitr如何使用它(包装乳胶graphics),但我认为当你调用{时{1}},它打印在网格图的相同位置。

在调用基本图形之前添加heatmap对我来说很好:

plot.new

答案 1 :(得分:0)

我认为你的功能出现了错误,融化的变量是关闭的。这对我有用:

library(ggplot2)
library(reshape2)
set.seed(10010)
data <- matrix(runif(10000, 1,100), ncol=100)
for (i in 1:3) {
   ind <- sample(1:100, 10)

   d.melt <- melt(data[ind,])
   p<-ggplot(data=d.melt, aes(x=Var1, y=Var2, group=Var1, colour=Var1)) + 
      geom_line(size=.5) +
      scale_x_discrete("") +
      scale_y_continuous("Value")

   print(p)  
   plot.new()
   heatmap(data[ind,]  )
}