2016-09-29 64 views
0

我在R Markdown/knittr文檔內創建條形圖。我會將圖的垂直尺寸與條形圖中的行數成比例。定製R在迴路內Markdown繪圖大小

編輯:最好的解決方案還可以交叉表和圖。見Interleaving tables and plots in R Markdown, within loop

在這個例子中,具有「3化油器」的汽車的MPG圖與具有「2化油器」的汽車的圖高度相同,即使對於2化油器汽車有三種不同的齒輪配置並且只有一個用於3-Carburetor汽車。

enter image description here

enter image description here

```{r cars, echo=FALSE} 
library(ggplot2) 

carb.possibilities <- sort(unique(as.character(mtcars$carb))) 

filtereds <- lapply(carb.possibilities, function(carb.ct) { 
    return(mtcars[ mtcars$carb == carb.ct , ]) 
}) 

carb.possibilities <- paste(carb.possibilities, ' Carburetors', sep = '') 

names(filtereds) <- carb.possibilities 

lapply(carb.possibilities, function(one.possibility) { 

    current.possibility <- filtereds[[one.possibility]] 

    ggplot(current.possibility, aes(factor(gear), mpg)) + 
    coord_flip() + 
    labs(x = "Gears", title = one.possibility) + 
    geom_point(position=position_jitter(width = 0.1, height = 0.1)) 
}) 
``` 

回答

1

下面是使用grid.arrange

```{r cars, echo=FALSE, fig.height=30} 
library(ggplot2); library(gridExtra) 

carb.possibilities <- sort(unique(as.character(mtcars$carb))) 

filtereds <- lapply(carb.possibilities, function(carb.ct) { 
    return(mtcars[ mtcars$carb == carb.ct , ]) 
}) 

carb.possibilities <- paste(carb.possibilities, ' Carburetors', sep = '') 

names(filtereds) <- carb.possibilities 
p <- list() 
k <- 1 
heights <- c() 
for(one.possibility in carb.possibilities){ 
    current.possibility <- filtereds[[one.possibility]] 
    heights[k] <- length(unique(current.possibility$gear)) 
    p[[k]] <- ggplot(current.possibility, aes(factor(gear), mpg)) + 
    coord_flip() + 
    labs(x = "Gears", title = one.possibility) + 
    geom_point(position=position_jitter(width = 0.1, height = 0.1)) 
    k <- k + 1 
} 

do.call(grid.arrange, c(p, list(ncol = 1, heights= heights))) 

``` 
+0

感謝一個解決方案,我會盡力,明天。也許我應該說,我正計劃在每個情節之間插入一些文本和表格。你是否會與你的解決方案兼容? –

+0

是的......只需使用grid.arrange和height參數,例如grid.arrange(p [[1]],heights = height [1])。你可以做多個圖,如grid.arrange(p [1:2],heights = height [1:2])。 –

+0

就比例圖高度而言,這個解決方案是完美的。從報告到報告的圖表數量不會保持不變,所以我使得圖形高度成比例((fig.height = length(unique(as.character(mtcars $ carb)))* 2)'。我不認爲我理解你對我關於交錯文本的觀點的迴應......如果我將「print(one.possibility)」添加到循環中,那麼所有打印語句都會聚集在頂部,但這也會發生在我現有的代碼。我想我需要發表另一個問題。 –