针织图的动态高度和宽度

Bra*_*sen 30 r knitr

在knitr中,可以通过在块选项中指定它来指定绘图的大小.

例如:

```{r, fig.width=9,fig.height=3}
plot(x)
```
Run Code Online (Sandbox Code Playgroud)

我希望能够在变量的基础上动态调整图形的高度和宽度x.假设x是data.frame:

x <- data.frame(x=factor(letters[1:3]),y=rnorm(3))
Run Code Online (Sandbox Code Playgroud)

例如,我想说我想将fig.height调整为等于 length(unique(x$x))

ags*_*udy 23

例如,您可以在另一个块中定义宽度,然后使用它

```{r,echo=FALSE}
x <- data.frame(x=factor(letters[1:3]),y=rnorm(3))
len = length(unique(x$x))
```


```{r fig.width=len, fig.height=6}

plot(cars)
```
Run Code Online (Sandbox Code Playgroud)

  • @BrandonBertelsen我明白了,但是'knitr`必须在评估块之前打开图形设备(具有适当的大小)*,所以你必须评估前一个块中的代码才能使用后一个块中的对象. (4认同)

Nov*_*ova 7

我刚刚发现了一篇关于此的精彩博文.

阅读更多Michael J Williams的博客 - 我无耻地窃取了代码,因此更详细.记得将块选项设置为results ="asis".

假设您想使用循环输出一堆图,但您希望它们各自具有不同的大小.定义以下函数(同样,我只是在这里复制粘贴):

subchunkify <- function(g, fig_height=7, fig_width=5) {
  g_deparsed <- paste0(deparse(
    function() {g}
  ), collapse = '')

  sub_chunk <- paste0("
  `","``{r sub_chunk_", floor(runif(1) * 10000), ", fig.height=",
   fig_height, ", fig.width=", fig_width, ", echo=FALSE}",
  "\n(", 
    g_deparsed
    , ")()",
  "\n`","``
  ")

  cat(knitr::knit(text = knitr::knit_expand(text = sub_chunk), quiet = TRUE))
}
Run Code Online (Sandbox Code Playgroud)

并使用这样的函数,定义自己的图形大小:

```{r echo=FALSE, results='asis'}
g <- ggplot(economics, aes(date, unemploy)) + 
  geom_line()
subchunkify(g, 10, 3)
subchunkify(g, 7, 7)
```
Run Code Online (Sandbox Code Playgroud)

或者让数据定义大小:

```{r echo=FALSE, results='asis'}
g <- ggplot(economics, aes(date, unemploy)) + 
  geom_line()
for (i in seq(2, 5)) {
  subchunkify(g, i / 2, i)
}
```
Run Code Online (Sandbox Code Playgroud)

迈克尔警告你必须小心:

由于我们正在使用results ='asis',如果我们想要从块中输出文本或标题或其他内容,我们必须使用原始HTML,而不是Markdown,我们必须使用cat()来执行此操作,而不是print() .例如:

g <- ggplot(economics, aes(date, unemploy)) + 
  geom_line()

cat('<h2>A Small Square Plot</h2>')
subchunkify(g, 3, 3)
Run Code Online (Sandbox Code Playgroud)

再说一遍,不是我的工作......转到那篇可爱的博客文章了解更多细节.希望这对你有用.