4.4 Pieplot

先ほどと同じ仮想的なアンケートデータを利用して円グラフ(Pieplot)の実装例を示す.

4.4.1 plot  

plot関数であれば以下のようにすれば良い.

# アンケートの結果をtable()で集計した結果のベクトル
smry
## x
##  Fukuoka Hokkaido    Osaka    Tokyo 
##        6       12        9        3
pie(smry)

4.4.2 ggplotを利用する場合

ggplotライブラリを利用する場合は,次のような実装になる. ggplotに渡すデータはdata.frame型である必要があるため,変換をしてから処理を行う.

df <- as.data.frame(smry) # データフレームに変換
df <- df %>% rename(label=x, count=Freq) # 列名を変更
print(df)
##      label count
## 1  Fukuoka     6
## 2 Hokkaido    12
## 3    Osaka     9
## 4    Tokyo     3

ggplotにおいては棒グラフと同じgeom_bar()coord_polar()に円グラフに変換している. 棒グラフと円グラフは表現の違いはあるが要素としては完全に同じということに注意されたい.

ggplot(df, aes(x = "", y = count, fill=label)) +
  geom_bar(stat="identity", width=1, color="white") + 
  coord_polar("y", start=0)

4.4.3 Doughnutplot

Dounghnutplot(ドーナッツプロット)は円グラフの中央が空いているグラフものである. Pieplotでは円の大きさによって割合の差が必要以上に大きく見えたりする場合があるが,ドーナツプロットでは 面積よりも割合の比率がより正確に感じ取れることが特徴である.

また,Rのデフォルトのplotではドーナッツプロットを作るのは簡単ではないのでここではggplotによる実装のみ紹介する.

df <- as.data.frame(smry) %>%  # smryをデータフレームに
  rename(label=x, count=Freq) %>% # 列名の変換
  mutate( # 新たな特徴量生成
    frac = count/sum(count), # 割合
    ymax = cumsum(frac), # 割合の累積
    ymin = c(0, head(ymax, -1)), # 割合の累積を一つずらしたもの
    labelPosition = (ymax + ymin) / 2, # ラベルの表示位置
    labelDisplay = paste0(label, "\n value: ", count) # ラベルの表示内容
  )
df
##      label count frac ymax ymin labelPosition         labelDisplay
## 1  Fukuoka     6  0.2  0.2  0.0          0.10   Fukuoka\n value: 6
## 2 Hokkaido    12  0.4  0.6  0.2          0.40 Hokkaido\n value: 12
## 3    Osaka     9  0.3  0.9  0.6          0.75     Osaka\n value: 9
## 4    Tokyo     3  0.1  1.0  0.9          0.95     Tokyo\n value: 3
ggplot(df, aes(ymax=ymax, ymin=ymin, xmax=4, xmin=3, fill=label)) +
  geom_rect() + 
  geom_text(x=2, aes(y=labelPosition, label=labelDisplay, color=label), size=4) +
  scale_fill_brewer(palette=3) +
  scale_color_brewer(palette=3) +
  coord_polar((theta="y")) + 
  xlim(c(-1, 4)) +
  theme_void() + 
  theme(legend.position = "none")

ドーナッツグラフについては,エクセルやスプレッドシートの方が手軽に作れるのでそちらも参考にして欲しい.