R/mondrian_paris.R

#' mondrian_paris
#'
#' @param df dataframe
#' @import tidyverse
#' @return graph
#' @export
#'
#' @examples
#' df=data.frame(x=sample(6,3),y=sample(6,3))
#' mondrian_paris(df)
#'
mondrian_paris <- function(df) {
  #get n random lines between 4 to 10 to avoid sparsity or clutter on the canvas
  pal <- c("#255293","#db0a16","#f8c72d")
  #df_rect <- find_small_squares(df, nrow(df)-1)
  df_add = data.frame(z=runif(6,0,max(df$x))) %>%
    mutate(color = sample(3, nrow(.), replace=T))
  #find small squares
  find_small_squares <- function(df, n) {
    df_x <- df %>%
      arrange(x) %>%
      mutate(x_lead=lead(x,1), x_gap = x_lead-x) %>%
      arrange(x_gap) %>%
      filter(x_gap!=0) %>%
      head(n) %>%
      select(x, x_lead)

    df_y <- df %>%
      arrange(y) %>%
      mutate(y_lead=lead(y,1), y_gap = y_lead-y) %>%
      arrange(y_gap) %>%
      filter(y_gap!=0) %>%
      head(n) %>%
      select(y, y_lead)

    df_rect <- df_x %>%
      cbind(df_y) %>%
      mutate(color = sample(3, nrow(.), replace=T))

    #to ensure no NA datapoint in df_rect, need to make sure n<nrow(df)
    return(df_rect)
  }
  df_rect <- find_small_squares(df, nrow(df)-1)
  set.seed(1023)
  df %>%
    ggplot()+
    geom_vline(xintercept = df$x, size=5)+
    geom_hline(yintercept = df$y, size=5) +
    geom_segment(data=df_add, aes(y=df_add$z, yend=df_add$z,
                                  x=sample(df$x, nrow(df_add), replace=T),
                                  xend=sample(df$x, nrow(df_add), replace=T)),
                 size=5) +
    geom_rect(data = df_rect, aes(xmin=x +.05,
                                  xmax=x_lead -.05,
                                  ymin=y + .065,
                                  ymax=y_lead - .065,
                                  fill=as.factor(color))) +
    scale_fill_manual(values=pal)+
    theme_minimal() +
    theme(axis.title.y = element_blank(),axis.title.x = element_blank(),
          plot.title = element_text(face="bold", size=16),
          axis.text = element_blank(),
          plot.background = element_rect(fill = 'ghostwhite',color='white'),
          panel.grid = element_blank(),
          legend.position = 'None', legend.title = element_blank())
}
yanhann10/mondrianify documentation built on May 29, 2019, 12:18 p.m.