R(R言語)の一つのパッケージであるggplot2は美しい可視化を煩わしい操作なしに実現してくれます。R言語をお使いではあったけれどもggplot2や可視化はこれから初めてでどのようにスタートしたらよいかわからず、どういったコードを書けばいいのかわからないという方は多いでしょう。
そこでこの記事では、ggplot2の概要から基本的なグラフ描画、ラベル等のオプションまでコード付きでご紹介します。最後まで読んでいただければ、ggplot2を用いたグラフ描画の基礎をマスターできるはずです。
R言語の概要を知りたい方はこちらに詳細を書いています。
参考:『R言語とは?Rの利点/弱点、Pythonとの違い、特徴を一気に解説』
データ可視化そのものについて知りたい方は、こちらの記事からどうぞ。
目次
1.ggplot2の基本的な使い方
ggplot2はシンプルな操作で多種多様なデータの可視化ができるR言語のパッケージです。
ggplot2の特徴は、プログラミング的な構文でグラフ描画のオプションをそれぞれ設定できる点です。それゆえ、もし今あるグラフから別のグラフに変更したいときでも、変更を煩わすことはありません。ggplot2で誰でも美しい作図ができます。
以下、ggplot2の基本的な使い方を解説していきます。
1.1.インストールの仕方
ggplot2を使うにはggplot2のインストールが必要です。
ggplot2はRのパッケージ群であるtidyverseのうちの1つですので、まずtidyverseをインストールします。
インストールするには以下のコードを打ちます。
install.packages("tidyverse")
次に以下のコードでパッケージをダウンロードします。
library(tidyverse)
# ── Attaching packages ───────────────────────────────────── tidyverse 1.3.0 ──
# ✓ ggplot2 3.3.2 ✓ purrr 0.3.4
# ✓ tibble 3.0.4 ✓ dplyr 1.0.2
# ✓ tidyr 1.1.2 ✓ stringr 1.4.0
# ✓ readr 1.4.0 ✓ forcats 0.5.0
# ── Conflicts ──────────────────────────────────────── tidyverse_conflicts() ──
# x dplyr::filter() masks stats::filter()
# x dplyr::lag() masks stats::lag()
これでパッケージのインストールは完了です。
このインストールの操作は一度行えばそれ以降もパッケージは使用することができます。しかし、ライブラリのダウンロードは新しいプログラムを行うたびにする必要があるので注意してください。
関数を使うときにどのライブラリから使用したのかを明示したいときは package::function(…)のように書くことができます。例えばggplotならば、ggplot2::ggplot(…)とできます。
1.2.シンプルな操作で複雑なグラフの描画が可能
それではggplot2の使い方について簡単に説明します。
どのパッケージもデータセットを持っており、それらを使用してデータ分析の練習をすることができます。ggplot2にもデータセットがあるのでそれを使用します。
データ生成のためにはタイプミスに注意し、以下のコードを実行してください。
# データセットのリストを作成
l <- data()
results <- l$results %>%
as.data.frame()
list <- results$Item
# ループ処理でデータセットをデータフレーム型に変換
for (i in list) {
data <- try(get(i), silent = TRUE) %>% # Use try function to ignore errors
try(as.data.frame(), silent = TRUE)
if (is.data.frame(data)==TRUE) {
name <- paste0("data_", i)
assign(name, data)
} else {
}
}
ggplotを使うときには基本的に以下の3ステップでできます。
1.ggplot()の実行
ggplot()を実行すると何も書かれていないキャンバスが出力されます。ここでまず行うことは、x軸の値とy軸の値を設定することです。また、今回使用するデータはirisデータというアヤメのデータです。
ggplot(data = data_iris,
mapping = aes(x=Sepal.Length,
y=Petal.Length))
ggplot(…)の最初の引数の指定
ggplot(…)の最初の引数は必ず”data=…”です。ここで可視化するためのデータセットを指定します。例えば、ソースコードでしめした”data=data_iris”はRに「データは’data_iris’を使用する」と伝えています。
2番目の引数の指定
2番目の引数はx軸、y軸の変数です。ソースコードの”mapping=aes(x=Sepal.Length, y=Petal.Length)”の部分です。
2.geometric objectsの指定
次に、プロットさせるためにgeometric objectsを指定します。geometric objectsとは、描画するグラフのことです。
ここではgeom_point(散布図)を指定します。
コードの書き方は、ggplot()にgeom_point()を+で連結することで描画できます。
# 散布図
ggplot(data = data_iris,
mapping = aes(x=Sepal.Length,
y=Petal.Length)) +
geom_point()
▼散布図以外のgeometric objectsの例
- geom_point:散布図
- geom_line:折れ線グラフ
- geom_smooth:平滑化されたグラフ
- geom_bar:棒グラフ
- geom_histogram:ヒストグラム
- geom_polygon:ポリゴングラフ
- geom_map:地図グラフ
- geom_dotplot:ドットグラフ
2.ggplot2によるグラフ描画6選
2.1.散布図
まずは散布図にトライしてみましょう。
始めに前の章で書いたコードをもう一度実行します。
復習になりますが、散布図は、ggplot()にgeom_point()を+で連結することで描画できます。
ggplot(data = data_iris,
mapping = aes(x=Sepal.Length,
y=Petal.Length)) +
geom_point()
ggplot2は2つのグラフを同じキャンバスに描画することもできます。
例えば、geom_smoothを使用して、回帰直線を描いてみましょう。オプションを足すときは、geometric objectsを追加したときと同様、+で連結します。geom_smoothの中身のmethod = “lm”は”lm”がLinear Modelの意味で線形モデルを選択していることを示しています。
plot <- ggplot(data = data_iris,
mapping = aes(x=Sepal.Length,
y=Petal.Length)) +
geom_point() +
geom_smooth(method = "lm")
plot
うまくかけましたか?
ここまでシンプルなグラフを作ってきましたが、ここでさらに引数を足し、難易度が高めのグラフを描いてみましょう。
まず、geom_pointの引数にaes(colour=Species)を入れています。これにより、アヤメの種類ごとでプロットの色が変わっているのがわかります。また、geom_smoothにcolourを”pink”にして回帰直線の色を変えています。ソースコードは以下になります。
plot <- ggplot(data = data_iris,
mapping = aes(x=Sepal.Length,
y=Petal.Length)) +
geom_point(aes(colour=Species)) +
geom_smooth(method = "lm",
colour="pink")
plot
次に、それぞれの種類別に平滑化の直線を描いてみましょう。geom_smoothの中のcolourをaesで囲み、Speciesで指定しています。
plot <- ggplot(data = data_iris,
mapping = aes(x=Sepal.Length,
y=Petal.Length)) +
geom_point(aes(colour=Species)) +
geom_smooth(method = "lm",
aes(colour=Species))
plot
ここで紹介した以外にもオプションはたくさんあります。公式ドキュメントからすべてのオプションを確認できます。一旦ここでドキュメントを確認するのが良いですね。
2.2.ヒストグラム
ヒストグラムはgeom_histogram()を使用します。分布を確認するときにも便利です。
# ヒストグラム
ggplot(data = data_iris,
mapping = aes(x=Sepal.Length)) +
geom_histogram(colour="green",
fill = "pink")
# 棒グラフ
ggplot(data = data_iris,
mapping = aes(x=Sepal.Length)) +
geom_bar(colour="blue")
色の変更など共通しているものが多いので覚えやすいですね。
2.3.ドットプロット
ドットプロットはgeom_dotplot()です。dotsizeでドットの大きさを指定します。色はfillで指定しますので注意しましょう。また、ドットプロットとはカテゴリ値と連続値の関係を調べるときに使います。
# ドットプロット
ggplot(data = data_iris,
mapping = aes(x=Sepal.Length)) +
geom_dotplot(dotsize=0.6,
fill="red")
2.4.密度プロット
密度プロットはgeom_densityです。こちらも色の指定はfillで行っています。
密度プロットがよくつかわれる場面としては、確率密度関数を描くときでしょう。
# 密度プロット
ggplot(data = data_iris,
mapping = aes(x=Sepal.Width)) +
geom_density(fill = "gold")
2.5.ボックスプロット(箱ひげ図)
ボックスプロットはgeom_boxplot()です。
下の図では散布図も同時に表示させ、視覚的に非常にわかりやすくしています。オプションを使いこなすことできれいでおしゃれな図が描ける例です。
# ボックスプロット
ggplot(data = data_iris,
mapping = aes(x=Species,
y=Petal.Length,
fill=Species)) +
geom_boxplot()
# 発展
library(hrbrthemes)
library(viridis)
ggplot(data = data_iris,
mapping = aes(x=Species,
y=Petal.Length,
fill=Species)) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")
2.6.バイオリンプロット
バイオリンプロットはgeom_violin()になります。
バイオリンプロットはボックスプロットと同じ要領で使用します。ボックスプロットよりも視覚的情報が多いです。
# バイオリンプロット
ggplot(data = data_iris,
mapping = aes(x=Species,
y=Petal.Length,
fill=Species)) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6)
ggplot2ではこれら以外にもたくさんのグラフを描画することが可能です。以下のurlに詳細が書かれています。
https://www.r-graph-gallery.com/index.html
3.ggplot2の詳細なオプション
ggplot2ではタイトルや、軸の幅、バックカラー、汎用ラベルなど詳細に設定することができます。また、高画質で画像を保存することも可能です。これらの一連の作業をこの第3章で手を動かしながら学んでいきましょう。
3.1.タイトルと軸ラベル
それでは散布図を例にして行っていきます。
plot <- ggplot(data = data_iris,
mapping = aes(x=Sepal.Length,
y=Petal.Length,
colour=Species)
) +
geom_point() +
scale_colour_viridis(discrete = TRUE, alpha=0.6) +
geom_smooth(method = "lm")
plot
次にx軸とy軸を付け加えます。以下のコードを足すとx軸とy軸が描かれます。
plot <- plot +
theme(axis.line = element_line(colour = "black",
size = 0.7,
linetype = "solid"))
plot
タイトルとサブタイトルも付け加えましょう。
plot <- plot +
labs(title="Association between the length of petal and setal",
subtitle="From IRIS dataset") +
theme(plot.title = element_text(size = 12, #font size and adjust
hjust = 0.5,#adjust
face = "bold"),
plot.subtitle = element_text(size = 10, #font size and adjust
hjust = 0.5,#adjust
face = "bold"))
plot
この節の最後にグリッド線を追加し、x軸とy軸のラベルもわかりやすいように変更しましょう。
plot <- plot +
scale_x_continuous(name = "Lenght of Sepal (cm)", #add labels
breaks = seq(4,8,1), #break values
limits = c(4,8) #limit of axis
) +
scale_y_continuous(name = "Lenght of Petal (cm)",
breaks = seq(0, 8, 1),
labels = seq(0, 8, 1),
limits = c(0, 8)) +
theme(axis.title.x = element_text(size = 12, hjust = 0.5), #font size and adjust
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 12),
axis.title.y=element_text(size=12, vjust = 0.8)
)
plot
3.2.凡例のラベルとバックグラウンドの編集
以下のコードで凡例を付け加えます。
plot <- plot +
theme(legend.justification = c(1, 1),
legend.position= c(1, 0.5),
legend.title = element_text(size = 12, color = "black",
face = "bold"),
legend.text = element_text(size = 10, color = "black",
face = c("italic")
))
plot
背景の編集は以下のコードで行うことができます。今回は後ろのグリッド線を消し、背景を白っぽくしました。
plot <- plot +
theme(legend.background = element_blank(),
legend.key = element_blank(),
legend.box.background = element_rect(colour = "black"),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.background = element_blank()
)
plot
これで完成です。
順をたどってコードを書いていけばこのような美しいグラフも書けるようになりました。下にこれまでのコードをまとめておきます。
# First draw a basic plot with main arguments
plot <- ggplot(data = data_iris, #set the data
mapping = aes(x=Sepal.Length, #set x axis
y=Petal.Length, #set y axis
colour=Species) #set color by species
) +
geom_point() + #set a scatter plot
geom_smooth(method = "lm") #set a linear line
# Then make it nicer
plot <- plot +
theme(axis.line = element_line(colour = "black", #set color of axis line
size = 0.7, #size
linetype = "solid"), #and line type
legend.justification = c(1, 1), #set legend inside plot
legend.position= c(1, 0.5), #set position by x and y axis
legend.title = element_text(size = 12, color = "black",
face = "bold"),
legend.text = element_text(size = 10, color = "black",
face = c("italic")),
legend.background = element_blank(),
legend.key = element_blank(),
legend.box.background = element_rect(colour = "black"),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.background = element_blank()
) +
labs(title="Association between the length of petal and setal",
subtitle="From IRIS dataset") +
scale_x_continuous(name = "Lenght of Sepal (cm)",
breaks = seq(4,8,1),
limits = c(4,8)
) +
scale_y_continuous(name = "Lenght of Petal (cm)",
breaks = seq(0, 8, 1),
labels = seq(0, 8, 1),
limits = c(0, 8)) +
theme(axis.title.x = element_text(size = 12, hjust = 0.5),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 12),
axis.title.y=element_text(size=12, vjust = 0.8),
plot.title = element_text(size = 12, #font size and adjust
hjust = 0.5,#adjust
face = "bold"),
plot.subtitle = element_text(size = 10, #font size and adjust
hjust = 0.5,#adjust
face = "bold")
) +
scale_colour_viridis(discrete = TRUE, alpha=0.6)
plot
3.3.高画質で保存する
ここではwordやLaTex、パワーポイントなどの説明書に載せるために高画質でグラフを画像に変換させるテクニックを紹介します。
一般的に書籍などの出版物に載せられる画像は最低でも300bpiの画質で載せられています。そのような詳細な設定もggplot2でできます。以下のコードを実行すると美しいグラフがそのままの美しさを保ちながらきれいに画像に保存されます。
ggsave(filename = "figure.png",
plot = plot,
device = "png",
scale = 1,
width = 8.27, height = 8.27,
units = c("in"),
dpi = 900)
4.まとめ
これでggplot2を用いた入門編は終わりになります。
次回はさらに複雑なグラフを描画するのに挑戦しましょう!
皆さんも様々なデータを用いてggplot2でグラフを作成し可視化してみてください。コードは毎日書いていれば、今日長いと感じたコードもすらすらと書けるようになります。インプットのあとはアウトプットを忘れずに行うことが上達への近道です。
コメント