मैं ggplot के साथ एक स्टैक्ड बार ग्राफ बनाना चाहता हूं जहां सलाखों की ऊंचाई एक चर (% में मतदाता मतदान) के मूल्यों पर निर्भर करती है और सलाखों के ढेर व्यक्तिगत रूप से दूसरे चर के 100% तक जोड़ते हैं (% में वोटशेयर) . तो वर्ष १९९० के लिए ९६.७ का मतदान हुआ था और बार को प्रत्येक पार्टी के व्यक्तिगत वोटशेयर से भरा जाना चाहिए, जो १००% (९६.७% में से) तक जोड़ते हैं। मैं 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)

यह एक गड़बड़ है।

एक टन अग्रिम धन्यवाद!

0
Ruebenkraut 25 अप्रैल 2018, 19:18

1 उत्तर

सबसे बढ़िया उत्तर

मैंने एक 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

1
qdread 25 अप्रैल 2018, 19:38