第14章 ggplot2いろいろ

ggplot2は簡単にきれいなグラフを作ってくれます。 より、もう一手間加えることで、より見やすいグラフになるので、いろいろな設定の方法を紹介します。

library(tidyverse)
library(gghighlight)
library(ggrepel)
tri <- read_csv("data/triangle.csv")
## Parsed with column specification:
## cols(
##   statea = col_double(),
##   stateb = col_double(),
##   year = col_double(),
##   dependa = col_double(),
##   dependb = col_double(),
##   demauta = col_double(),
##   demautb = col_double(),
##   allies = col_double(),
##   dispute1 = col_double(),
##   logdstab = col_double(),
##   lcaprat2 = col_double(),
##   smigoabi = col_double(),
##   opena = col_double(),
##   openb = col_double(),
##   minrpwrs = col_double(),
##   noncontg = col_double(),
##   smldmat = col_double(),
##   smldep = col_double(),
##   dyadid = col_double()
## )

14.1 テーマ

ggplot2ではテーマを重ねることで見た目を変えることができます。

tri %>% 
  ggplot() + 
  geom_density(aes(x = smldep)) + 
  scale_x_log10() + 
  theme_bw()
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 7988 rows containing non-finite values (stat_density).

tri %>% 
  ggplot() + 
  geom_density(aes(x = smldep)) + 
  scale_x_log10() + 
  theme_classic()
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 7988 rows containing non-finite values (stat_density).

tri %>% 
  ggplot() + 
  geom_density(aes(x = smldep)) + 
  scale_x_log10() + 
  theme_dark()
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 7988 rows containing non-finite values (stat_density).

tri %>% 
  ggplot() + 
  geom_density(aes(x = smldep)) + 
  scale_x_log10() + 
  theme_bw()
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 7988 rows containing non-finite values (stat_density).

tri %>% 
  ggplot() + 
  geom_density(aes(x = smldep)) + 
  scale_x_log10() + 
  theme_light()
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 7988 rows containing non-finite values (stat_density).

tri %>% 
  ggplot() + 
  geom_density(aes(x = smldep)) + 
  scale_x_log10() + 
  theme_minimal()
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 7988 rows containing non-finite values (stat_density).

実際には、全てのグラフでテーマを統一したいので、最初にtheme_set()で決めます。

theme_set(theme_minimal())

14.2

ggplot2ではデフォルトでもきれいな色でグラフを書いてくれますが、違う色が良いなと思うときもあります。 もちろん、自分で指定することもできますが、とりあえず既存のカラーパレットを使う方法を紹介します。

使えるカラーパレットは次のように確認できます。

RColorBrewer::display.brewer.all()

実際は、ユニバーサルデザインのカラーパレットを使うのが良いでしょう。

RColorBrewer::display.brewer.all(colorblindFriendly = TRUE)

例えば、このように色指定を行います。

tri %>% 
  ggplot() + 
  geom_density(aes(x = smldep, fill = as.factor(dispute1)), alpha = 0.5) + 
  scale_x_log10() + 
  scale_fill_brewer(palette = "Set2")
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 7988 rows containing non-finite values (stat_density).

14.3 パネルの分割

ggplot2では簡単にパネルを分割し、グループごとにグラフを作ることができます。

facet_grid()はx軸と(あるいは)y軸を指定して、分割します。

tri %>% 
  ggplot() + 
  geom_density(aes(x = smldep)) + 
  scale_x_log10() + 
  facet_grid(dispute1 ~ noncontg)
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 7988 rows containing non-finite values (stat_density).

facet_wrap()は一つの変数の値に応じて分割します。

tri %>% 
  ggplot() + 
  geom_density(aes(x = smldep)) + 
  scale_x_log10() + 
  facet_wrap(~ smldmat)
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 7988 rows containing non-finite values (stat_density).

14.3.1 記述統計のグラフ

pivot_longer()を応用すると、記述統計をグラフで表示することもできます。

tri %>% 
  mutate(smldep = log(smldep + 10^-10)) %>% 
  select(smldep, smldmat, lcaprat2, logdstab) %>% 
  pivot_longer(everything(), names_to = "vars", values_to = "val") %>% 
  ggplot() + 
  geom_density(aes(x = val)) + 
  facet_wrap(~vars, scales = "free")

  • "scales = "free"とすることで、軸の範囲を各パネルで統一しないようにします。

14.4 ラベル

x軸やy軸、あるいは凡例には変数名がそのまま表示されるのでかっこ悪いです。 そこでlabs()でラベルを変えます。

tri %>% 
  ggplot() + 
  geom_density(aes(x = smldep, fill = as.factor(dispute1)), alpha = 0.5) + 
  scale_x_log10() + 
  scale_fill_brewer(palette = "Set2") + 
  labs(x = "Economic Interdependece", y = "Density", fill = "Militarized Dispute")
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 7988 rows containing non-finite values (stat_density).

  • Macintoshで日本語を表示させる際にはフォントを指定する必要があります。

14.5 凡例

凡例の位置をtheme()変えることもできます。

tri %>% 
  ggplot() + 
  geom_density(aes(x = smldep, fill = as.factor(dispute1)), alpha = 0.5) + 
  scale_x_log10() + 
  scale_fill_brewer(palette = "Set2") + 
  labs(x = "Economic Interdependece", y = "Density", fill = "Militarized Dispute") + 
  theme(legend.position = "bottom")
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 7988 rows containing non-finite values (stat_density).

tri %>% 
  ggplot() + 
  geom_density(aes(x = smldep, fill = as.factor(dispute1)), alpha = 0.5) + 
  scale_x_log10() + 
  scale_fill_brewer(palette = "Set2") + 
  labs(x = "Economic Interdependece", y = "Density", fill = "Militarized Dispute") + 
  theme(legend.position = c(0,1), legend.justification = c(0,1))
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 7988 rows containing non-finite values (stat_density).

14.6 強調

データポイントが膨大な場合、一部だけ強調したい場合があります。 そのようなときはgghighlightというパッケージを使います。

tri %>% 
  ggplot() + 
  geom_line(aes(x = year, y = lcaprat2, colour = as.factor(dyadid))) + 
  gghighlight(statea == 2, stateb == 710, label_key = dyadid)
## Warning: Tried to calculate with group_by(), but the calculation failed.
## Falling back to ungrouped filter operation...

14.7 テキスト

一部を強調せずにテキストでラベルをつける際にはggrepelというパッケージを使います。

tri %>% 
  mutate(dispute1 = if_else(dispute1 == 1, "Dispute", "Peace")) %>% 
  group_by(dispute1, year) %>% 
  summarise(smldep = median(smldep, na.rm = TRUE)) %>% 
  ggplot() + 
  geom_line(aes(x = year, y = smldep, colour = as.factor(dispute1))) + 
  geom_label_repel(aes(x = year, y = smldep, colour = as.factor(dispute1), label = dispute1),
                  data = . %>% 
                    filter(year == max(year))) + 
  scale_y_log10() + 
  theme(legend.position = "none")
## `summarise()` regrouping output by 'dispute1' (override with `.groups` argument)
## Warning: Transformation introduced infinite values in continuous y-axis

## Warning: Transformation introduced infinite values in continuous y-axis