Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@patternproject
Created April 1, 2017 12:53
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save patternproject/f1037ff02385ca137a51b763d209e7f4 to your computer and use it in GitHub Desktop.
Save patternproject/f1037ff02385ca137a51b763d209e7f4 to your computer and use it in GitHub Desktop.
## ReadMe
# an attempt to recreate @VizWizBI Viz (http://www.vizwiz.com/2017/03/secret-of-success.html) using Waffle
## Libraries
if (!require("pacman")) install.packages("pacman")
pacman::p_load(tidyverse)
pacman::p_load(readxl)
pacman::p_load(waffle)
pacman::p_load(extrafont)
pacman::p_load(ggedit)
pacman::p_load(stringr)
## Setting up glyps to use circles instead of default squares
# src: https://www.r-bloggers.com/pre-cran-waffle-update-isotype-pictograms/
# To use the FontAwesome glyphs you need to:
# grab the ttf version from here
# install it on your system
# install the extrafont package
# run font_import() (get some coffee/scotch while you wait)
# load extrafont when you need to use these glyphs
# font_import()
# Addiontally:
# src: http://stackoverflow.com/questions/14733732/cant-change-fonts-in-ggplot-geom-text
# extrafont::loadfonts(device="win")
## Helper Functions
# lambda function for purr::map
fn.1 = function(df)
{
namedVec = df$value
names(namedVec) = df$key
return (namedVec)
}
## Input File
# read input
Secrets_of_Success <- read_excel("/1. Data/Secrets of Success.xlsx")
#View(Secrets_of_Success)
## Basic Validations
# master copy
df.1 = Secrets_of_Success
# fixing col names
names(df.1) <- tolower(names(df.1))
names(df.1)[1] = "social.strata"
# changing rating to factor
df.1$social.strata <- as.factor(df.1$social.strata)
df.1$reason <- as.factor(df.1$reason)
## Data Wrangling
# sorting by social.strate
df.1 %>%
arrange (social.strata, rate) %>%
mutate(rate.2 = 100 * rate,
filler = 100 - rate.2) -> df.2
View(df.2)
df.2 %>%
filter(str_detect(reason,"abili")) %>%
select(social.strata,rate.2,filler) %>%
gather(key,value,-social.strata) %>%
arrange (social.strata) -> df.3
df.3 %>%
split(.$social.strata) %>%
map(fn.1) -> df.4
## Plotting
waffle(
df.4$Poor,
size = 1,
colors = c("#E82C7D", "#E9E9EB"),
legend_pos = "none" ,
use_glyph = "circle"
) -> w.poor
w.poor
waffle(
df.4$`Middle class`,
size = 1,
colors = c("#6B9CCB", "#E9E9EB"),
legend_pos = "none",
use_glyph = "circle"
) -> w.middle
w.middle
waffle(
df.4$`Rich people`,
size = 1,
colors = c("#F47E13", "#E9E9EB"),
legend_pos = "none",
use_glyph = "circle"
) -> w.rich
w.rich
iron(w.poor,w.middle,w.rich)
Social Strata Reason Rate
Rich people good education, high qualification 28%
Middle class good education, high qualification 33%
Poor good education, high qualification 18%
Rich people cunning, cheating 11%
Middle class cunning, cheating 21%
Poor cunning, cheating 32%
Rich people abilities, talents 13%
Middle class abilities, talents 8%
Poor abilities, talents 7%
Rich people connections to the right people 9%
Middle class connections to the right people 32%
Poor connections to the right people 39%
Rich people fortune, good luck 13%
Middle class fortune, good luck 15%
Poor fortune, good luck 12%
Rich people hard work 38%
Middle class hard work 27%
Poor hard work 16%
Rich people entreprenurial spirit, courage 27%
Middle class entreprenurial spirit, courage 16%
Poor entreprenurial spirit, courage 16%
Rich people presence of initial capital 15%
Middle class presence of initial capital 23%
Poor presence of initial capital 27%
@patternproject
Copy link
Author

patternproject commented Apr 1, 2017

An attempt to recreate @VizWizBI Viz (http://www.vizwiz.com/2017/03/secret-of-success.html) using Waffle
waffle

@patternproject
Copy link
Author

patternproject commented Apr 1, 2017

all combined

Issues/Suggestions:

  1. The output waffle chart using circle instead of square works individually, but not when multiple charts are combined with "iron". The above output has been combined using inkscape. The iron output is as follows:
    iron

  2. How to combine them in a grid of "social class" on one and "reasons" on the other.

  3. Starting point of individual waffle chart is different. Original starts from top-left, waffle starts from bottom-left.

@hrbrmstr
Copy link

hrbrmstr commented Apr 1, 2017

There's an easier way to do it than using the waffle package:

library(stringi)
library(extrafont)
library(rprojroot)
library(hrbrthemes)
library(tidyverse)

build_waffle <- function(x) {
  expand.grid(x=1:10, y=1:10) %>% 
    mutate(fill = c(rep(as.character(x$social_strata), x$has), rep("empty", x$has_not))) %>% 
    as_tibble()
}

wrap_20 <- scales::wrap_format(20)

prefix <- rprojroot::find_root(has_file("Secrets of Success.csv"))

read_csv(file.path(prefix, "Secrets of Success.csv"), col_types = "ccc") %>%
  set_names(c("social_strata", "reason", "rate")) %>%
  mutate(social_strata = stri_trans_totitle(social_strata),
         reason = stri_trans_totitle(reason),
         reason = stri_replace_all_fixed(reason, ",", " &"),
         reason = wrap_20(reason)) %>% 
  mutate(social_strata = factor(social_strata, levels=c("Poor", "Middle Class", "Rich People"))) %>% 
  mutate(rate = as.numeric(stri_replace_last_fixed(rate, "%", ""))/100) %>% 
  mutate(has = as.integer(rate*100), has_not = 100-has) %>% 
  group_by(social_strata, reason) %>% 
  do(build_waffle(.)) -> success_df

ggplot(success_df, aes(x, y)) +
  geom_point(aes(color=fill), size=3) +
  facet_grid(social_strata~reason, switch = "y") +
  scale_y_reverse() +
  scale_color_manual(values=c("Poor"="#e53780", "Middle Class"="#4d8cd1",
                              "Rich People"="#f27f14", "empty"="#e8e9ec")) +
  labs(x=NULL, y=NULL) +
  theme_ipsum_rc(grid="") +
  theme(plot.margin=margin(30,30,30,30)) +
  theme(panel.spacing.x = unit(0.75, "lines")) +
  theme(panel.spacing.y = unit(0.75, "lines")) +
  theme(panel.grid=element_blank()) +
  theme(strip.text=element_text(size=10)) +
  theme(strip.text.x=element_text(hjust=0.5, vjust=0)) +
  theme(axis.text=element_blank()) +
  theme(legend.position="none") 

image

@ginolhac
Copy link

ginolhac commented Apr 3, 2017

Nice code @hrbrmstr, I just had to tweak your build_waffle() function as the argument was colliding the internal x

build_waffle <- function(df) {
  expand.grid(x = 1:10, y = 1:10) %>% 
    mutate(fill = c(rep(as.character(df$social_strata), df$has), rep("empty", df$has_not))) %>% 
    as_tibble()
}

thanks for sharing

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment