Ajoutez de la couleur à votre texte ggplot2 dans R

Le package ggplot2 est puissant et personnalisable à l'infini, mais parfois de petites modifications peuvent être un défi. Le package ggtext vise à simplifier le style du texte sur vos visualisations. Dans ce didacticiel, je vais parcourir une tâche de style de texte que j'ai vue en démonstration à la conférence RStudio le mois dernier: l'ajout de couleur.

Si vous souhaitez suivre, je vous suggère d'installer la version de développement de ggplot2 depuis GitHub. En général, certaines choses montrées à la conférence n'étaient pas encore sur CRAN. Et ggtext ne fonctionne certainement pas avec certaines anciennes versions de ggplot.

Vous devez installer ggtext depuis GitHub, car au moment où j'ai écrit ceci, le paquet n'était pas encore sur CRAN. J'utilise remotes::install_github()pour installer les packages R à partir de GitHub, bien que plusieurs autres options, telles que devtools::install_github(), fonctionnent également. Notez que dans le code ci-dessous, j'inclus l'argument build_vignettes = TRUEdonc j'ai des versions locales des vignettes de package. Après cela, je charge ggplot2, ggtext et dplyr.

remotes :: install_github ("tidyverse / ggplot2", build_vignettes = TRUE)

remotes :: install_github ("wilkelab / ggtext", build_vignettes = TRUE)

bibliothèque (ggplot2)

bibliothèque (ggtext)

bibliothèque (dplyr)

Pour les données de démonstration, j'utiliserai des données comparant des tweets sur R (avec le hashtag #rstats) avec des tweets sur Python (#python). Après avoir téléchargé des tweets récents, j'ai filtré, pris un échantillon aléatoire de 1000 de chacun, puis calculé combien de personnes dans chaque groupe avaient au moins cinq j'aime, avaient au moins cinq retweets, inclus une URL et inclus des médias comme une photo ou vidéo.

Vous pouvez recréer l'ensemble de données avec le bloc de code ci-dessous. Ou vous pouvez utiliser n'importe quel ensemble de données qui a du sens en tant que graphique à barres groupé et modifier mon code graphique suivant en conséquence.

Hashtag <- c ("# python", "#python", "#python", "#python", "#rstats", "#rstats", "#rstats", "#rstats")

Catégorie <- c ("FiveLikes", "FiveRTs", "HasURL", "HasMedia", "FiveLikes", "FiveRTs", "HasURL", "HasMedia")

NumTweets <- c (179, 74, 604, 288, 428, 173, 592, 293)

graph_data <- data.frame (Hashtag, Category, NumTweets, stringsAsFactors = FALSE)

Le graph_databloc de données est dans un format «long»: une colonne pour le hashtag (#rstats ou #python), une pour la catégorie que je mesure et une colonne pour les valeurs.

str(graph_data) 'data.frame': 8 obs. of 3 variables: $ Hashtag : chr "#python" "#python" "#python" "#python" ... $ Category : chr "FiveLikes" "FiveRTs" "HasURL" "HasMedia" ... $ NumTweets: num 179 74 604 288 428 173 592 293

C'est généralement la structure que vous souhaitez pour la plupart des graphiques ggplot. 

Ensuite, je vais créer un graphique à barres groupé et l'enregistrer dans la variable my_chart.

mon_graphe <- ggplot (données_graphique, aes (x = Catégorie, y = NumTweets, fill = Hashtag)) +

geom_col (position = "esquiver", alpha = 0,9) +

theme_minimal () +

xlab ("") +

ylab ("") +

thème (panel.grid.major = element_blank (), panel.grid.minor = element_blank (), panel.background = element_blank (), axis.line = element_line (color = "gray")) +

scale_fill_manual (valeurs = c ("# ff8c00", "# 346299"))

La alpha = 0.9ligne deux rend juste les barres un peu transparentes ( alpha = 1.0est complètement opaque). Les dernières lignes personnalisent l'apparence du graphique: en utilisant le thème minimal, en supprimant les étiquettes des axes x et y, en supprimant les lignes de grille par défaut et en définissant les couleurs des barres. Le graphique devrait ressembler à ceci si vous exécutez le code puis affichez my_chart:

Sharon Machlis,

Ensuite, j'ajouterai un titre avec ce code:

mon_tableau +

labs (title = "#python et #rstats: comparaison de 1 000 tweets aléatoires")

Sharon Machlis,

Ça a l'air. . . D'ACCORD. Mais lors d'une autre session de la conférence RStudio, The Glamour of Graphics, Will Chase nous a dit que les légendes sont loin d'être idéales (bien qu'il ait fait valoir ce point dans un langage légèrement plus coloré). Il a montré que l'ajout de couleurs directement dans le titre du graphique peut améliorer vos graphiques. Nous pouvons le faire assez facilement avec le paquet ggtext.

Connaître un peu de style HTML avec CSS en ligne vous aidera certainement à personnaliser votre texte. Dans le code ci-dessous, j'utilise des balises span pour sectionner les parties du texte que je souhaite affecter - #python et #rstats. Dans chaque ensemble de balises span, j'ai défini un style - spécifiquement la couleur du texte avec color:, puis la valeur hexadécimale de la couleur souhaitée. Vous pouvez également utiliser les noms de couleurs disponibles en plus des valeurs hexadécimales .

mon_tableau +

laboratoires (

title = "#python et

#rstats: comparaison de 1 000 tweets aléatoires "

) +

thème(

plot.title = element_markdown ()

)

Notez qu'il y a deux parties pour styliser le texte avec ggtext. En plus d'ajouter mon style au titre ou à tout autre texte, je dois ajouter element_markdown()à tout élément de tracé qui a les couleurs. Je l'ai fait dans le code ci-dessus dans une theme()fonction avec plot.title = element_markdown().

Si vous exécutez tout le code jusqu'à présent, le graphique devrait ressembler à ceci:

Sharon Machlis,

Je trouve cependant un peu difficile de voir les couleurs dans ce texte de titre. Ajoutons des balises pour mettre le texte en gras, et ajoutons également legend.position = nonepour supprimer la légende: 

mon_tableau +

laboratoires (

title = " #python et

#rstats : comparaison de 1 000 tweets aléatoires "

) +

thème(

plot.title = element_markdown (), legend.position = "aucun"

)

Sharon Machlis,

If I want to change the color of the x-axis text, I need to add data with that information to the data frame I’m visualizing. In the next code block, I create a column that adds bold italic red to the FiveLikes and FiveRTs category labels and styles the rest as bold italic without adding red. I also increased the size of the font just for FiveLikes and FiveRTs. (I wouldn’t do that on a real graph; I do it here only to make it easier to see the differences between the two.)

graph_data %

mutate(

category_with_color = ifelse(Category %in% c("FiveLikes", "FiveRTs"),

glue::glue("{Category}"),

glue::glue("{Category}"))

)

Next I need to re-create the chart to use the updated data frame. The new chart code is mostly the same as before but with two changes: My x axis is now the new category_with_color column. And, I added element_markdown() to axis.text.x inside the theme() function:

ggplot(graph_data, aes(x=category_with_color, y=NumTweets, fill= Hashtag)) +

geom_col(position="dodge", alpha = 0.9) +

theme_minimal() +

xlab("") +

ylab("") +

theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), axis.line = element_line(colour = "grey")) +

scale_fill_manual(values = c("#ff8c00", "#346299")) +

labs(

title = "#python and #rstats: Comparing 1,000 random tweets"

) +

theme(

plot.title = element_markdown(), legend.position = "none",

axis.text.x = element_markdown() # Added element_markdown() to axis.text.x in theme

)

The graph now looks like this, with the first two items on the x axis in red:

Sharon Machlis,

There is more you can do with ggtext, such as creating stylized text boxes and adding images to axes. But package author Claus Wilke warned us at the conference not to go too crazy. The ggtext package doesn’t support all of the formatting commands that are available for R Markdown documents. You can check out the latest at the ggtext website.

For more R tips, head to the Do More With R page at //bit.ly/domorewithR or the Do More With R playlist on the  TECHtalk YouTube channel.