Подтвердить что ты не робот

Динамическая высота и ширина для нарезных участков

В knitr можно указать размер графика, просто указав его в параметрах куска.

Например:

```{r, fig.width=9,fig.height=3}
plot(x)
```

Я хотел бы иметь возможность динамически изменять высоту и ширину фигуры на основе переменных в x. Скажем, что x - это data.frame:

x <- data.frame(x=factor(letters[1:3]),y=rnorm(3))

Например, сакэ говорит, что я хотел бы настроить fig.height равным length(unique(x$x))

4b9b3361

Ответ 1

Вы можете, например, определить ширину в другом фрагменте, а затем использовать его

```{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)
```

Ответ 2

Обходной путь этой проблемы, особенно если вы хотите изменить параметр фигуры в цикле,

  • Определить другой кусок, функцию, которая выполняет цикл
  • Отдельно определите детали фигуры в следующих фрагментах

    ```{r, echo=FALSE}
    testFunction <- function (parameter) {
        x <- data.frame(x=c(1:parameter), y=rnorm(parameter))
        g1 <- ggplot(data=x, aes(x=x, y=y)) + geom_point()
        print(g1)
    }
    ```
    
    
    ```{r fig.width=10, fig.height=6}
    testFunction(10)
    ```
    
    
    ```{r fig.width=5, fig.height=4}
    testFunction(4)
    ```
    

Ответ 3

Я только что нашел замечательное сообщение в блоге об этом.

Подробнее в блоге Майкла Дж. Уильямса - я бесстыдно похитил код, поэтому более подробно там. Не забудьте установить параметры пакета для результатов = "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))
}

И используйте такую ​​функцию, определяя ваши собственные размеры фигур:

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

Или пусть данные определяют размеры:

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

В сообщении Майкл предупреждает, что вы должны быть осторожны:

Поскольку мы использовали результаты = 'asis', если мы хотим вывести текст или заголовки или что-нибудь еще из куска, мы должны использовать необработанный HTML, а не Markdown, и мы должны использовать cat() для этого, а не для печати (). Например:

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

cat('<h2>A Small Square Plot</h2>')
subchunkify(g, 3, 3)

Опять же, не моя работа... перейдите к этому прекрасное сообщение в блоге для получения более подробной информации. Надеюсь, это сработает для вас.