【问题标题】:knitr: calling a ggplot2 function in a loop doesn't plot when accompanied by certain other plotting functionsknitr:当伴随某些其他绘图函数时,在循环中调用 ggplot2 函数不会绘图
【发布时间】:2013-03-19 03:49:14
【问题描述】:

我不确定这是一个真正的错误还是我遗漏了一些东西,但它就是这样。 我有一个要循环调用的 ggplot 函数 (plot_data)。我已经将该函数包含在它自己的块中。在第一种情况下(标题为“works”的块),在循环中调用该函数可以正常工作,在这种情况下,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}

【问题讨论】:

  • 这是一个长镜头,但par("ask")是真的吗?
  • 每个块中的&lt;&lt;setup&gt;&gt; 是怎么回事(不是说它改变了问题)?为什么不在setup 中设置eval = TRUE,然后不打扰调用它?
  • sebastian-c: no par("ask") 计算结果为假。
  • mnel:我一直在尝试不同的方式来调用块代码。正如您建议的那样,按照通常的方式进行操作具有相同的效果。我将编辑源代码以反映这一点。
  • 有趣;可能是一个错误;欢迎大家留言github.com/yihui/knitr/issues,以后我会看看的

标签: r ggplot2 knitr


【解决方案1】:

我认为您向knitr 提出了很多问题。在 R 中对齐基本图形和网格图形不是很容易和具有挑战性。我不知道 knitr 是如何使用(包乳胶 graphics)的,但我认为当你调用 heatmap 时,它在网格图的同一位置打印。

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

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

【讨论】:

    【解决方案2】:

    我认为你的函数有错误,融化的变量已关闭。这对我有用:

    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,]  )
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多