Saya mencoba menambahkan label persentase ke barplot yang ditumpuk dan faceted (posisi = 'mengisi'). Saya ingin persentase yang ditampilkan untuk ditambahkan untuk setiap bilah. Saya menggunakan kumpulan data seperti ini: ## Repreate Dataset ...

0
Kathrin Loosli 5 April 2021, 21:32

2 jawaban

Jawaban Terbaik

Cara termudah adalah mengubah data Anda sebelumnya sehingga fraksi dapat digunakan secara langsung.

library(tidyverse)
library(scales)

# Assume df is as in example code
df <- df %>% group_by(Village, livestock) %>%
  mutate(frac = Freq / sum(Freq))

ggplot(df, aes(livestock, frac, fill = dose)) +
  geom_col() +
  geom_text(
    aes(label = percent(frac)),
    position = position_fill(0.5)
  ) +
  facet_wrap(~ Village)

Jika Anda bersikeras tidak mengubah data, Anda dapat menulis sendiri fungsi pembantu kecil.

bygroup <- function(x, group, fun = sum, ...) {
  splitted <- split(x, group)
  funned   <- lapply(splitted, fun, ...)
  funned   <- mapply(function(x, y) {
    rep(x, length(y))
  }, x = funned, y = splitted)
  unsplit(funned, group)
}

Yang kemudian dapat Anda gunakan dengan mengatur grup ke x dan kolom (tidak berdokumen) PANEL.

library(ggplot2)
library(scales)

# Assume df is as in example code
ggplot(df, aes(livestock, Freq, fill = dose)) +
  geom_col(position = "fill") +
  geom_text(
    aes(
      label = percent(after_stat(y / bygroup(y, interaction(x, PANEL))))
    ),
    position = position_fill(0.5)
  ) +
  facet_wrap(~ Village)

0
teunbrand 5 April 2021, 18:54

Hanya untuk menambah solusi @teunbrand: Saya menghitung fraksi seperti yang disarankan @teunbrand dan itu bekerja dengan sempurna. Namun, saya mulai mendapatkan pesan peringatan yang sangat aneh dan gigih:

Warning messages:
1: Unknown or uninitialised column: `times`. 
2: Unknown or uninitialised column: `times`. 
3: Unknown or uninitialised column: `times`. 
4: Unknown or uninitialised column: `times`. 
5: Unknown or uninitialised column: `Var1`. 

Saya membaca masalah ini di sini yang tampaknya menjadi bug yang diketahui: gigih" kolom tidak diketahui atau tidak diinisialisasi "peringatan

Saya bisa menyingkirkan peringatan dengan tidak memungut dan mengonsentasikan tebangan ke dalam bingkai data.

df <- as.data.frame(df %>% group_by(Village, livestock) %>%
  mutate(frac = Freq / sum(Freq)) %>% ungroup())
0
Kathrin Loosli 5 April 2021, 20:15