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
- Identifier les 3 composantes les plus présentes dans ses peintures.
- 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.
Pingback: ADV12 - Ce qu'il ne faut pas faire... | Johanie Fournier, agr.