гистограмма с накоплением столбцов с барами, относящимися к двум различным переменным с процентами - PullRequest
0 голосов
/ 25 апреля 2018

Я бы хотел создать гистограмму с накоплением с помощью ggplot, где высота столбцов зависит от значений одной переменной (явка избирателей в%), а стопки столбцов по отдельности составляют до 100% от другой переменной (voicehareв %).Таким образом, в 1990 году явка избирателей составила 96,7, и планка должна быть заполнена отдельными голосующими долями каждой партии, что составляет до 100% (из 96,7%).Я смотрю на данные 3 партий и 3 лет.

Вот мои данные:

party <- c("a", "b", "c", "a", "b", "c", "a", "b", "c") 
year <- c(1990, 1990, 1990, 1991, 1991, 1991, 1992,1992, 1992)
voteshare <- c(0,33.5, 66.5, 40.5, 39.0, 20.5, 33.6, 33.4, 33)
turnout = c(96.7,96.7,96.7, 85.05,85.05,85.05, 76.41, 76.41, 76.41)
df<- data.frame(parties, year, voteshare, turnout)

Кроме того, я хотел бы указать количество отдельных голосовавших и общую явкувнутри графика.

Мой подход пока:

ggplot(df, aes(x=year, y=interaction(turnout, voteshare), fill=party)) + 
    geom_bar(stat="identity", position=position_stack()) +
    geom_text(aes(label=Voteshare), vjust=0.5)

Это беспорядок.

Заранее огромное спасибо!

1 Ответ

0 голосов
/ 25 апреля 2018

Я использовал dplyr конвейер, чтобы:

  • создать столбец для скорректированного итога голосования, который является произведением доли каждой партии и общей явки.
  • избавиться отнулевые строки, поэтому в конечном выводе нули не отображаются
  • вычислите значение y, где должно отображаться общее количество голосов, взяв cumsum() доли голосов по партиям, сгруппированных по годам.Мне пришлось использовать rev(), потому что по умолчанию position_stack() ставит младшее число в алфавитном порядке наверху стека.

Код

library(dplyr)
library(ggplot2)

df <- df %>%
  mutate(adj_vote = turnout * voteshare / 100) %>%
  filter(adj_vote > 0) %>%
  group_by(year) %>% 
  mutate(cum_vote = cumsum(rev(adj_vote)),
         vote_label = rev(voteshare))


ggplot(df, aes(x=year, y=adj_vote, fill=party)) + 
  geom_bar(stat="identity", position=position_stack()) +
  geom_text(aes(label=vote_label, y = cum_vote), vjust=0.5)

Выход

ggplot2 output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...