Добавление процентных меток на график с осью Y в R - PullRequest
0 голосов
/ 07 февраля 2020

Я хотел бы добавить процентные метки на каждую шестерню к столбцам, но сохранить шкалу y. Например, 10% всех «передач 3» составляют «4 цил»

library(ggplot)

ds <- mtcars
ds$gear <- as.factor(ds$gear)

p1 <- ggplot(ds, aes(gear, fill=gear)) +
  geom_bar() +
  facet_grid(cols = vars(cyl), margins=T) 

p1

enter image description here

В идеале только в ggplot, без добавления dplyr или tidy. Я нашел некоторые из этих решений, но затем у меня возникли другие проблемы с моими исходными данными.

РЕДАКТИРОВАТЬ: Предположения, что это дубликат с: введите описание ссылки здесь

Я видел это также раньше, но не смог интегрировать этот код в то, что я хочу:

# i just copy paste some of the code bits and try to reconstruct what I had earlier
ggplot(ds, aes(gear, fill=gear)) +
  facet_grid(cols = vars(cyl), margins=T) +       
  # ..prop.. meaning %, but i want to keep the y-axis as count
  geom_bar(aes(y = ..prop.., fill = factor(..x..)), stat="count") +  
  # not sure why, but I only get 100% 
  geom_text(aes( label = scales::percent(..prop..),
             y= ..prop.. ), stat= "count", vjust = -.5)

enter image description here

1 Ответ

0 голосов
/ 07 февраля 2020

Проблема в том, что ggplot не знает, что каждый аспект - это одна группа. Этот очень полезный урок помогает найти отличное решение. Просто добавьте aes(group = 1)

PS. Вначале я часто очень неохотно и боялся манипулировать своими данными и предварительно рассчитывать фреймы данных для построения графиков. Но нет необходимости беспокоиться! На самом деле зачастую гораздо проще (и безопаснее!) Сначала сформировать / объединить ваши данные в нужную форму, а затем построить / проанализировать новые данные.

library(tidyverse)
library(scales)

ds <- mtcars
ds$gear <- as.factor(ds$gear)

Первое решение:

ggplot(ds, aes(gear, fill = gear)) +
  geom_bar() +
  facet_grid(cols = vars(cyl), margins = T) +
  geom_text(aes(label = scales::percent(..prop..), group = 1), stat= "count")

изменить , чтобы ответить на комментарий

Отображение процентов по фасетам довольно запутанно для читателя рисунка, и я, вероятно, рекомендовал бы против такой визуализации , Вы не будете обходить манипулирование данными здесь. Задача состоит в том, чтобы включить ваш «грани граней». Я создаю два фрейма сводных данных и связываю их вместе.


ds_count <- 
  ds %>% 
  count(cyl, gear) %>% 
  group_by(gear) %>% 
  mutate(perc = n/sum(n)) %>% 
  ungroup %>% 
  mutate(cyl = as.character(cyl))

ds_all <- 
  ds %>% 
  count(cyl, gear) %>% 
  group_by(gear) %>% 
  summarise(n = sum(n)) %>% 
  mutate(cyl = 'all', perc = 1)

ds_new <- bind_rows(ds_count, ds_all)

ggplot(ds_new, aes(gear, fill = gear)) +
    geom_col(aes(gear, n, fill = gear)) +
    facet_grid(cols = vars(cyl)) +
    geom_text(aes(label = scales::percent(perc)), stat= "count")

IMO, лучшим способом было бы просто поменять местами переменные x и facetting. Затем вы можете использовать функцию суммирования ggplots, как указано выше.

ggplot(ds, aes(as.character(cyl), fill = gear)) +
  geom_bar() +
  facet_grid(cols = vars(gear), margins = T) +
  geom_text(aes(label = scales::percent(..prop..), group = 1), stat= "count")

Создано в 2020-02-07 пакетом prex (v0 .3.0)

...