Help us understand the problem. What is going on with this article?

学会発表のためのggplot2の設定めも

More than 3 years have passed since last update.

気がつけばもう何ヶ月も前の話ですが、学会発表のためにポスターに使う図の設定に戸惑ったのでめもです。なお作図ファイルの形式はpdfで、R Markdownによる自動作図です(png形式だとサイズを変更する際に粗くなってしまうので)。ここに貼り付けている画像はPDFをpng形式に変換したものです。

完成形はこんな感じ。

poster のコピー.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)

default-1.png

テーマを変更する

全体の見た目はテーマを設定しなおすことで変更が可能です。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"))

set_theme-1.png

ベースとなるフォントの種類、サイズもここで指定します。こうしておけば、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))

jp_label-1.png

軸ラベルの改行

図の幅よりラベルが長いと不格好なので適当に改行します。\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))

jp_label2-1.png

枠を透過させる

ポスターが青とか緑とか、何かの色で塗りつぶしてある背景だと、プロットした図を配置した際にちょっとダサい。というわけで透過させます。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.backgroundelement_rect(データの各点などが図示される領域)の背景色を青(#87CEEB)の10%透過を指定しました。ポスターの背景色と合わせると良い感じになります。

opacity-1.png

複数の図を一つにまとめる

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)

multiple_plot-1.png

数式・統計値を埋め込む

あとで書く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があった気がするけど忘れてしまいました...思い出したら書きます。

参考

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away