まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

ggplot2覚書⑤ 体裁(theme、テキストgeom)に関しての大枠

引き続き「Rグラフィッククックブック」。

過去記事は以下。

ggplot2覚書① 棒グラフ - まずは蝋の翼から。

ggplot2覚書② 散布図 - まずは蝋の翼から。

ggplot2覚書③ 注釈(解釈補助) - まずは蝋の翼から。

ggplot2覚書④ 軸について - まずは蝋の翼から。

テキストの体裁

ggplot2のテキストは、テーマ要素とテキストgeomの2種類がある。
テーマ要素はタイトル、 凡例、軸など、図内にあるデータ以外のすべて。
テキストgeomはプロット自身の一部。

指定するパラメータは以下のようになっている。

theme要素

タイトル、軸ラベル、軸目盛など、テーマ要素の体裁を指定するには、theme()を使いelement_ text()で要素を設定する。 例えば、axis.title.xはx軸ラベル、plot.titleはタイトルテキストの体裁の指定。

テーマ要素 テキストgeom 説明
family family フォント(Helvetica, Times, HiraKakuPro-W3)
face fontface 文字効果(plain, bold, italic, bold.italic)
colour colour 色(色名、色コード)
size size フォントサイズ(themeではポイント数、テキストgeomではmm単位)
hjust hjust 水平方向位置(0:左、0.5:中央、1:右)
vjust vjust 垂直方向位置(0:下、0.5:中央、1:上)
angle angle 角度
lineheight lineheight 行間隔倍率

themeでテキスト体裁設定できる要素は以下。

要素名 説明
axis.title 両軸ラベルの体裁
axis.title.x x軸ラベルの体裁
axis.title.y y軸ラベルの体裁
axis.ticks 両軸目盛ラベルの体裁
axis.ticks.x x軸目盛ラベルの体裁
axis.ticks.y y軸目盛ラベルの体裁
legend.title 凡例項目の体裁
plot.title タイトルの体裁
strip.text 両方向ファセットラベルの体裁
strip.text.x 水平方向ファセットラベルの体裁
strip.text.y 垂直方向ファセットラベルの体裁
library(dplyr)
library(gcookbook)
library(patchwork)

# 基本プロット
p <- ggplot(heightweight, aes(x=ageYear, y=heightIn)) + 
  geom_point() 

# テーマ要素の体裁を指定する 
# rel(1.5)はテーマにおける基本フォントサイズの1.5倍
g1 <- p + theme(axis.title.x=element_text(size=16, lineheight=.9, family="Times", face="bold.italic", colour="red"))


# テーマ要素ではフォントサイズはポイント単位
g2 <- p + ggtitle("Age and Height\nof Schoolchildren") + 
  theme(plot.title=element_text(size=rel(1.5), lineheight=.9, family="Times", face="bold.italic", colour="red"))

g1 | g2

f:id:chito_ng:20190223160901p:plain

また、テキストgeom(geom_text()やannotate()によって作られる、プロット中にあるテキスト)の体裁を設定するには、geom内で直接設定を打ち込む。

library(dplyr)
library(gcookbook)
library(patchwork)

# 基本プロット
p <- ggplot(heightweight, aes(x=ageYear, y=heightIn)) + 
  geom_point() 

# テキストgeomではフォントサイズはmm単位
p + annotate("text", x=15, y=53, label="Some text", size = 7, family="Times", fontface="bold.italic", colour="red") 
p + geom_text(aes(label=weightLb), size=4, family="Times", colour="red") 

f:id:chito_ng:20190223161107p:plain

各項目の設定

詳細を設定したいelementに対して、element functionをtheme()に指定する。

library(gcookbook) # データセットの読み込み 
library(patchwork)

# 基本プロット 
p <- ggplot(heightweight, aes(x=ageYear, y=heightIn, colour=sex)) + geom_point()

# プロット領域の設定
g1 <- p + 
  theme( panel.grid.major = element_line(colour="red"), 
         panel.grid.minor = element_line(colour="red", linetype="dashed", size=0.2), 
         panel.background = element_rect(fill="lightblue"),
         panel.border = element_rect(colour="blue", fill=NA, size=2)) 

# テキスト項目の設定 
g2 <- p +
  ggtitle("Plot title here") + 
  theme( axis.title.x = element_text(colour="red", size=14),
         axis.text.x = element_text(colour="blue"), 
         axis.title.y = element_text(colour="red", size=14, angle = 90), 
         axis.text.y = element_text(colour="blue"), 
         plot.title = element_text(colour="red", size=20, face="bold")) 

elementをまとめると以下のようになる。

  • axis:軸
  • legend:凡例
  • panel:グリッド線やパネルの背景
  • stripe:facetで分割したラベル部

elementに指定できるものは以下となる

  • element_text:テキスト要素
  • element_rect:背景や境界(ざっくり書くと、長方形のものの領域)
  • element_line:線要素
  • element_brank:全てに適応可能で、非表示にできる
名前 説明 要素の型
text すべてのテキスト要素 element_text()
rect 全ての長方形要素 element_rect()
line すべての線要素 element_line()
axis.line 軸に沿った線 element_line()
axis.title 両軸ラベルの体裁 element_text()
axis.title.x x軸ラベルの体裁 element_text()
axis.title.y y軸ラベルの体裁 element_text()
axis.text 両軸目盛ラベルの体裁 element_text()
axis.text.x x軸目盛ラベルの体裁 element_text()
axis.text.y y軸目盛ラベルの体裁 element_text()
legend.background 凡例の背景 element_text()
legend.text 凡例項目の体裁 element_text()
legend.title 凡例タイトルの体裁 element_text()
legend.position 凡例の位置 left, right, bottom, top, c(x,y) :x,yは0~1
panel.background プロット領域の背景 element_rect()
panel.border プロット領域の枠線 element_rect(linetype="xxx")
panel.grid.major 主目盛線 element_line()
panel.grid.major.x 主目盛線の垂直方向 element_line()
panel.grid.major.y 主目盛線の水平方向 element_line()
panel.grid.minor 補助目盛線 element_line()
panel.grid.minor.x 補助目盛線の垂直方向 element_line()
panel.grid.minor.y 補助目盛線の水平方向 element_line()
plot.background プロット全体の背景 element_rect(fill="xxx", color="yyy")
plot.title タイトルの体裁 element_text()
strip.text 両方向ファセットラベルテキストの体裁 element_text()
strip.text.x 水平方向ファセットラベルテキストの体裁 element_text()
strip.text.y 垂直方向ファセットラベルテキストの体裁 element_text()
# 凡例の設定 
g3 <- p + 
  theme( legend.background = element_rect(fill="grey85", colour="red", size=1), 
         legend.title = element_text(colour="blue", face="bold", size=14), 
         legend.text = element_text(colour="red"),
         legend.key = element_rect(colour="blue", size=0.25)) 

# ファセットの設定
g4 <- p + 
  facet_grid(sex ~ .) + 
  theme( strip.background = element_rect(fill="pink"), 
         strip.text.y = element_text(size=14, angle=-90, face="bold")) 

(g1|g2) / (g3|g4)

f:id:chito_ng:20190223165915p:plain

組み込みテーマ

組み込みのテーマとしてtheme_grey, theme_bwがある。 組み込みテーマに上書きしてtheme設定をおこないたい場合は、組み込みテーマより後ろでthemeを設定する。

library(gcookbook) # データセットの読み込み
library(patchwork)

# 基本プロット
p <- ggplot(heightweight, aes(x=ageYear, y=heightIn)) +
  geom_point() 

g1 <- p + theme_grey() # グレイのテーマ (デフォルト)
g2<- p + theme_bw()  # ブラックとホワイトのテーマ 

g1 | g2

f:id:chito_ng:20190223165202p:plain

自作テーマ

テーマを自作することができる。事前に作成しておくと毎回入力する手間が端折れる。個人的にはグラフのタイプhistgram, plot, ...毎に作成しておくと楽。

library(gcookbook) # データセットの読み込み 

# theme_bw()を基にしていくつか変更する 
mytheme <- theme_bw() + 
  theme(text = element_text(colour="red"), axis.title = element_text(size = rel(1.25)))

# 基本プロット 
p <- ggplot(heightweight, aes(x=ageYear, y=heightIn)) + geom_point()

# 変更したテーマを使ってプロットする
p + mytheme

f:id:chito_ng:20190223180425p:plain