Des lignes et des points

Le #Tidytuesday de cette semaine est pour les artistes dans l’âme! On visualise la composition des oeuvres de Bob Ross créées pendant The Joy of Painting. Au menu, sélection des éléments les plus important à présenter et visualisation de l’évolution avec des lignes et des points.



CONTEXTE

Les données de cette semaine sont disponible sur Github ou directement dans le package R de 538. L’Article de blog qui a inspiré le sujet peut être consulté ici.

Bob Ross est un artiste peintre principalement connu pour son émission télévisuelle The Joy of Painting initialement difusée entre 1983 et 1993. Chacun des épisodes étaient animés par Bob Ross lui-même. Dans ses épisodes, il peint des paysages souvent imaginaires utilisant la technique du premier coup, c’est-à-dire qu’il continue stde peindre avant que la couche déjà existante ne sèche.



OBJECTIFS

  1. Identifier les 3 composantes les plus présentes dans ses peintures.
  2. Visualiser l’évolution dans le temps (entre les saisons) de ces 3 composantes et les comparer aux reste des éléments présent dans la base de donnée avec des lignes et des points



IMPORTER

bob_ross <- readr::read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2019/2019-08-06/bob-ross.csv")
FALSE Parsed with column specification:  
FALSE cols(  
FALSE   .default = col_double(),  
FALSE   EPISODE = col_character(),  
FALSE   TITLE = col_character()  
FALSE )
FALSE See spec(...) for full column specifications.



EXPLORER

glimpse(bob_ross)
## Observations: 403  
## Variables: 69  
## $ EPISODE            <chr> "S01E01", "S01E02", "S01E03", "S01E04", "S01E…  
## $ TITLE              <chr> "\"A WALK IN THE WOODS\"", "\"MT. MCKINLEY\""…  
## $ APPLE_FRAME        <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ AURORA_BOREALIS    <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ BARN               <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ BEACH              <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, …  
## $ BOAT               <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ BRIDGE             <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ BUILDING           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ BUSHES             <dbl> 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, …  
## $ CABIN              <dbl> 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ CACTUS             <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ CIRCLE_FRAME       <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ CIRRUS             <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, …  
## $ CLIFF              <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ CLOUDS             <dbl> 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, …  
## $ CONIFER            <dbl> 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, …  
## $ CUMULUS            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, …  
## $ DECIDUOUS          <dbl> 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, …  
## $ DIANE_ANDRE        <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ DOCK               <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ DOUBLE_OVAL_FRAME  <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ FARM               <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ FENCE              <dbl> 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, …  
## $ FIRE               <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ FLORIDA_FRAME      <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ FLOWERS            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ FOG                <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ FRAMED             <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ GRASS              <dbl> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, …  
## $ GUEST              <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ HALF_CIRCLE_FRAME  <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ HALF_OVAL_FRAME    <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ HILLS              <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ LAKE               <dbl> 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, …  
## $ LAKES              <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ LIGHTHOUSE         <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ MILL               <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ MOON               <dbl> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ MOUNTAIN           <dbl> 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, …  
## $ MOUNTAINS          <dbl> 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, …  
## $ NIGHT              <dbl> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ OCEAN              <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, …  
## $ OVAL_FRAME         <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ PALM_TREES         <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ PATH               <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ PERSON             <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ PORTRAIT           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ RECTANGLE_3D_FRAME <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ RECTANGULAR_FRAME  <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ RIVER              <dbl> 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ ROCKS              <dbl> 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ SEASHELL_FRAME     <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ SNOW               <dbl> 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, …  
## $ SNOWY_MOUNTAIN     <dbl> 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, …  
## $ SPLIT_FRAME        <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ STEVE_ROSS         <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ STRUCTURE          <dbl> 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ SUN                <dbl> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, …  
## $ TOMB_FRAME         <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ TREE               <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, …  
## $ TREES              <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, …  
## $ TRIPLE_FRAME       <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ WATERFALL          <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ WAVES              <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ WINDMILL           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ WINDOW_FRAME       <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ WINTER             <dbl> 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, …  
## $ WOOD_FRAMED        <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …



Pour pouvoir regrouper les émissions par saisons, il va falloir travailler la colonne episode pour séparer la saison de l’épisode. De plus, toutes les variables qui concernent les éléments retrouvés dans les peintures sont identifiés comme des nombres binaires prenant la valeur 0 ou 1.



PRÉPARER:

data<-bob_ross %>%
     janitor::clean_names() %>%
     separate(episode, into = c("season", "episode"), sep = "E") %>%
     mutate(season = str_extract(season, "[:digit:]+")) %>%
     mutate_at(vars(season, episode), as.integer) %>%
       select(-episode, -title) %>%
    gather(-season, key = "element", value = "count") %>%
    mutate(element = case_when(.$element %in% c("lake", "lakes") ~ "lake",
                               TRUE ~ as.character(.$element))) %>%
     mutate(element = case_when(.$element %in% c("mountain", "mountains") ~ "mountain",
                               TRUE ~ as.character(.$element))) %>%
     mutate(element = case_when(.$element %in% c("tree", "trees", "conifer", "palm_trees", "deciduous") ~ "tree",                               
                               TRUE ~ as.character(.$element))) %>%
     mutate(element = case_when(.$element %in% c("person", "portrait") ~ "portrait",
                               TRUE ~ as.character(.$element))) %>%
     mutate(element = case_when(.$element %in% c("cloud", "cumulus") ~ "cloud",
                               TRUE ~ as.character(.$element))) %>%
     group_by(season, element) %>%
     summarise(count=sum(count))    

#Quels sont les 3 éléments les plus importants dans les peintures:  
sommaire<-data %>%
     group_by(element) %>%
     summarise(count=sum(count))    

#Arbres: 1146  
#montagnes:259  
#nuages: 179    

#modifier la base de données pour visualisation:  
freq<-data %>%
     mutate(element=ifelse(!element %in% c("tree", "mountain", "clouds"), "divers", element))
    
cat<-freq %>%
     inspect_cat()
FALSE `mutate_if()` ignored the following grouping variables:  FALSE Column `season`
cat$levels$element
FALSE # A tibble: 4 x 3  FALSE   value      prop   cnt  FALSE   <chr>     <dbl> <int>  FALSE 1 divers   0.95    1767  FALSE 2 clouds   0.0167    31  FALSE 3 mountain 0.0167    31  FALSE 4 tree     0.0167    31
data_cat<-freq %>%
     filter(element %in% c("tree", "mountain", "clouds"))
    
data_divers<-freq %>%
     filter(!element %in% c("tree", "mountain", "clouds"))



VISUALISER

#Graphique  
gg<-ggplot(data_cat, aes(x=season, y=count, group=element, color=element))  
gg <- gg + geom_point(data=data_divers,size=4, alpha=0.3, color="#AFB7BB")  
gg <- gg + geom_point(data=data_cat, size=4, alpha=0.7)  
gg <- gg + scale_color_manual(values=c("#266DD3", "#F6AE2D","#33673B"))  
gg <- gg + geom_smooth(data=data_cat,se=FALSE, size=2)  
#retirer la légende  
gg <- gg + theme(legend.position = "none")  
#ajuster les axes   
gg <- gg + scale_y_continuous(breaks=seq(00,50,10), limits = c(0, 50))  
gg <- gg + scale_x_continuous(breaks=seq(1,31,5), limits = c(1, 33.5))  
#modifier le thème  
gg <- gg +  theme(panel.border = element_blank(),                        
                  panel.background = element_blank(),
                  plot.background = element_blank(),                       
                  panel.grid.major.y= element_line(size=0.2,linetype="dotted", color="#6D7C83"),
                  panel.grid.major.x= element_blank(),
                  panel.grid.minor = element_blank(),
                  axis.line.x = element_line(color="#6D7C83"),
                  axis.line.y = element_line(color="#6D7C83"),
                  axis.ticks.y = element_blank(),                       
                  axis.ticks.x = element_blank())  
#ajouter les étiquettes de données  
gg<-gg + annotate(geom="text", x=31,y=40, label="Arbre", color="#33673B", size=4, hjust=0,vjust=0, fontface="bold")  
gg<-gg + annotate(geom="text", x=31,y=5, label="Nuage", color="#266DD3", size=4, hjust=0,vjust=0, fontface="bold")  
gg<-gg + annotate(geom="text", x=31,y=11,  label="Montagne", color="#F6AE2D", size=4, hjust=0,vjust=0, fontface="bold")  
#ajouter les titres  
gg<-gg + labs(title=" ",
                subtitle="",
                y="Nombre",
                x="Saison")  
gg<-gg + theme(plot.title    = element_blank(),
                   plot.subtitle = element_blank(),
                   axis.title.y  = element_text(hjust=1, vjust=0, size=12, color="#6D7C83", face="bold"),
                   axis.title.x  = element_text(hjust=0, vjust=0, size=12, color="#6D7C83", face="bold"),
                   axis.text.y   = element_text(hjust=0.5, vjust=0, size=12, color="#6D7C83", face="bold"),
                   axis.text.x   = element_text(hjust=0.5, vjust=0, size=12, color="#6D7C83", face="bold"))

Voici ce que ça donne:




CONCLUSION

Finalement, c’est assez clair que Bob Ross a un penchant pour peindre des arbres. C’est l’élément qui est de loin le plus présent dans ses peintures. Les deux autres éléments qui se démarquent du reste du lot sont les montagnes et les arbres.

Alors, tu veux en savoir plus sur ma démarche? Un épisode de podcast est disponible dans lequel je t’explique toute la réflexion et les concepts de data visualisation qui ont menés à la création de cette viz.

Publicités

Une réflexion sur “Des lignes et des points

  1. Pingback: ADV12 - Ce qu'il ne faut pas faire... | Johanie Fournier, agr.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.