ggplot2をインストールし美しいグラフを作るまでの基礎知識【入門編】

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でグラフを作成し可視化してみてください。コードは毎日書いていれば、今日長いと感じたコードもすらすらと書けるようになります。インプットのあとはアウトプットを忘れずに行うことが上達への近道です。

    無料EBook:データ視覚化/ダッシュボードデザインを成功させる95のチェックリスト

    組織に根付くダッシュボードの作り方やデータビジュアライゼーションの仕方を調べているけれど、よくわからないと悩んでいませんか?

    本書は当社やクライアント様がデータ分析/視覚化プロジェクトに取り組み、プロジェクト開始時から最後まで考えている一気通貫のチェックリストです。

    • 組織に根付かせるポイント
    • データ以外の要素と合わせて考える
    • 説得的なダッシュボード構築のテクニック

    など、データ分析/視覚化の効果と、具体的な思考の観点・内容を95ポイントに渡って解説しているものです。

    ぜひ、貴社のデータ活用にもご活用ください。

     

    このEBOOKのレビュー

     

    ・ご入力頂いたメールアドレス宛に新着記事の紹介やセミナー情報などご迷惑にならない程度(月1−2回程度)にお送りしております。
    ・今回ご請求頂いた資料のアップデートがあった場合などにお知らせいたします。
    ・当社からの連絡がご不要な場合は簡単に登録解除が可能です。
    ・Gmail、Yahooメール、各種プロバイダやブログサービスが提供するフリーメール、携帯電話のキャリアメールなどで登録いただいた場合、資料送付致しかねます。

    コメント

    お問い合わせ

    サービスに関するご質問や講演依頼など、お気軽にお問い合わせください。2営業日以内にお返事いたします。

    データをビジネスに活かす
    デジタル化/DX/データ活用の成功事例