作図 作図入門

【R】円グラフの作り方|【図解】 ggplotを使った描き方

2021年5月16日

概要

  • 円グラフは ggplot() + geom_bar() + coord_polar()
  • x軸はブランクにしてy軸や塗りつぶす色を指定
  • coord_polar("y")にして棒グラフから円グラフに変換

イメージ

円グラフは ggplot() + geom_bar() + coord_polar() で作成できます。この作成方法は普通の作図法より少し複雑な方法となっており、coord_polar の特性を理解しておかなければなりません。ですがとりあえず円グラフの割合の値をy軸として棒グラフを一度作成して、その後 coord_polar() で棒グラフから円グラフに変形させるイメージです。

イメージは以下の図の通りです。

具体例

簡単な円グラフ

まずはあまり詳細な設定を行わないで簡単なコードで円グラフを作成する場合のコードを紹介します。基本はggplot()で割合にあたる列を指定し、geom_bar()で棒グラフを作成し、その棒グラフをcoord_polar()で円グラフに変形します。

library(ggplot2)
data4plot <- data.frame(category = LETTERS[1:4],
             rate      = c(0.5, 0.25, 0.15, 0.1))
ggplot(data4plot, aes(x = "", y = rate, fill = category)) + 
  geom_bar(stat = "identity") +
  coord_polar(theta = "y") 

見た目にこだわる

ちゃんときれいな見た目に整えるためにはもう少し詳細な設定をする必要があります。まずは余分なラベルや背景を除去しましょう。

シンプルなグラフを作るときはテーマを theme_void()に変更します

library(ggplot2)
data4plot <- data.frame(category = LETTERS[1:4],
             rate   = c(0.5, 0.25, 0.15, 0.1))
ggplot(data4plot, aes(x = "", y = rate, fill = category)) + 
  geom_bar(stat = "identity") +
  coord_polar(theta = "y") +
  theme_void()

さらに凝ったグラフを作るために、カテゴリ情報を円グラフの中に記載したい場合は geom_text() でテキストを加えます。何を書き加えるかは aes()の中の laebl で指定します。

円グラフの中に書き足す際のポイントとして、ラベルを追加する位置をあらかじめ計算していおくことが重要です。geom_text()で追加するラベルをどこに表示させるかをあらかじめ計算しておかないとうまくラベルを表示させることができません。

また塗りつぶしに関する凡例を消すために guides(fill = FALSE)を追加し、すっきりさせます。

library(ggplot2)
library(dplyr)
data4plot <- data.frame(category  =  LETTERS[1:4],
             rate       =  c(0.5, 0.25, 0.15, 0.1)) %>% 
  arrange(desc(category)) %>% 
  mutate(position = cumsum(rate) - rate/2) 
ggplot(data4plot, aes(x = "", y = rate, fill = category)) + 
  geom_bar(stat = "identity", color = "white") +
  coord_polar(theta = "y") +
  theme_void() + 
  geom_text(aes(y = position, label = category), size = 10, color = "white") + 
  guides(fill = FALSE)

さらに、実際の割合の数値をグラフに表示させたい場合は、geom_text()を重ねることでグラフの中に表示させることができます。

library(ggplot2)
library(dplyr)
data4plot = data.frame(category  =  LETTERS[1:4],
           rate     =  c(0.5, 0.25, 0.15, 0.1)) %>% 
  arrange(desc(category)) %>% 
  mutate(position = cumsum(rate) - rate/2) 
ggplot(data4plot, aes(x = "", y = rate, fill = category)) + 
  geom_bar(stat = "identity", color = "white") +
  coord_polar(theta = "y") +
  theme_void() + 
  geom_text(aes(y = position,  label = category), 
        size = 10,  color = "white",  vjust = -.5) + 
  geom_text(aes(y = position,  label = paste(rate * 100, "%")), 
        size = 6,  color = "white",  vjust = 1) + 
  guides(fill = FALSE)

coord_polar()とは

coord_polar()は値を角度に変換する関数です。イメージとしては以下の図の通りです。

棒グラフのy軸の値を円の角度に変換して円を作成しているイメージです。

-作図, 作図入門