library(tidytext)
library(dplyr)
library(ggwordcloud)
library(ggplot2)
speech <- "Four score and seven years ago our fathers brought forth on this
continent, a new nation, conceived in Liberty, and dedicated to the proposition
that all men are created equal. Now we are engaged in a great civil war, testing
whether that nation, or any nation so conceived and so dedicated, can long endure.
We are met on a great battle-field of that war. We have come to dedicate a portion
of that field, as a final resting place for those who here gave their lives that
that nation might live. But, in a larger sense, we can not dedicate, we can not
consecrate, we can not hallow this ground. The brave men, living and dead, who
struggled here, have consecrated it, far above our poor power to add or detract.
The world will little note, nor long remember what we say here, but it can never
forget what they did here. It is for us the living, rather, to be dedicated here
to the unfinished work which they who fought here have thus far so nobly advanced.
It is rather for us to be here dedicated to the great task remaining before us,
that from these honored dead we take increased devotion to that cause for which
they gave the last full measure of devotion, that we here highly resolve that
these dead shall not have died in vain, that this nation, under God, shall have a
new birth of freedom, and that government of the people, by the people, for the
people, shall not perish from the earth."
text_df <- data.frame(text = speech, stringsAsFactors = FALSE)Nuage de mots en R : guide moderne avec tidytext et ggwordcloud
Transformez du texte en nuage de mots avec un workflow tidy, natif ggplot2
Construisez un nuage de mots en R à la façon moderne — segmentez le texte avec tidytext, comptez les fréquences des mots, supprimez les mots vides et affichez un nuage natif ggplot2 avec ggwordcloud. Un remplacement propre de l’ancienne recette tm + wordcloud.
- Le pipeline moderne de nuage de mots en R : segmenter → supprimer les mots vides → compter → afficher — tout en tidy, tout natif ggplot2.
- Comment transformer n’importe quel texte en table de fréquences des mots avec
tidytext(unnest_tokens,stop_words,count). - Comment dessiner le nuage avec
ggwordcloud(geom_text_wordcloud_area) — dimensionné selon la fréquence, coloré sur une échelle viridis, et habillable comme n’importe quel ggplot. - Pourquoi cela remplace l’ancienne recette
tm+wordcloud()— sansCorpus, sanstm_map, sansTermDocumentMatrix.
Un nuage de mots transforme un bloc de texte en image : plus un mot apparaît souvent, plus il s’affiche en grand. C’est un moyen rapide et visuellement parlant de faire ressortir les thèmes dominants dans des réponses à une enquête, des avis, des discours ou tout texte libre.
La recette R classique pour cela utilisait les packages tm (text mining) et wordcloud — construire un Corpus, enchaîner des transformations tm_map() et en extraire une TermDocumentMatrix. Cela fonctionne encore, mais c’est verbeux et à l’écart de la chaîne d’outils tidy moderne. Cet article fait le même travail avec tidytext + ggwordcloud : une poignée d’étapes de pipeline qui produisent une table de fréquences tidy et un vrai ggplot que vous pouvez habiller, colorer et combiner comme n’importe quelle autre figure.
Nous utiliserons le discours de Gettysburg (domaine public) comme texte d’exemple — mais chaque étape fonctionne sur votre texte : collez-le dans une chaîne de caractères, ou lisez un fichier avec readLines().
Le pipeline moderne de nuage de mots en un coup d’œil
Quatre étapes vous mènent du texte brut au nuage terminé :
- Récupérez le texte dans un data frame à une colonne (une seule ligne de texte suffit).
- Segmentez — découpez le texte en mots individuels avec
tidytext::unnest_tokens(). - Nettoyez + comptez — supprimez les mots vides courants (
the,and,of…) avecstop_words, puiscount()ce qui reste. - Affichez la table de fréquences avec
ggwordcloud::geom_text_wordcloud_area().
Tout ce qui suit est ce pipeline, une étape à la fois. Vous n’avez besoin que de trois packages : tidytext, dplyr et ggwordcloud (plus ggplot2 pour l’habillage).
Étape 1 — Mettez votre texte dans un data frame
D’abord, placez le texte quelque part où R peut le manipuler. Le workflow tidy attend un data frame avec une colonne de texte — chaque ligne peut contenir autant — ou aussi peu — de texte que vous voulez. Ici, nous déposons tout le discours dans un data frame à une seule ligne :
Pour utiliser plutôt votre propre texte, lisez un fichier directement dans la même forme :
# One row per line of the file:
text_df <- data.frame(
text = readLines("my-text.txt"),
stringsAsFactors = FALSE
)Étape 2 — Segmenter le texte avec tidytext
Ensuite, découpez le texte en mots individuels. unnest_tokens() le fait en un seul appel : donnez-lui le nom de la colonne de sortie (word) et la colonne d’entrée (text), et il renvoie un data frame long avec une ligne par mot — déjà en minuscules et débarrassé de la ponctuation :
tokens <- text_df |>
unnest_tokens(word, text)
head(tokens, 8) word
1 four
2 score
3 and
4 seven
5 years
6 ago
7 our
8 fathers
C’est toute l’étape de « transformation + nettoyage du texte » de l’ancienne recette tm — passage en minuscules, suppression de la ponctuation, élimination des espaces — condensée en une seule ligne lisible.
Étape 3 — Supprimer les mots vides et compter les fréquences
La plupart de ces tokens sont des mots vides : des mots à haute fréquence et faible information comme the, and, of, we. tidytext fournit une table stop_words toute prête ; nous les supprimons donc avec un anti_join(), puis count() ce qui reste, trié par fréquence :
word_freq <- tokens |>
anti_join(stop_words, by = "word") |>
count(word, sort = TRUE)
head(word_freq, 10) word n
1 nation 5
2 dedicated 4
3 dead 3
4 people 3
5 conceived 2
6 dedicate 2
7 devotion 2
8 field 2
9 living 2
10 war 2
Le résultat est une table de fréquences des mots tidy — la même chose que produisait l’ancienne TermDocumentMatrix(), mais sous forme d’un simple data frame que vous pouvez inspecter, filtrer et tracer directement. Ici, les mots en tête — nation, dedicated, dead, people, conceived — résument instantanément le discours.
Vous voulez aussi éliminer vos propres mots vides (par exemple du remplissage propre à votre domaine) ? Filtrez-les simplement avant de tracer :
custom_stop <- c("said", "also", "one")
word_freq <- word_freq |>
filter(!word %in% custom_stop)Étape 4 — Afficher le nuage de mots avec ggwordcloud
Voici la récompense. ggwordcloud ajoute un geom ggplot : un nuage de mots n’est donc qu’un appel ggplot() classique — associez label au mot et size à sa fréquence, puis ajoutez geom_text_wordcloud_area(). Nous fixons d’abord une graine, car la disposition est placée aléatoirement — la fixer rend la figure reproductible :
set.seed(1234)
ggplot(word_freq, aes(label = word, size = n)) +
geom_text_wordcloud_area() +
scale_size_area(max_size = 24) +
theme_minimal()
geom_text_wordcloud_area() dimensionne chaque mot pour que son aire — et pas seulement sa hauteur — soit proportionnelle à la fréquence, ce qui se lit plus honnêtement que l’ancien rendu de wordcloud(). scale_size_area(max_size = ...) contrôle la taille du plus grand mot ; ajustez-la pour l’adapter à votre canevas.
Ajouter de la couleur et garder chaque mot dans le cadre
Deux améliorations rendent le nuage prêt à publier. Associez la couleur à la fréquence pour que l’œil suive l’importance (une échelle viridis adaptée au daltonisme), et passez rm_outside = TRUE pour que tout mot qui ne rentre pas soit supprimé plutôt que coupé au bord :
set.seed(1234)
ggplot(word_freq, aes(label = word, size = n, color = n)) +
geom_text_wordcloud_area(rm_outside = TRUE) +
scale_size_area(max_size = 26) +
scale_color_viridis_c() +
theme_minimal()
Comme c’est un vrai ggplot, tout ce que vous savez déjà s’applique : remplacez par scale_color_gradient(low = "#cfe3f7", high = "#3a86d4") pour un dégradé azur de la marque, ajoutez un labs(title = ...), ou retirez la légende avec theme(legend.position = "none").

Limiter le nuage aux mots les plus fréquents
Pour un texte plus dense, un nuage aux centaines de mots minuscules n’est que du bruit. Ne gardez que les mots porteurs de signal — les équivalents des anciens arguments min.freq / max.words — en filtrant ou en découpant la table avant de tracer :
# Keep words used at least twice:
word_freq |> filter(n >= 2)
# Or keep only the 100 most frequent:
word_freq |> slice_max(n, n = 100)Bonus — un diagramme en barres des fréquences des mots
Un nuage est parfait pour une vue d’ensemble rapide, mais pour des comparaisons exactes un diagramme en barres est plus précis. C’est un ggplot de plus sur la même table de fréquences — réordonnez les mots par effectif pour que les barres se lisent de haut en bas :
top_words <- head(word_freq, 12)
ggplot(top_words, aes(x = n, y = reorder(word, n))) +
geom_col(fill = "#3a86d4") +
labs(x = "Frequency", y = NULL, title = "Most frequent words") +
theme_minimal(base_size = 13)
Associez les deux : le nuage pour l’affiche, le diagramme en barres quand un lecteur demande exactement combien de fois chaque mot apparaît.
Questions fréquentes
Ce n’est pas nécessaire. La recette tm + wordcloud() (Corpus, tm_map, TermDocumentMatrix) fonctionne toujours, mais le pipeline tidytext + ggwordcloud présenté ici fait le même travail avec moins de code, renvoie un data frame tidy que vous pouvez inspecter et réutiliser, et produit un vrai ggplot que vous pouvez habiller et colorer. Optez pour la pile tidy pour tout nouveau projet.
Lisez le fichier dans le data frame à une colonne qui démarre le pipeline : text_df <- data.frame(text = readLines("my-text.txt"), stringsAsFactors = FALSE). Tout ce qui suit l’étape 1 — unnest_tokens(), l’anti_join() des mots vides, count() et geom_text_wordcloud_area() — reste inchangé.
La table stop_words intégrée à tidytext gère les plus courants. Pour des mots supplémentaires, filtrez-les avant de tracer : word_freq |> filter(!word %in% c("said", "also", "one")). Vous pouvez aussi ajouter votre liste à stop_words avec bind_rows() et conserver un seul anti_join().
ggwordcloud place les mots selon une disposition aléatoire ; chaque exécution diffère donc tant que vous ne fixez pas la graine. Appelez set.seed(1234) (n’importe quel entier) juste avant le tracé pour obtenir une disposition reproductible — essentiel pour une figure que vous versionnez ou publiez.
Oui. Le stemming regroupe dedicate, dedicated et dedication en une seule racine. Ajoutez le package SnowballC et transformez la colonne des tokens avant de compter : mutate(word = SnowballC::wordStem(word)). C’est optionnel — pour un nuage de mots destiné à l’affichage, les mots non racinisés se lisent souvent plus naturellement.
Pour aller plus loin dans /learn
Cet article est la recette ciblée. Comme un nuage de mots n’est qu’un ggplot, toute la boîte à outils ggplot2 — échelles, palettes de couleurs et thèmes — se transpose directement :
- Série ggplot2 — les tutoriels complets, sous contrôle de reproductibilité, des geoms, échelles et thèmes.
- Visualisation de données — tout le pilier, du premier graphique à la figure de publication.
Voir aussi
- Série ggplot2 — construisez n’importe quelle figure, étape par étape. · Visualisation de données — le pilier complet.
Demandez à Prova « transforme cette colonne de réponses à une enquête en nuage de mots avec tidytext et ggwordcloud » — elle répond avec du code que vous pouvez exécuter sur vos propres données. The runtime is the judge. Demander à Prova →
Citation
@online{kassambara2026,
author = {Kassambara, Alboukadel},
title = {Nuage de mots en R : guide moderne avec tidytext et
ggwordcloud},
date = {2026-07-08},
url = {https://www.datanovia.com/blog/word-cloud-in-r},
langid = {fr}
}