気がつけばもう何ヶ月も前の話ですが、学会発表のためにポスターに使う図の設定に戸惑ったのでめもです。なお作図ファイルの形式はpdfで、R Markdownによる自動作図です(png形式だとサイズを変更する際に粗くなってしまうので)。ここに貼り付けている画像はPDFをpng形式に変換したものです。
完成形はこんな感じ。
GitHubリポジトリにPDFファイルがありますので興味があればどうぞ。これからの作図はirisデータでやっていますが、データが違うだけでやった方法は同じです。
まず、通常のggplot2
でのプロットを見てみましょう。このままでも良いのですが、ggplot2
は各種の変更も簡単なので、好みの図となるようにあれこれ変えていきます。
library(ggplot2)
p <- ggplot(data = iris, aes(x = Sepal.Length, y = Petal.Length)) +
geom_point(aes(colour = Species))
plot(p)
テーマを変更する
全体の見た目はテーマを設定しなおすことで変更が可能です。ggplot2
のテーマRで?ggtheme
とするか、こちらのページを参考ください。あるいは、別のテーマ用パッケージ(cttobin/ggthemr)を読み込んで変更もできます。
今回は白地の背景にx,y両軸の補助線をかかないtheme_classic
を使いました。
p + theme_classic()
とすれば適用されますが、個々の図ではなくRセッション中の設定としてこちらのテーマを適用するように、theme_set
関数でtheme_classic
の設定を適用させておきます。
theme_set(theme_classic(base_size = 18, base_family = "Helvetica"))
ベースとなるフォントの種類、サイズもここで指定します。こうしておけば、Rのセッションが終了するまでこの設定を保つことができます。
軸ラベルに日本語を使う
theme
関数にてフォントファミリーを細かく設定できます。ここでは游ゴシック(YuGo-Medium)を使いました。
theme_set(theme_classic(base_size = 36, base_family = "YuGo"))
quartzFonts(YuGo = quartzFont(rep("YuGo-Medium", 4)))
p +
scale_x_continuous(name = "萼片長", breaks = seq(0, 10, 2)) +
scale_y_continuous(name = "花弁長", breaks = seq(0, 8, 4)) +
theme(text = element_text(family = "YuGo-Medium"),
axis.title = element_text(size = 36),
axis.text.x = element_text(family = "Helvetica", size = 28),
axis.text.y = element_text(family = "Helvetica", size = 28))
軸ラベルの改行
図の幅よりラベルが長いと不格好なので適当に改行します。\n
が改行するコマンドなので、ラベル中に付け加えます。
p +
scale_x_continuous(name = "がくへんちょう\n(せんちめーとる)", breaks = seq(0, 10, 2)) +
scale_y_continuous(name = "かべんちょう\n(せんちめーとる)", breaks = seq(0, 8, 4)) +
theme(text = element_text(family = "YuGo-Medium"),
axis.title = element_text(size = 36),
axis.text.x = element_text(family = "Helvetica", size = 28),
axis.text.y = element_text(family = "Helvetica", size = 28))
枠を透過させる
ポスターが青とか緑とか、何かの色で塗りつぶしてある背景だと、プロットした図を配置した際にちょっとダサい。というわけで透過させます。pngなら透過も簡単ですが、pdfの図を貼り付けるので少し工夫します。
p +
scale_x_continuous(name = "がくへんちょう\n(せんちめーとる)", breaks = seq(0, 10, 2)) +
scale_y_continuous(name = "かべんちょう\n(せんちめーとる)", breaks = seq(0, 8, 4)) +
theme(text = element_text(family = "YuGo-Medium"),
axis.title = element_text(size = 36),
axis.text.x = element_text(family = "Helvetica", size = 28),
axis.text.y = element_text(family = "Helvetica", size = 28),
plot.background = element_rect(fill = "#87CEEB10"))
theme
関数の引数plot.background
にelement_rect
(データの各点などが図示される領域)の背景色を青(#87CEEB
)の10%透過を指定しました。ポスターの背景色と合わせると良い感じになります。
複数の図を一つにまとめる
gridExtra
パッケージを使います
library(gridExtra)
p1 <- ggplot(data = iris, aes(x = Sepal.Length, y = Petal.Length)) +
geom_point(size = 6, aes(colour = Species)) +
scale_x_continuous("萼片長", breaks = seq(0, 10, 2)) +
scale_y_continuous("花弁長", breaks = seq(0, 8, 4))
p2 <- ggplot(data = iris, aes(x = Sepal.Length, y = Petal.Length)) +
geom_point(size = 6, aes(colour = Species)) +
scale_x_continuous("萼片長", breaks = seq(0, 10, 2)) +
scale_y_continuous("花弁長", breaks = seq(0, 8, 4))
grid.arrange(p1, p2, ncol = 2)
数式・統計値を埋め込む
あとで書くggplot2ではannotate
関数なりを使って図中に文字列を埋め込むことが可能です。回帰式や統計値などは、R上で計算させるなり指定するなりして埋め込むと良いでしょう。お星様の前には~~
をつけるのもお約束です。
ggplot2
以外、baseプロットでも同じことですが、数式の表記は若干面倒です。相関係数Rは斜体にしたいのでitatic(r)
とします。また、イコールは2つ連続して表記します。
res.cor.test <- cor.test(iris$Sepal.Length, iris$Petal.Length)
label.r <- paste("italic(r) == ", round(res.cor.test$estimate, 3),
ifelse(res.cor.test$p.value <= 0.001, "~~'***'",
ifelse(res.cor.test$p.value <= 0.01, "~~'**'",
ifelse(res.cor.test$p.value <= 0.05, "~~'*'", "~~ns"))))
p + annotate("text", x = 50:50, y = 22,
colour = c("#000000"),
label = c(label.r),
parse = TRUE, size = 8, family = "Helvetica")
ほかにもtipsがあった気がするけど忘れてしまいました...思い出したら書きます。
参考
- H.ウィッカム著(石田基広・石田和枝訳). 2012. グラフィックスのためのRプログラミング ggplot2入門. 丸善出版.
- Winston Chang. 2012. R Graphics Cookbook: Practical Recipes for Visualizing Data. O'Reilly.
- Beautiful plotting in R: A ggplot2 cheatsheet | Technical Tidbits From Spatial Analysis & Data Science
- Using CJK Fonts in R and ggplot2 | Hi!!
- ggplot2 themes
- ggplot2で論文用の図を作るときに使いたいオプション(点のshape、色、軸の文字の大きさ、色、エラーバー、背景) - Qiita
- Data visualization with ggplot2(PDF)... RStudio謹製ggplot2のちーとしーと。ggplot2に慣れていないひとも慣れているひとも要ちぇっく