составной столбчатый график с агрегированными данными (ggplot2)

У меня серьезные проблемы с ggplot2. Несмотря на то, что это может быть очень простой вопрос для вас, я пока не смог понять его (я прочитал книгу ggplot2 и также искал stackoverflow).

Первоначально существовал набор данных, состоящий из факторной переменной (страны) и дихотомической переменной. К сожалению, у меня самого нет данных в этом расширенном формате: у меня есть две переменные «var1» и «var2». var1 дает количество случаев в исходном наборе данных, когда определенное условие истинно, а var2 дает количество случаев, когда то же условие ложно:

country | var1 | var2
----------------------
"A" | 20 | 30
"B" | 24 | 53
"C" | 21 | 24
"D" | 30 | 66

Теперь я хотел бы создать составную гистограмму с осью Y, показывающей проценты в каждой стране (все столбцы должны иметь одинаковую высоту) плюс абсолютные числа отображается в полосах:

Как это должно выглядеть

Я обнаружил, что если бы данные были в расширенном формате, я мог бы использовать

ggplot(data=dataset)+geom_bar(aes(x=country, fill=variable), position='fill')

Однако у меня есть только агрегированные данные.

Может ли кто-нибудь мне помочь?

Спасибо!


person D. Studer    schedule 14.03.2017    source источник
comment
отображение ваших данных с помощью dput() упрощает вам помощь.   -  person Roman    schedule 14.03.2017


Ответы (2)


Быстрое решение, сначала изменив форму, а затем построив график:

library(ggplot2)
library(tidyr)

temp2 <- gather(temp, var, val, -country)
ggplot(temp2, aes(country, val, fill = var)) + 
  geom_col(position = 'fill') +
  geom_text(aes(label = val), position = position_fill(vjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format())

введите здесь описание изображения

person Axeman    schedule 14.03.2017

library('ggplot2')
library('data.table')

df1 <- fread('country var1 var2
             "A" 20 30
             "B" 24 53
             "C" 21 24
             "D" 30 66')

df1 <- melt(df1, id.vars = 'country', )
df1[, percent := prop.table(value)*100, by = 'country']

ggplot(data = df1, aes( x = country, y = percent, fill = variable, label = value )) + 
  geom_bar(stat = 'identity') + 
  geom_text(size = 5, position = position_stack(vjust = 0.5))

введите здесь описание изображения

person Sathish    schedule 14.03.2017
comment
благодарю вас! с вашими исправлениями сейчас это именно то, что я хотел! - person D. Studer; 14.03.2017