Как добавить проценты каждой категории на столбчатую диаграмму с накоплением (ggplot2) (для диаграмм с накоплением «не в процентах»)

Не в самом коде T-SQL, но с SQL Server 2005 и выше они активировали возможность записи хранимых процедур CLR, которые по существу функционируют в .NET-коде, а затем раскрывают их как хранимые процедуры для потребления. Для этого у вас есть большая часть .NET framework, поэтому я вижу, что через это возможно потребление веб-сервиса.

Здесь немного подробно обсуждать здесь, но вот ссылка на статью MSDN по теме.

0
задан Cyrus Mohammadian 2 March 2019 в 06:41
поделиться

1 ответ

Рассмотрите возможность аннотирования с использованием расчета процента группировки. Так как вам нужно добавить три числа с последовательностью из шести, annotate могут отличаться от группирующих рядов. Кроме того, используйте соответствующий процент от пола и возраста. А ниже другой base::ave вызов заменяет ваш dplyr::group_by:

agg_df <- aggregate(list(value = 1:NROW(df)), df[c("age_group", "Gender")], length)

dat <- within(agg_df, {
  proportion <- ave(value, age_group, FUN = function(x) (x/sum(x)*100))
  proportionR <- round(proportion, digits=0)

  age_per <- round((ave(value, age_group, Gender, FUN=sum) / sum(value)) * 100)      
  grp_pct <- round((ave(value, age_group, FUN=sum) / sum(value)) * 100)
})

dat
#   age_group Gender value grp_pct age_per proportionR proportion
# 1     45-54      F     2      33      13          40   40.00000
# 2     35-44      F     1      20       7          33   33.33333
# 3     25-34      F     2      47      13          29   28.57143
# 4     45-54      M     3      33      20          60   60.00000
# 5     35-44      M     2      20      13          67   66.66667
# 6     25-34      M     5      47      33          71   71.42857



ggplot(dat, aes(x = age_group, y = value, fill = Gender)) +
  geom_col() + coord_flip() + ylab("Visits 2018-2019") +xlab("") +
  scale_fill_manual(values= c("#740404", "#AB6868", "#D5B3B3"), 
                    labels = c("Females", "Males", "N/A")) +
  theme(legend.title=element_blank()) +
  geom_text(aes(label = paste0(age_per, "%")), hjust = 2.7, 
            position = "stack", color = "white", size =5) + 
  annotate("text", x=1, y=5.25, label = paste0(dat$grp_pct[[1]], "%")) +
  annotate("text", x=2, y=3.25, label = paste0(dat$grp_pct[[2]], "%")) +
  annotate("text", x=3, y=7.25, label = paste0(dat$grp_pct[[3]], "%"))

Plot Output


Для динамического аннотирования вы можете использовать функциональную форму ggplot, используя Reduce, где + (на самом деле не арифметический оператор плюс) выставляется как оператор +.gg(). Затем вызовите mapply, чтобы выполнить итерацию по unique(grp_pct), чтобы передать координату x и указать метку. Остальной проблемой является то, что лучшая координата у неизвестна.

Reduce(ggplot2:::`+.gg`, 

       c(list(ggplot(dat, aes(x = age_group, y = value, fill = Gender)),
              geom_col(), coord_flip(), ylab("Visits 2018-2019"), xlab(""),
              scale_fill_manual(values= c("#740404", "#AB6868", "#D5B3B3"),
                              labels = c("Females", "Males", "N/A")),
              theme(legend.title=element_blank()),
              geom_text(aes(label = paste0(age_per, "%")), hjust = 2.7, 
                        position = "stack", color = "white", size =5) 
         ),
         Map(function(x_loc, g_lab) annotate("text", x=x_loc, y=7.25,
                                                label = paste0(g_lab, "%")),
             seq(length(unique(dat$grp_pct))), unique(dat$grp_pct)
         )
       )
)

Plot Output

0
ответ дан Parfait 2 March 2019 в 06:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: