ggplotの円グラフ(パイ・チャート)は棒グラフを変形

目次

ggplot を使って円グラフ(パイ・チャート)を作成するには、geom_pie()があるのかと思っていました。実は棒クラフを描いて、それを変形して作成します。


目的

ggplot()で、割合を円グラフで示したい。

方法

円グラフを描くには、geom_pie()のような関数を使うのかと思っていました。

しかしそのような関数はなく、geom_bar()で棒グラフを作成し、それを変形してパイ・チャートを作成します。

棒グラフを作成

まずは棒グラフをgeom_bar()を使用して作成します。

library(tidyverse)

df <- data.frame(Reason=c("A", "B", "C", "D", "E"),
                 Ratio=c(25, 10, 20, 40, 5))

df %>%
  mutate(Reason = factor(Reason, levels=rev(df$Reason))) %>%
  ggplot(aes(x="", y=Ratio, fill=Reason)) +
  geom_bar(stat="identity", width = 1, color="white") -> bar

plot(bar)

この時、Factor の因子の順番を調整して、時計回りに並ぶ順番を調整します。

円グラフにした時、因子の順番で半時計回りに並びます。 一般的には時計回りに並んでほしいので、順番をrev()で逆にします。棒グラフだと、上から因子の順番に並びます。

picture 2

円グラフに変形

この棒グラフにcoord_polar()関数を作用させるとパイ・チャートになります。ついでにtheme_void()で円グラフの周りに表示される軸(?)を消しておきます。

bar +
  coord_polar("y", start=0) +
  theme_void() -> pie

plot(pie)

picture 3

ただし、凡例の並び順は因子の並び順で表示されます。

そこでguide_legend()で凡例の並び順を調整します。

また、ggsciライブラリーを使用して、少し落ち着いた New England Journal of Medicine の配色にしてみました。

library("ggsci")

pie +
  guides(fill = guide_legend(reverse = TRUE)) +
  #scale_fill_brewer(palette="Set2")
  scale_fill_nejm()

picture 1