2013-03-12 20 views
23

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

例のために、私はあなたが例えば、別のチャンクで幅を定義することができますlength(unique(x$x))

答えて

15

に等しくなるようにfig.heightを調整したいと言うことができますそして、あなたがループ内でフィギュア化パラメータを変更したい場合は特に、それは

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

私はこの答えが好きです。私はちょうど(以前はそれを定義することなく)現在のチャンクを見てみたいと思っています。私は「前」フックで遊んでいて、何かを得ることができるかどうかを試してみました。これまでのサイコロはありません。 –

+4

@BrandonBertelsen私は理解していますが、 'knitr'はチャンクを評価する前に適切なサイズのグラフィカルデバイスを開く必要があるので、前のチャンクのコードを評価して後者のオブジェクトを使用する必要がありますチャンク。 –

+0

@BrandonBertelsen私はYihuiよりも良いとは言えません。ちょうど私にとっては、init.chunckのように、すべてのパラメータを1つのチャンクに設定するほうが読みやすいようになっています。 – agstudy

0

つの回避策にこの問題を使用

  1. は、別のチャンク、ループ
  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) 
    ``` 
    
1

でフィギュアの詳細を定義私はこのことについての素晴らしいブログの記事を見つけました。

続きを読むat Michael J Williams' blog - 私は恥知らずにコードを塗りつぶしました。 チャンクオプションを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)) 
} 

そして、あなた自身のフィギュアのサイズを定義し、このような関数を使用します。

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

::サイズを定義

私たちはresults = 'asis'を使用しているので、テキストや見出しなどをチャンクから出力したい場合は、MarkdownではなくHTMLを使用する必要があります。これを行うにはcat() print()ではありません。詳細は、そのlovely blog postにオーバーに

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

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

ここでも、ない私の仕事...頭:たとえば。これはあなたのために働くことを望みます。

+0

'cat(trimws(knitr :: knit(text = knitr :: knit_expand(text = sub_chunk)、quiet = TRUE)))'を読み込むように、 'subchunkify'関数の最後の行を修正する必要がありました。その後、すべてがうまくいった。 –

関連する問題