論文作成・統計

【R初心者必見】ggplotを使ってきれいな図で散布図と近似直線を書く

相関の図を書くときに何のソフトを使っているでしょうか?

ggplot2を使えば無料でより見栄えの良い図を書くことができます

それでは早速いってみましょう

データの準備

他の記事と同様に作業ディレクトリを設定して、ggplot2をいれます

なにかと便利なtidyverseを使っていきます

setwd("~/OneDrive/blog/Rpractice/")
library(tidyverse)
a <- iris
head(a)

>head(a)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
>

準備ができました

がく片の長さとがく片の幅には相関があるかどうかみてみましょう

ここではまず実際のデータの分布をみてみましょう

散布図(scatter plot)の書き方

まずは散布図を書いてみましょう

ggplot(a, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_point()

パッと見た感じ相関はありそうですが、島ができているのでこのまま単純に相関係数を出すことに意味はなさそうです

種類ごと色分けをする

一度種類によって色分けをするのがよさそうですね

ggplot(a, aes(x = Sepal.Length, y = Sepal.Width, 
              color = Species)) +
  geom_point()

他の人にみてもらうためのグラフは、
色盲の方でも判別できるものを心がけなくてはいけません

shapeも変えたり工夫することが大切です

種類ごとに形を変える

shapeで形を種類ごとに変えてみます

ggplot(a, aes(x = Sepal.Length, y = Sepal.Width, 
              shape = Species , color = Species)) +
  geom_point()

geoms_pointでsizeとalphaを指定して点の大きさと透明度を変更できます

ggplot(a, aes(x = Sepal.Length, y = Sepal.Width,
              shape = Species , color = Species)) +
  geom_point(size = 3, alpha = .5)

近似曲線や近似直線を加える

geom_smoothまたはstat_smoothで近似曲線を表示できます

seは信頼区間を表示するかどうかです(ここでは非表示にします)

またtheme_classicで背景を白くします

ggplot(a, aes(x = Sepal.Length, y = Sepal.Width,
              shape = Species , color = Species)) +
  geom_point(size = 5, alpha = .5)+
  geom_smooth(se = FALSE)+
  theme_classic()

線形近似でもよさそうですね

geom_smoothのmethodでlmを指定します

ggplot(a, aes(x = Sepal.Length, y = Sepal.Width, 
              shape = Species , color = Species)) +
  geom_point(size = 3, alpha = .5)+
  geom_smooth(method = lm, se = FALSE)+
  theme_classic()

一種類のみを表示してみましょう

tidyverseの中になるdplyrの機能の一つ、filterを使ってみます

b <- filter(a, Species == "setosa")
view(b)

Speciesの列がsetosaだけになっていましたでしょうか?

それでは表示をしてみましょう

ggplot(b, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_point(size = 3, alpha = .5)+
  geom_smooth(method = lm, se = FALSE)+
  theme_classic()

geom_jitterで点同士の重なりをずらすことができます

ggplot(b, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_smooth(method = lm, se = FALSE, colour = "red")+
  geom_jitter(colour="blue", size = 3, alpha = .5)+
  theme_classic()

どの程度ずらすか指定できます

ggplot(b, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_smooth(method = lm, se = FALSE, colour = "red")+
  geom_jitter(colour="blue", size = 3, alpha = .5, 
              width = 0.2, height = 0.2)+
  theme_classic()

geom_jitterでは正確な点の配置ではなくなります

特に論文などの場合には使う場面に注意をしてください

geom_pointに戻して、geom_smoothのseをTRUEにしてみます

ggplot(b, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_smooth(method = lm, se = TRUE, colour = "red")+
  geom_point(colour="blue", size = 3, alpha = .5)+
  theme_classic()

結構いいですよね

点を半透明にするメリットは重なりを濃淡で表示できることです

facet_gridを使って複数のグラフを表示

acet_gridやfacet_wrapは一度に複数のグラフを表示するのに便利です

ggplot(a, aes(x = Sepal.Length, y = Sepal.Width, 
              shape = Species , color = Species)) +
  geom_point(size = 3, alpha = .5)+
  geom_smooth(method = lm, se = FALSE)+
  facet_grid(. ~ Species)

ラベルの文字の大きさを調整します

ggplot(a, aes(x = Sepal.Length, y = Sepal.Width,
              shape = Species , color = Species)) +
  geom_point(size = 5, alpha = .5)+
  geom_smooth(method = lm, se = FALSE)+
  facet_grid(. ~ Species)+
  theme(strip.text.x = element_text(size=16, face="bold"),
        axis.text.x = element_text(size = 16),
        axis.text.y = element_text(size = 16),
        axis.title.x = element_text(size = 20),
        axis.title.y = element_text(size = 20),
        legend.title = element_text(size=16),
        legend.text = element_text(size=16))

scale_color_brewerで色を変えてみます

scale_color_manualなどで個別に指定などもできます

背景を今回はtheme_minimal()にもしてみます

ggplot(a, aes(x = Sepal.Length, y = Sepal.Width, 
              shape = Species , color = Species)) +
  geom_point(size = 3, alpha = .5)+
  geom_smooth(method = lm, se = FALSE)+
  scale_color_brewer(palette = "Set1")+
  facet_grid(. ~ Species)+
  theme_minimal()+
  theme(strip.text.x = element_text(size=16, face="bold"),
        axis.text.x = element_text(size = 16),
        axis.text.y = element_text(size = 16),
        axis.title.x = element_text(size = 20),
        axis.title.y = element_text(size = 20),
        legend.title = element_text(size=16),
        legend.text = element_text(size=16))

見やすくなりましたね

ggplot2に慣れてしまえば、いいグラフができます

しかも無料でできますので、覚えて損はないですよ