首先通过 count() 计算出各种 cut 的钻石各有多少个,存到名为 n 的列里,然后通过 mutate 计算出总和为1的占比。此时如果用 geom_col() 画图可以得出一个高度为1的堆积图。

library(tidyverse)

diamonds %>%
  count(cut) %>%
  mutate(p = n / sum(n)) %>%
  ggplot(aes("", p, fill = cut)) +
  geom_col() +
  scale_fill_brewer(type = "div")

p1.png

再加以 coord_polar() 变换转换为极座标,就可以画出一张饼图了。在此基础上多叠加一层 geom_text() 就实现了百分比的显示,非常灵活。

diamonds %>%
  count(cut) %>%
  mutate(p = n / sum(n)) %>%
  mutate(labels = scales::label_percent(accuracy = 0.01)(n / sum(n))) %>%
  ggplot(aes("", p, fill = cut)) +
  geom_col() +
  geom_text(aes(label = labels), position = position_stack(0.5)) +
  coord_polar("y") +
  scale_fill_brewer(type = "div")

p2.png

如果不想显示极座标轴和灰色背景,可以通过加上 theme_void() 来实现。对于重叠的文字则是可以用 ggrepel 打散,最终效果如图。

p3.png

标签: tidyverse, R

添加新评论