Rで解析:手軽で綺麗なグラフが欲しいなら、ggplot2のまとめです。

Rの解析に役に立つ記事

ggplot2パッケージは図を作成するのに非常に強力なパッケージです。備忘録を兼ねて使い方・コマンドを一覧でまとめました。

diamondsデータ

紹介で使用しているデータはパッケージに付属している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, zaes(x = 1, y = 2)
塗りつぶしの色fillaes(fill = "red")
線の色、囲み線の色colouraes(colour = "red")
色の透過度alphaaes(alpha = 0.5)
シンボルの形shapeaes(shape = 3)
シンボルのサイズsizeaes(size = 4)
線の種類linetypeaes(linetype = 1)
グループの指定groupaes(group = "読み込んだデータの列 or 行名")
並び替えorderaes(order = "読み込んだデータの列 or 行名")
x or yの最小値xmin or yminaes(xmin = 1)
x or yの最大値xmax or ymaxaes(xmax = 1)
矢印の記入xend, yend, arrowgeom_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)
point

プロットされる散布図です。

なお、ファイルに保存する場合には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右

上からグラフを配置する方法。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上から順

凡例と軸ラベルの調整

まずは、普通にプロットです。凡例と軸ラベルがデータの行名になっていません。

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”))

設定箇所要素対応エレメントオプション
文字全体textelement_text()family = NULL, face = "plain or italic or bold or bold.italic", colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL
表、凡例タイトル全体titleelement_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.titleelement_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.xelement_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.yelement_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.textelement_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.xelement_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.yelement_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.textelement_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.titleelement_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.titleelement_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.textelement_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.xelement_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.yelement_text()family = NULL, face = "plain or italic or bold or bold.italic", colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL
線全体lineelement_line()colour = NULL, size = NULL, linetype = NULL, lineend = NULL
目盛り線全体axis.tickselement_line()colour = NULL, size = NULL, linetype = NULL, lineend = NULL
X軸目盛りaxis.ticks.xelement_line()colour = NULL, size = NULL, linetype = NULL, lineend = NULL
Y軸目盛りaxis.ticks.yelement_line()colour = NULL, size = NULL, linetype = NULL, lineend = NULL
軸線全体axis.lineelement_line()colour = NULL, size = NULL, linetype = NULL, lineend = NULL
X軸線axis.line.xelement_line()colour = NULL, size = NULL, linetype = NULL, lineend = NULL
Y軸線axis.line.yelement_line()colour = NULL, size = NULL, linetype = NULL, lineend = NULL
内領域の線全体panel.gridelement_line()colour = NULL, size = NULL, linetype = NULL, lineend = NULL
内領域の主線panel.grid.majorelement_line()colour = NULL, size = NULL, linetype = NULL, lineend = NULL
内領域の補助線panel.grid.minorelement_line()colour = NULL, size = NULL, linetype = NULL, lineend = NULL
内領域のX軸側の主線panel.grid.major.xelement_line()colour = NULL, size = NULL, linetype = NULL, lineend = NULL
内領域のY軸側の主線panel.grid.major.yelement_line()colour = NULL, size = NULL, linetype = NULL, lineend = NULL
内領域のX軸側の補助線panel.grid.minor.xelement_line()colour = NULL, size = NULL, linetype = NULL, lineend = NULL
内領域のY軸側の補助線panel.grid.minor.yelement_line()colour = NULL, size = NULL, linetype = NULL, lineend = NULL
プロット塗りつぶし全体rectelement_rect()fill = NULL, colour = NULL, size = NULL, linetype = NULL, color = NULL
凡例背景色legend.backgroundelement_rect()fill = NULL, colour = NULL, size = NULL, linetype = NULL, color = NULL
凡例シンボル背景色legend.keyelement_rect()fill = NULL, colour = NULL, size = NULL, linetype = NULL, color = NULL
内領域の境界線の色panel.borderelement_rect()fill = NULL, colour = NULL, size = NULL, linetype = NULL, color = NULL
内領域の背景色plot.backgroundelement_rect()fill = NULL, colour = NULL, size = NULL, linetype = NULL, color = NULL
facetコマンド使用時背景色strip.backgroundelement_rect()fill = NULL, colour = NULL, size = NULL, linetype = NULL, color = NULL
軸目盛りの長さaxis.ticks.lengthunitunit(数値, "cm")で設定するのが楽かと思います。
軸目盛りと軸ラベルの間隔axis.ticks.marginunitunit(数値, "cm")で設定するのが楽かと思います。
凡例の間隔legend.marginunitunit(数値, "cm")で設定するのが楽かと思います。
凡例要素の縦横間隔legend.key.sizeunitunit(数値, "cm")で設定するのが楽かと思います。
凡例要素の縦間隔legend.key.heightunitunit(数値, "cm")で設定するのが楽かと思います。
凡例要素の横間隔legend.key.widthunitunit(数値, "cm")で設定するのが楽かと思います。
内領域の間隔panel.marginunitunit(数値, "cm")で設定するのが楽かと思います。
プロット領域と内領域の間隔plot.marginunitunit(数値, "cm")で設定するのが楽かと思います。
凡例要素の揃えlegend.text.align0:左揃え, 1:右揃え0:左揃え, 1:右揃え
凡例タイトルの揃えlegend.title.align0:左揃え, 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に関する記事


少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました