2

私はggplot2が初めてで、サンプルコードからフランケンシュタイン化した平均応答の棒グラフがあります。

グラフを再現するための dput() 出力:

> dput(mainerrors.df)
structure(list(sex = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("Male", 
"Female"), class = "factor"), condition = structure(c(1L, 2L, 
3L, 1L, 2L, 3L), .Label = c("Weather", "Negative", "Positive"
), class = "factor"), N = c(19, 18, 26, 55, 50, 49), willingness = c(5.47368421052632, 
5.48148148148148, 5.97435897435897, 6.37575757575758, 5.88666666666667, 
6.2312925170068), sd = c(1.3067525929499, 1.41524021482219, 1.05797742854762, 
0.865560893471263, 1.13611104180873, 0.969927645336604), se = c(0.299789605098861, 
0.333575317636226, 0.207486444350194, 0.116712207066377, 0.160670364368774, 
0.138561092190943), ci = c(0.629834588787353, 0.703782401529606, 
0.427326331312926, 0.233993886626096, 0.32287918557602, 0.278595748013486
)), .Names = c("sex", "condition", "N", "willingness", "sd", 
"se", "ci"), row.names = c(NA, 6L), class = "data.frame")

グラフを再現するコード:

figure.4 <- ggplot(mainerrors.df, aes(x = condition, y = willingness)) +
                facet_wrap(~sex) +
                geom_bar(stat="identity", colour="black", aes(fill=sex)) +
                geom_errorbar(aes(ymin=willingness-ci, ymax=willingness+ci),
                              size=.3,
                              width=.2,
                              position=position_dodge(.9)) +
                scale_fill_brewer(palette="Set3", name="Sex",
                                  breaks=c("Male", "Female"),
                                  labels=c("Male", "Female")) +
                scale_x_discrete("Peer Comment Frame") +
                scale_y_continuous("Willingness to use a condom (95% CI)", breaks=1:7)
                theme(plot.background = element_rect(fill = "transparent", colour = NA),
                      legend.position = "none",
                      axis.text.x = element_text(size=16),
                      axis.text.y = element_text(size=16),
                      axis.title.x = element_text(face="bold", colour="#7f7f7f", size=16, vjust=0.1),
                      axis.title.y = element_text(face="bold", colour="#7f7f7f", size=16),
                      strip.text.x = element_text(size = 16, colour = "black"))

vjustでどれだけ遊んでも、軸のタイトルが思い通りにならないことを除けば、すべてがとてもいい感じです。だから私は考えました:軸のタイトルをそこにぶらぶらするのではなく、プロット自体に入れてみませんか?ファセットのタイトルは、グラフをどのように表示したいかの完璧な例です (画像を直接投稿できないようです): http://postimg.org/image/cnma6zp99/

男性/女性が上部にあるように、x 軸/y 軸のタイトルをプロットの下/左側に沿って配置したいと思います。これを行う方法はありますか (または、vjust が許可するよりも正確に軸タイトルの位置を制御する方法がありますが、これが最適です)。

編集:グラフをどのように想像しているかの大まかな例を一緒にフォトショップしました: ここに画像の説明を入力

4

1 に答える 1

1

何をしたいのかは明確ではありませんが、@baptiste からインスピレーションを得たソリューションの始まりです。解決策はこちら。主なアイデアは、x と y のタイトルのカスタマイズを保持するカスタム要素を定義することです。解決策はまだ完成していませんが、アイデアは示されています。ラティスも使えます。この種のカスタマイズは、latticeパッケージを使用すると簡単です。

ここに画像の説明を入力

require(ggplot2)
require(grid)

# user-level interface to the element grob
my_axis = function(text,rot=0) {
  structure(
    list(text=text,rot=rot),
    class = c("element_custom","element_blank", "element") # inheritance test workaround
  )
}
# returns a gTree with two children: the text label, and a rasterGrob below
element_grob.element_custom <- function(element,...)  {
  g2 <- rectGrob(gp=gpar(fill='red',alpha=0.5))
  g1 <- textGrob(element$text, x=0.5,vjust=0.5,rot  =element$rot)
  gTree(children=gList(g2,g1), cl = "custom_axis")
}
# gTrees don't know their size and ggplot would squash it, so give it room
 grobHeight.custom_axis = heightDetails.custom_axis = function(x, ...)
   unit(1, "lines")


ggplot(mtcars,aes(mpg,disp))+geom_point()+facet_grid(.~vs)+
  theme_bw() +
  theme(axis.title.x = my_axis('my custom x title'),
        axis.title.y = my_axis('my custom y title',rot=90))
于 2013-03-26T15:08:06.593 に答える