ggplot2パッケージは図を作成するのに非常に強力なパッケージです。備忘録を兼ねて使い方・コマンドを一覧でまとめました。
紹介で使用しているデータはパッケージに付属しているdiamondsをデータフレームに変換しています。
tidyverseのバージョンは1.3.1。windows 11のR version 4.1.2で動作を確認しています。
ggplot2の概要
ggplot2の特徴として、データを「読み込むコマンド」、データから「図をプロットするコマンド」、図を「装飾するコマンド」が明確に分かれているところが挙げられます。
慣れるまでは大変かもしれませんが、コマンドの修正箇所が明確ですので作業コストが低く、合理的なパッケージかと思います。具体的には「ggplot」コマンドでデータを読み込んでオブジェクトを作成後、プロット、装飾の流れとなります。
ggplot2のインストール
下記コマンドを実行してください。紹介ではggplot2パッケージを含むtidyverseパッケージを利用しています。
#install.packages("ggplot2") install.packages("tidyverse")
ggplot2ライブラリの読み込み
下記コマンドを実行してください。
#パッケージの読み込み #library("ggplot2") library("tidyverse")
データを「読み込むコマンド」
ggplot2でデータを読み込む方法は、読み込みから表現方法までまとめて指定する「qplot」とデータ読み込み専門の「ggplot」のコマンドがあります。
「qplot」は予備的に使用することがありますが、ggplot2の特徴である”データを「読み込むコマンド」、データから「図をプロットするコマンド」、図を「装飾するコマンド」”を最大限に利用するために「ggplot」コマンドの利用をお勧めします。
なお、データの読み込み時やプロットコマンド内でaesコマンドを使用して、x軸やy軸、グループ、シンボルの色などを指定しなくてはなりません。プロットする図に合わせたx軸やy軸の指定が必要です。
#データの読み込み Testdata <- diamonds
グラフ要素の指定「aesのオプション」一覧
aesコマンドのオプションの一覧です。オプションは複数設定が可能です。
表現内容 | オプション | 例 |
---|---|---|
軸データを指定 | x, y, z | aes(x = 1, y = 2) |
塗りつぶしの色 | fill | aes(fill = "red") |
線の色、囲み線の色 | colour | aes(colour = "red") |
色の透過度 | alpha | aes(alpha = 0.5) |
シンボルの形 | shape | aes(shape = 3) |
シンボルのサイズ | size | aes(size = 4) |
線の種類 | linetype | aes(linetype = 1) |
グループの指定 | group | aes(group = "読み込んだデータの列 or 行名") |
並び替え | order | aes(order = "読み込んだデータの列 or 行名") |
x or yの最小値 | xmin or ymin | aes(xmin = 1) |
x or yの最大値 | xmax or ymax | aes(xmax = 1) |
矢印の記入 | xend, yend, arrow | geom_segment(aes(x = 4, y = 25, xend = 3.5, yend = 20), arrow = arrow(length = unit(0.5, "cm"))) |
読み込んだデータのプロット例
読み込んだデータを散布図でプロットするためにgeom_pointコマンドからaesで要素を指定しています。詳細はコマンド内コメントを確認してください。
#aesで要素を指定してプロットできます。 PlotData <- ggplot(Testdata) PlotData + geom_point(aes(x = carat, y = price, color = color)) #図を装飾するために、引数にオブジェクトを格納した場合にはprintコマンドでプロットできます。 PointPlot <- PlotData + geom_point(aes(x = carat, y = price, color = color)) print(PointPlot)
プロットされる散布図です。
なお、ファイルに保存する場合にはggsaveコマンドを使用します。保存は作業フォルダ(ワーキングディレクトリ)に保存されます。
ggsave("Test.png", PointPlot)
グラフ作成の参考になるかもしれない記事の紹介
分割プロット「facetコマンド」
右からグラフを配置する方法。facet_grid(.~”分割したい行名または行番号”)
#facet_grid(.~"分割したい行名または行番号")で右から順に配置 PlotData + geom_point(aes(x = carat, y = price, color = color)) + facet_grid(.~color) + labs(x = "carat", y = "price", colour = "Colour")
上からグラフを配置する方法。facet_grid(“分割したい列名または列番号”~.)
#facet_grid("分割したい列名または列番号"~.)で上から順に配置 PlotData + geom_point(aes(x = carat, y = price, color = color)) + facet_grid(color~.) + labs(x = "carat", y = "price", colour = "Colour")
凡例と軸ラベルの調整
まずは、普通にプロットです。凡例と軸ラベルがデータの行名になっていません。
PlotData <- ggplot(Testdata, aes(x = Testdata[, 1], y = Testdata[, 7], color = Testdata[, 3], size = Testdata[, 1])) + geom_point() print(PlotData)
凡例と軸名の調整はlabsコマンドを使用します。labsコマンドではタイトルの設定もできます。
PlotData2 <- PlotData + labs(x = "Calat", y = "Price", title = "TEST PLOT", color = "Color", size = "SIZE") print(PlotData2)
プロットシンボルの調整
PlotData2を利用してプロットの透明度と色を変更します。透明度はaesコマンドでalphaオプションを追加しています。設定しないと、alphaの凡例が表示されますのでguideコマンドで表示しないようにしています。色はscale_colour_brewerコマンドを使用しています。連続量のデータの場合はscale_colour_continuousなどの利用が良いです。
PlotData3 <- PlotData2 + aes(alpha = 0.01) + guides(alpha = "none") + scale_colour_brewer(palette = "Set1") print(PlotData3)
ggplot2でよく使用される図のプロットコマンド
表現内容 | コマンド | 注意するオプション |
---|---|---|
切片と傾きを指定した直線 | geom_abline() | intercept = 0, slope = 1 |
積み上げ折れ線グラフ | geom_area() | |
棒グラフ | geom_bar() | stat = "bin or identity", position = "stack or dodge" |
タイル状に表現 | geom_bin2d() | |
箱ヒゲ図 | geom_boxplot() | outlier.colour = "black", outlier.shape = 16, outlier.size = 2, notch = FALSE, notchwidth = 0.5 *外れ値は箱の長さの1.5倍です。 |
ドットプロット | geom_dotplot() | binaxis = "x", method = "dotdensity", binpositions = "bygroup", stackdir = "up", stackratio = 1, dotsize = 1, stackgroups = FALSE |
エラーバー | geom_errorbar() | 水平方向のエラーバーにgeom_errorbarh()があります。 |
要素数を折れ線で表現 | geom_freqpoly() | |
ヒストグラム | geom_histogram() | |
水平方向の線 | geom_hline() | 切片はyinterceptで指定します。垂直方向はgeom_vline()です。切片はxinterceptで指定します。 |
ジッタープロット | geom_jitter(position = position_jitter()) | position_jitter()は横の振れ幅:width = 0.5と縦の振れ幅:height = 0.5があります。 |
折れ線グラフ | geom_line() | x軸は数字の小さい順からプロットされます。 |
要素の出現順に線で結ぶ | geom_path() | |
散布図 | geom_point() | |
指定した範囲を枠で囲む | geom_rect() | |
指定した範囲の線分を描写 | geom_segment() | |
文字列の描写 | geom_text() | |
バイオリンプロット | geom_violin() |
図全体の体裁を整えるコマンド
図の体裁はthemeコマンドを使用します。一番簡単な方法は、用意されているtheme_classic()やtheme_minimal()などを適応することです。
PlotData3 + theme_minimal()
themeコマンドのオプションを一覧
使い方はtheme(要素 = 対応エレメント(オプション))となります。
参考例: theme(axis.title = element_text(face = “bold.italic”, colour = “red”))
設定箇所 | 要素 | 対応エレメント | オプション |
---|---|---|---|
文字全体 | text | element_text() | family = NULL, face = "plain or italic or bold or bold.italic", colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL |
表、凡例タイトル全体 | title | element_text() | family = NULL, face = "plain or italic or bold or bold.italic", colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL |
軸ラベル | axis.title | element_text() | family = NULL, face = "plain or italic or bold or bold.italic", colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL |
X軸ラベル | axis.title.x | element_text() | family = NULL, face = "plain or italic or bold or bold.italic", colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL |
Y軸ラベル | axis.title.y | element_text() | family = NULL, face = "plain or italic or bold or bold.italic", colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL |
目盛りラベル | axis.text | element_text() | family = NULL, face = "plain or italic or bold or bold.italic", colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL |
X軸目盛りラベル | axis.text.x | element_text() | family = NULL, face = "plain or italic or bold or bold.italic", colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL |
Y軸目盛りラベル | axis.text.y | element_text() | family = NULL, face = "plain or italic or bold or bold.italic", colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL |
凡例要素ラベル | legend.text | element_text() | family = NULL, face = "plain or italic or bold or bold.italic", colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL |
凡例タイトル | legend.title | element_text() | family = NULL, face = "plain or italic or bold or bold.italic", colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL |
図タイトル | plot.title | element_text() | family = NULL, face = "plain or italic or bold or bold.italic", colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL |
facetコマンド使用時要素ラベル | strip.text | element_text() | family = NULL, face = "plain or italic or bold or bold.italic", colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL |
facetコマンド使用時X軸ラベル | strip.text.x | element_text() | family = NULL, face = "plain or italic or bold or bold.italic", colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL |
facetコマンド使用時Y軸ラベル | strip.text.y | element_text() | family = NULL, face = "plain or italic or bold or bold.italic", colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL |
線全体 | line | element_line() | colour = NULL, size = NULL, linetype = NULL, lineend = NULL |
目盛り線全体 | axis.ticks | element_line() | colour = NULL, size = NULL, linetype = NULL, lineend = NULL |
X軸目盛り | axis.ticks.x | element_line() | colour = NULL, size = NULL, linetype = NULL, lineend = NULL |
Y軸目盛り | axis.ticks.y | element_line() | colour = NULL, size = NULL, linetype = NULL, lineend = NULL |
軸線全体 | axis.line | element_line() | colour = NULL, size = NULL, linetype = NULL, lineend = NULL |
X軸線 | axis.line.x | element_line() | colour = NULL, size = NULL, linetype = NULL, lineend = NULL |
Y軸線 | axis.line.y | element_line() | colour = NULL, size = NULL, linetype = NULL, lineend = NULL |
内領域の線全体 | panel.grid | element_line() | colour = NULL, size = NULL, linetype = NULL, lineend = NULL |
内領域の主線 | panel.grid.major | element_line() | colour = NULL, size = NULL, linetype = NULL, lineend = NULL |
内領域の補助線 | panel.grid.minor | element_line() | colour = NULL, size = NULL, linetype = NULL, lineend = NULL |
内領域のX軸側の主線 | panel.grid.major.x | element_line() | colour = NULL, size = NULL, linetype = NULL, lineend = NULL |
内領域のY軸側の主線 | panel.grid.major.y | element_line() | colour = NULL, size = NULL, linetype = NULL, lineend = NULL |
内領域のX軸側の補助線 | panel.grid.minor.x | element_line() | colour = NULL, size = NULL, linetype = NULL, lineend = NULL |
内領域のY軸側の補助線 | panel.grid.minor.y | element_line() | colour = NULL, size = NULL, linetype = NULL, lineend = NULL |
プロット塗りつぶし全体 | rect | element_rect() | fill = NULL, colour = NULL, size = NULL, linetype = NULL, color = NULL |
凡例背景色 | legend.background | element_rect() | fill = NULL, colour = NULL, size = NULL, linetype = NULL, color = NULL |
凡例シンボル背景色 | legend.key | element_rect() | fill = NULL, colour = NULL, size = NULL, linetype = NULL, color = NULL |
内領域の境界線の色 | panel.border | element_rect() | fill = NULL, colour = NULL, size = NULL, linetype = NULL, color = NULL |
内領域の背景色 | plot.background | element_rect() | fill = NULL, colour = NULL, size = NULL, linetype = NULL, color = NULL |
facetコマンド使用時背景色 | strip.background | element_rect() | fill = NULL, colour = NULL, size = NULL, linetype = NULL, color = NULL |
軸目盛りの長さ | axis.ticks.length | unit | unit(数値, "cm")で設定するのが楽かと思います。 |
軸目盛りと軸ラベルの間隔 | axis.ticks.margin | unit | unit(数値, "cm")で設定するのが楽かと思います。 |
凡例の間隔 | legend.margin | unit | unit(数値, "cm")で設定するのが楽かと思います。 |
凡例要素の縦横間隔 | legend.key.size | unit | unit(数値, "cm")で設定するのが楽かと思います。 |
凡例要素の縦間隔 | legend.key.height | unit | unit(数値, "cm")で設定するのが楽かと思います。 |
凡例要素の横間隔 | legend.key.width | unit | unit(数値, "cm")で設定するのが楽かと思います。 |
内領域の間隔 | panel.margin | unit | unit(数値, "cm")で設定するのが楽かと思います。 |
プロット領域と内領域の間隔 | plot.margin | unit | unit(数値, "cm")で設定するのが楽かと思います。 |
凡例要素の揃え | legend.text.align | 0:左揃え, 1:右揃え | 0:左揃え, 1:右揃え |
凡例タイトルの揃え | legend.title.align | 0:左揃え, 1:右揃え | 0:左揃え, 1:右揃え |
凡例の位置 | legend.position | "left", "right", "bottom", "top", or c(X, Y) | "left", "right", "bottom", "top", or c(X, Y) |
凡例アイテムの位置 | legend.direction | "horizontal" or "vertical" | "horizontal" or "vertical" |
凡例の表示位置 | egend.justification | "center" or c(X, Y) | "center" or c(X, Y) |
複数凡例表示時の位置 | legend.box | "horizontal" or "vertical" | "horizontal" or "vertical" |
複数凡例表示時の並び方 | legend.box.just | "top", "bottom", "left", or "right" | "top", "bottom", "left", or "right" |
ggplot2に関する記事
少しでも、あなたの解析が楽になりますように!!