7

実験的なデザインを作成するときは、ggplot を使用してレイアウトを表示します。簡単な例を次に示します。

df <- data.frame(Block=rep(1:2, each=18),
            Row=rep(1:9, 4),
            Col=rep(1:4, each=9),
            Treat=sample(c(1:6),replace=F))

私は次のようにプロットします:

df.p <- ggplot(df, aes(Row, Col)) + geom_tile(aes(fill=as.factor(Treat)))

与える:

デザイン

時々、メインプロットなど、デザイン内にボックスを配置して強調したい構造があることがあります。この場合:

df$Mainplot <- ceiling(df$Row/3) + 3*(ceiling(df$Col/2) - 1)

次に、 geom_rect と、デザインごとに調整が必要な厄介なコードを使用して、次のようなものを生成します。

designwithmainplot

質問: メインプロットの周りに四角形を簡単に追加するにはどうすればよいですか? 単純な問題のように思えますが、明らかな方法は見つかりませんでした。色やその他の美学をメインプロットにマッピングできますが、それらをボックスで囲むことはできないようです。どんなポインタでも大歓迎です。

4

3 に答える 3

6

で境界線をプロットするための補助 data.frame を作成する場合の可能な解決策を次に示しますgeom_rect()。これがあなたが望むほど簡単かどうかはわかりません!長方形の座標を計算するコードが、ほんの少しの努力で再利用可能/一般化可能になることを願っています。

library(ggplot2)

# Load example data.
df = data.frame(Block=rep(1:2, each=18),
            Row=rep(1:9, 4),
            Col=rep(1:4, each=9),
            Treat=sample(c(1:6),replace=F))
df$Mainplot = ceiling(df$Row/3) + 3*(ceiling(df$Col/2) - 1)

# Create an auxiliary data.frame for plotting borders.
group_dat = data.frame(Mainplot=sort(unique(df$Mainplot)),
                       xmin=0, xmax=0, ymin=0, ymax=0)
# Fill data.frame with appropriate values.
for(i in 1:nrow(group_dat)) {
    item = group_dat$Mainplot[i]
    tmp = df[df$Mainplot == item, ]
    group_dat[i, "xmin"] = min(tmp$Row) - 0.5
    group_dat[i, "xmax"] = max(tmp$Row) + 0.5
    group_dat[i, "ymin"] = min(tmp$Col) - 0.5
    group_dat[i, "ymax"] = max(tmp$Col) + 0.5
}


p2 = ggplot() + 
     geom_tile(data=df, aes(x=Row, y=Col, fill=factor(Treat)), 
               colour="grey30", size=0.35) +
     geom_rect(data=group_dat, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax),
               size=1.4, colour="grey30", fill=NA)

ggsave(filename="plot_2.png", plot=p2, height=3, width=6.5) 

ここに画像の説明を入力

于 2012-12-01T01:35:37.700 に答える
2

これは、より簡単な解決策です。alpha を 0 に設定して使用geom_tileしてください。時間をかけて正確な解決策を示すことはしませんでしたが、例を次に示します。あなたが望むものを達成するには、実際に新しいデータフレームを作成する必要があると思いますが、これは十分に簡単なはずです.

df <- data.frame(Block=rep(1:2, each=18),Row=rep(1:9, 4),Col=rep(1:4, each=9),Treat=sample(c(1:6),replace=F))
df$blocking <- rep(sort(rep(1:3,3)),4)
df.p <- ggplot(df, aes(Row, Col)) + geom_tile(aes(fill=as.factor(Treat)))
df.p+ geom_tile(data=df,aes(x=Row,y=blocking),colour="black",fill="white",alpha=0,lwd=1.4)

alpha=0空白のタイルを作成し、 を使用して線幅を設定できますlwd。おそらく、すべての長方形を指定するよりも簡単です。それが役に立てば幸い。

于 2012-11-30T23:32:21.307 に答える
0

私が見逃していることは明らかではないので、私自身の(理想的ではない)解決策を投稿する価値があると思いました。誰かが何かを思いつくことを期待して、質問には答えないままにします。

現在、私は geom_rect をおそらく一般化できる方法で使用しています (おそらく ggplot への geom_border の追加??)。私の質問の例では、重要な情報は、各メインプロットが 3 x 2 であることです。

元の質問に加えてdf.p、これは私が現在行っていることです:

df.p1 <- df.p + geom_rect(aes(xmin=((Mainplot- 3*(ceiling(Col/2)-1) )-1)*3 + 0.5,
                         xmax=((Mainplot - 3*(ceiling(Col/2)-1))-1)*3 + 3.5,
                         ymin=ceiling(ceiling(Col/2)/2 + 2*(ceiling(Col/2)-1))-0.5,
                         ymax=2*ceiling(Col/2)+0.5),
                     colour="black", fill="transparent",size=1)

醜い、私は知っています-したがって、質問です。そのコードは、質問から 2 番目のプロットを生成します。おそらく最良のオプションは、これをすべて関数に組み込むことです。

于 2012-12-03T03:23:51.930 に答える