2017-08-24 8 views
5

के साथ एक्सेल ग्राफिक्स मेरी कंपनी आर में रिपोर्ट करना चाहता है, वे जितना संभव हो उतना एक्सेल रिपोर्ट रखना चाहते हैं। एक्सेल में चीज 3-डी देखो रखने के लिए ggplot2 में कोई तरीका है? मैं एक साजिश है कि क्या नीचे है की तरह लग रहा बनाने की चाह रहा हूँ:ggplot2

enter image description here

मैं पास कर लिया है। यहां मेरे पास अब तक है:

gender <- c("Male", "Male", "Female", "Male", "Male", "Female", "Male", "Male", "Female", "Male", 
          "Male", "Female") 
race <- c("African American", "Caucasian", "Hispanic", "African American", "African American", 
         "Caucasian", "Hispanic", "Other", "African American", "Caucasian", "African American", 
         "Other") 

data <- as.data.frame(cbind(gender, race)) 


gender_data <- data %>% 
    count(gender = factor(gender)) %>% 
    ungroup() %>% 
    mutate(pct = prop.table(n)) 


race_data <- data %>% 
    count(race = factor(race)) %>% 
    ungroup() %>% 
    mutate(pct = prop.table(n)) 


names(race_data)[names(race_data) == 'race'] <- 'value' 
names(gender_data)[names(gender_data) == 'gender'] <- 'value' 



# Function for fixing x axis that creeps into other values 
addline_format <- function(x,...){ 
    gsub('\\s','\n',x) 
} 

ggplot() + 
      geom_bar(stat = 'identity', position = 'dodge', fill = "#5f1b46", 
        aes(x = gender_data$value, y = gender_data$pct)) + 
      geom_bar(stat = 'identity', position = 'dodge', fill = "#3b6b74", 
        aes(x = race_data$value, y = race_data$pct)) + 
      geom_text(aes(x = gender_data$value, y = gender_data$pct + .03, 
         label = paste0(round(gender_data$pct * 100, 0), '%')), 
        position = position_dodge(width = .9), size = 5) + 
      geom_text(aes(x = race_data$value, y = race_data$pct + .03, 
         label = paste0(round(race_data$pct * 100, 0), '%')), 
        position = position_dodge(width = .9), size = 5) + 
      scale_x_discrete(limits = c("Male", "Female", "African American", "Caucasian", "Hispanic", "Other"), 
          breaks = unique(c("Male", "Female", "African American", "Caucasian", "Hispanic", 
              "Other")), 
          labels = addline_format(c("Male", "Female", "African American", "Caucasian", 
                "Hispanic", "Other"))) + 
      labs(x = '', y = '') + 
      scale_y_continuous(labels = scales::percent, 
        breaks = seq(0, 1, .2)) + 
      expand_limits(y = c(0, 1)) + 
      theme(panel.grid.major.x = element_blank() , 
       panel.grid.major.y = element_line(size=.1, color="light gray"), 
       panel.background = element_rect(fill = '#f9f3e5'), 
       plot.background = element_rect(fill = '#f9f3e5')) 

आउटपुट नीचे है, इस बिंदु पर किसी भी मदद की सराहना की जाएगी।

enter image description here

+5

आपको जाली के साथ बेहतर भाग्य हो सकता है: https://stackoverflow.com/a/26822348/1412059 लेकिन कौन इस तरह की एक भयानक साजिश को फिर से बनाना चाहता है? यह एक टेस्ला चलाने की तरह है और इसके पीछे से नीला बादल आ रहा है। – Roland

+6

@ हैडली को यह न देखने दें, उसके पास एक एनीयरिसम हो सकता है। – tkmckenzie

+5

[_green_ धुएं के साथ मेरा टेस्ला] (https://stackoverflow.com/a/19943527/1851712)। अपनी आंखों को चोट पहुंचाने के लिए क्षमा करें @ रोलैंड, हैडली। अल। यह भी देखें [theme_excel] (https://cran.r-project.org/web/packages/ggthemes/vignettes/ggthemes.html) "_ उस क्लासिक बदसूरत रूप और feel_ के लिए"। – Henrik

उत्तर

4

मुझे लगता है कि हम सभी सहमत हैं कि Excel के छद्म 3 डी चार्ट चोक समस्याओं से भरे हुए हैं, लेकिन: मैं भी लिंग और जाति के खेतों के बीच एक रिक्ति डाल करने के लिए, अगर कोई उस के साथ के रूप में अच्छी तरह से मदद कर सकते हैं की जरूरत है मैं परिस्थितियों से सहानुभूति रखता हूं जहां पेचेक पर हस्ताक्षर करने वालों के साथ समझौता करना पड़ता है।

इसके अलावा, मुझे बेहतर शौक चाहिए।

very ugly plot

चरण 1. लोड हो रहा है & डेटा देगी (यानी सामान्य सामान):

library(dplyr); library(tidyr) 

# original data as provided by OP 
gender <- c("Male", "Male", "Female", "Male", "Male", "Female", "Male", "Male", "Female", "Male", 
      "Male", "Female") 
race <- c("African American", "Caucasian", "Hispanic", "African American", "African American", 
      "Caucasian", "Hispanic", "Other", "African American", "Caucasian", "African American", 
      "Other") 
data <- as.data.frame(cbind(gender, race)) 

# data wrangling 
data.gather <- data %>% gather() %>% 
    group_by(key, value) %>% summarise(count = n()) %>% 
    mutate(prop = count/sum(count)) %>% ungroup() %>% 
    mutate(value = factor(value, levels = c("Male", "Female", "African American", 
              "Caucasian", "Hispanic", "Other")), 
     value.int = as.integer(value)) 

rm(data, gender, race) 

चरण 2. बहुभुज परिभाषित 3 डी प्रभाव सलाखों के लिए निर्देशांक (यानी cringy सामान):

# top 
data.polygon.top <- data.gather %>% 
    select(key, value.int, prop) %>% 
    mutate(x1 = value.int - 0.25, y1 = prop, 
     x2 = value.int - 0.15, y2 = prop + 0.02, 
     x3 = value.int + 0.35, y3 = prop + 0.02, 
     x4 = value.int + 0.25, y4 = prop) %>% 
    select(-prop) %>% 
    gather(k, v, -value.int, -key) %>% 
    mutate(dir = str_extract(k, "x|y")) %>% 
    mutate(k = as.integer(gsub("x|y", "", k))) %>% 
    spread(dir, v) %>% 
    rename(id = value.int, order = k) %>% 
    mutate(group = paste0(id, ".", "top")) 

# right side 
data.polygon.side <- data.gather %>% 
    select(key, value.int, prop) %>% 
    mutate(x1 = value.int + 0.25, y1 = 0, 
     x2 = value.int + 0.25, y2 = prop, 
     x3 = value.int + 0.35, y3 = prop + 0.02, 
     x4 = value.int + 0.35, y4 = 0.02) %>% 
    select(-prop) %>% 
    gather(k, v, -value.int, -key) %>% 
    mutate(dir = str_extract(k, "x|y")) %>% 
    mutate(k = as.integer(gsub("x|y", "", k))) %>% 
    spread(dir, v) %>% 
    rename(id = value.int, order = k) %>% 
    mutate(group = paste0(id, ".", "bottom")) 

data.polygon <- rbind(data.polygon.top, data.polygon.side) 
rm(data.polygon.top, data.polygon.side) 

चरण 3. यह एक साथ लाना:

ggplot(data.gather, 
     aes(x = value.int, group = value.int, y = prop, fill = key)) + 

    # "floor" of 3D panel 
    geom_rect(xmin = -5, xmax = 10, ymin = 0, ymax = 0.02, 
      fill = "grey", color = "black") + 

    # background of 3D panel (offset by 2% vertically) 
    geom_hline(yintercept = seq(0, 1, by = 0.2) + 0.02, color = "grey") + 

    # 3D effect on geom bars 
    geom_polygon(data = data.polygon, 
       aes(x = x, y = y, group = group, fill = key), 
       color = "black") + 

    geom_col(width = 0.5, color = "black") + 
    geom_text(aes(label = scales::percent(prop)), 
      vjust = -1.5) + 
    scale_x_continuous(breaks = seq(length(levels(data.gather$value))), 
        labels = levels(data.gather$value), 
        name = "", expand = c(0.2, 0)) + 
    scale_y_continuous(breaks = seq(0, 1, by = 0.2), 
        labels = scales::percent, name = "", 
        expand = c(0, 0)) + 
    scale_fill_manual(values = c(gender = "#5f1b46", 
           race = "#3b6b74"), 
        guide = F) + 
    facet_grid(~key, scales = "free_x", space = "free_x") + 
    theme(panel.spacing = unit(0, "npc"), #remove spacing between facets 
     strip.text = element_blank(), #remove facet header 
     axis.line = element_line(colour = "black", linetype = 1), 
     panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank(), 
     panel.background = element_rect(fill = '#f9f3e5'), 
     plot.background = element_rect(fill = '#f9f3e5')) 

नोट: यदि आप theme() में geom_rect()/geom_hline()/geom_polygon() geoms & रोक पहलू रिक्ति/हैडर छुपा बाहर टिप्पणी, इस लगभग आकर्षक होगा ...

+0

@ इवानवाबे: क्या ज़ेड लिन का जवाब आपके प्रश्न को हल करता है? कृपया पोस्टर के प्रयासों को स्वीकार करने के लिए उत्तर (उत्तर के बाईं ओर टॉगल चेक मार्क) स्वीकार करने पर विचार करें। – CPak

+0

मुझे त्रुटि मिली: इकट्ठा करने में त्रुटि (।): फ़ंक्शन "नहीं मिला" पैकेज टैब में dplyr का मेरा संस्करण 0.7.2 है। सुनिश्चित नहीं है कि यह मुद्दा है या नहीं। मेरे प्रश्न का उत्तर देने के लिए धन्यवाद। मैं आपके समाधान के साथ-साथ मैं भी कर सकता हूं। –

+0

@IwannabeTheguy: क्षमा करें, 'इकट्ठा()' tidyr पैकेज से है, हैली के [tidyverse] (https://www.tidyverse.org/) का हिस्सा dplyr के साथ। मेरा कोड अपडेट करेगा। –

 संबंधित मुद्दे