7

ggplot2 のファセットと組み合わせてワッフル プロットを作成したり、ワッフル パッケージと組み合わせたりする簡単な方法はありますか?

たとえば、以下のすべてのバーを 100 の正方形に置き換えて、1 パーセントを表します。

ggplot(mtcars, aes(x = factor(vs), y = hp, fill = as.factor(carb))) +
  geom_bar(stat = 'identity', position = 'fill') +
  facet_wrap('gear')
4

3 に答える 3

1

これは、ワッフル プロットまたは四角い円グラフを作成するためにtidyverse(つまりdplyrtidyrおよび)のみを使用する別の方法です。これはhrbrmstr の回答に基づいていますが、もう少し一般的なものにしようとしました。任意の周波数テーブルが入力として機能し、ワッフルの寸法を簡単に調整できます (たとえば、正方形ではなく長方形)。ggplot2

library(tidyverse)
freq_table = mtcars %>%
  count(gear, vs, carb, wt = hp) %>% 
  group_by(gear, vs) %>% 
  mutate(pct = n / sum(n)) %>% 
  select(gear, vs, carb, pct)

2 番目のステップでは、座標を作成します。tidyr::expand()の代わりに使用しwaffleize()ます。まだ使用してsmart_round()います。

waffle.n = 100 # Number of blocks
waffle.cols = ceiling(sqrt(waffle.n)) # For square. Otherwise pick integer.
coordinates = freq_table %>% 
  group_by(gear, vs) %>%
  mutate(waffle.num = smart_round(pct,1) * waffle.n) %>%
  group_by(carb, gear, vs) %>%
  expand(count = seq(1:waffle.num)) %>% 
  select(-count) %>%
  group_by(gear, vs) %>%
  arrange(gear, vs) %>%
  mutate(
    waffle.x = rep_len(1:waffle.cols, waffle.n),
    waffle.y = floor((row_number() - 1) / waffle.cols)
  )

2 つの変数 (gearvs) でグループ化するため、 を使用しますfacet_grid()。単一の変数でグループ化する場合は、 を使用しますfacet_wrap()。最適な結果を得るには、オプションを少し調整する必要があります (デバイスのサイズ、ポイントのサイズとストロークなど)。

fig = coordinates %>%
  ggplot(aes(x = waffle.x, y = waffle.y, fill = as.factor(carb))) +
    geom_point(size = 7, shape = 22, color = "white", stroke = 0.8) +
    #geom_raster() + # Alternative to geom_point() without gap between blocks.
    facet_grid(rows = vars(gear), cols = vars(vs)) +
    theme_void() +
    theme(legend.position = "bottom", plot.margin = margin(5.5, 5.5, 5.5, 5.5, "pt"), panel.spacing = unit(15, "pt"))
fig
#ggsave("fig.pdf", width = 13, height = 17.5, units = "cm", dpi = 150)

ここに画像の説明を入力

ブロックの数が奇数で、シェアが 10 で割り切れない、より興味深い例。

于 2019-03-28T21:38:25.293 に答える