2015-12-04 5 views
2

Следующие knitr thingy производит несколько участков по lapply. Поэтому их количество и содержание варьируются в зависимости от предыдущего кода R.Переменная высота участка в пределах одного куска

Есть ли способ установить высоту участка отдельно для каждого участка, используя переменную (например, высоту самого высокого бара в данной гистограмме)?

--- 
title: "Variable plot height" 
output: word_document 
--- 

Plots: 

```{r, echo=FALSE, fig.height = 2} 
library(ggplot2) 
library(tidyr) 

data(mtcars) 
mtcars$car = row.names(mtcars) 

cars = gather(mtcars[1:5, ], variable, value, 
       -c(car, mpg, disp, hp, qsec)) 

lapply(unique(cars$car), function(x) { 

    ggplot(cars[cars$car == x, ], aes(variable, value)) + 
     geom_bar(stat = "identity") 

}) 
``` 
+0

См [это связанный с ним вопрос] (http://stackoverflow.com/questions/33701038/print-a-list-of-dynamically-sized-plots-in-knitr/33723600#33723600) о том, как используйте разные значения 'fig.height' внутри« одного »фрагмента. –

+0

Другой вариант - создать фигуры (т. Е. Использовать 'ggsave') и включить их в документ. –

+0

Спасибо за предложение, @ RomanLuštrik - это выглядит действительно интуитивным. Можете ли вы дать мне подсказку: результирующее число и имена цифр, сохраненных 'ggsave', являются переменными. Как перебрать их, чтобы включить их в документ? – jakub

ответ

2

Один из способов - создать каждое изображение и включить его в документ как внешнее изображение. Вы можете использовать мощность "asis". Вот небольшой пример.

--- 
title: "Untitled" 
author: "Neznani partizan" 
date: "04. december 2015" 
output: html_document 
--- 

```{r, echo=FALSE, fig.height = 2} 
library(ggplot2) 
library(tidyr) 

data(mtcars) 
mtcars$car = row.names(mtcars) 

cars = gather(mtcars[1:5, ], variable, value, 
       -c(car, mpg, disp, hp, qsec)) 

suppressMessages(invisible(lapply(unique(cars$car), function(x) { 

    ggplot(cars[cars$car == x, ], aes(variable, value)) + 
     geom_bar(stat = "identity") 
    ggsave(sprintf("%s.png", x)) 

}))) 
``` 

```{r results = "asis", echo = FALSE} 
cat(sprintf("<img src='%s' alt='' style='width:350px;height:228px;'> <br />", 
      list.files(pattern = ".png", full.name = TRUE))) 
``` 

размеры изображения могут быть скорректированы на лету, используя соответствующие аргументы в ggsave и/или в печати HTML-код.

+0

'asis' на помощь! И я могу сохранить высоту графика в переменной, а затем вызывать ее из фрагмента 'asis', используя' paste' в сочетании с 'sprintf', чтобы установить ширину графика в документе. Единственное: он работает на html, но не на словах - фотографии отсутствуют в файле слов - любая идея почему? @ RomanLuštrik – jakub

+0

@jakub извините, я не знаком с тем, как изображения вставляются в слово. Вероятно, не по ссылке, а с жесткой кодировкой. Если это так, это решение может не работать из коробки. –

+0

Насколько я знаю, изображения правильно вставлены в слово, если 'knitr' контролирует их. Вставляя жесткий код HTML, этот механизм прерывается. –

0

fig.width и fig.height Варианты кусков могут принимать несколько значений. В вашем примере есть пять графиков, поэтому, установив числовой вектор длиной 5 для ширины и высоты и сохранив список объектов ggplot, вы можете иметь один кусок, который в конечном документе будет иметь пять графических изображений разных размеров. Ниже приведен пример файла .Rmd.

--- 
title: "Variable plot height" 
output: word_document 
--- 

Plots: 

```{r, echo=FALSE} 
library(ggplot2) 
library(tidyr) 
data(mtcars) 
mtcars$car = row.names(mtcars) 
cars = gather(mtcars[1:5, ], variable, value, -c(car, mpg, disp, hp, qsec)) 

plots <- 
    lapply(unique(cars$car), function(x) { 
      ggplot(cars[cars$car == x, ], aes(variable, value)) + 
       geom_bar(stat = "identity") 
           }) 
widths <- c(3, 4, 5, 3, 6) 
heights <- c(3, 3, 3, 4, 3) 
``` 

```{r show_plots, fig.width = widths, fig.height = heights} 
plots 
``` 
Смежные вопросы