plot(mtcars$wt, mtcars$mpg,
pch = 16, frame = FALSE,
xlab = "Weight (1000 lbs)", ylab = "Miles per gallon",
col = "#3a86d4")
Ouvrez un périphérique graphique, dessinez, puis dev.off() — réglez la taille et la résolution pour l’impression ou le web
Enregistrez un graphique en R de base dans un fichier avec png(), pdf(), jpeg(), tiff(), svg() et bmp(). Ouvrez le périphérique, dessinez le graphique, fermez-le avec dev.off() ; réglez la largeur, la hauteur, les unités et la résolution ; enregistrez le graphique courant avec dev.copy()/dev.print() ; et placez plusieurs graphiques dans un seul fichier.
27 juin 2026
7 juillet 2026
png(), pdf(), …), dessiner le graphique, fermer le périphérique avec dev.off().png() · jpeg() · tiff() · bmp() pour le raster, pdf() · svg() pour le vectoriel.width/height (et units + res pour le raster) — 300 ppp pour l’impression, 72–96 pour le web.dev.copy() ou dev.print().dev.off() est le piège n° 1 : le fichier reste ouvert, vide ou corrompu, tant que vous ne l’appelez pas.Vous avez construit le graphique, il a l’air bien à l’écran — il vous faut maintenant un fichier à glisser dans un rapport, un article ou une diapositive. En R de base, on n’« exporte » pas un objet graphique ; on redirige les graphiques vers un fichier. Ouvrez un périphérique fichier, exécutez votre code de tracé, puis fermez le périphérique. Tout ce qui est dessiné entre les deux atterrit dans le fichier.
C’est tout le modèle, et il tient en trois lignes :
Le format que vous voulez décide de la fonction avec laquelle vous ouvrez — png(), pdf(), jpeg(), tiff(), bmp() ou svg(). Cette leçon couvre chacune d’elles, plus la façon de régler la taille et la résolution, comment enregistrer un graphique que vous avez déjà dessiné, et comment placer plusieurs graphiques dans un seul fichier.
Vous travaillez avec ggplot2 plutôt ? Il dispose d’un assistant en un seul appel, ggsave() — voir Enregistrer avec ggsave dans la série ggplot2.
Nous utiliserons le jeu de données intégré mtcars et un simple nuage du poids en fonction de la consommation. Le voici dessiné en ligne pour que vous voyiez exactement ce que chaque commande d’enregistrement écrit sur le disque :

Chaque exemple d’enregistrement ci-dessous dessine ce même graphique — seul le périphérique qui l’entoure change.
Un périphérique fichier écrit sur le disque et ne produit aucune figure à l’écran. C’est attendu : le but, c’est le fichier. Pour prouver qu’un enregistrement a fonctionné, cette leçon écrit dans un fichier temporaire puis vérifie qu’il existe et a une taille non nulle — ainsi vous pouvez voir la recette s’exécuter sans qu’une image apparaisse en ligne.
png() est le choix de tous les jours pour le web, les fichiers README et les diapositives — un format raster compact. Ouvrez-le, dessinez, fermez-le :
quartz_off_screen
2
[1] TRUE
En conditions réelles vous passez un vrai nom — png("myplot.png") — et le fichier atterrit dans votre répertoire de travail. C’est dev.off() qui vide réellement le tampon et ferme le fichier ; omettez-le et le PNG reste vide.
Le PNG par défaut fait 480 × 480 pixels — petit et de basse résolution. Contrôlez-le avec width, height, units et res. Pour les formats raster, donnez la taille en pouces ou en centimètres et réglez la résolution (res) pour que le texte et les lignes se mettent correctement à l’échelle :
quartz_off_screen
2
[1] TRUE
Deux règles empiriques pour la résolution :
res = 300 (300 ppp), taille en pouces pour correspondre à la largeur de colonne.res = 72 ou 96 garde le fichier léger ; les pixels (units = "px", le défaut) conviennent.Si vous réglez units = "in" vous devez aussi régler res — sinon R traite les nombres comme des pixels et vous obtenez une image minuscule.
pdf() et svg() écrivent des graphiques vectoriels — infiniment redimensionnables, sans pixellisation, le bon choix pour l’impression et pour les figures susceptibles d’être redimensionnées. Leur taille est toujours en pouces, et il n’y a pas de res (les vecteurs n’ont pas de résolution) :
quartz_off_screen
2
[1] TRUE
svg() fonctionne de la même façon et produit un fichier que vous pouvez modifier dans Inkscape ou Illustrator, ou intégrer dans une page web. Utilisez un format vectoriel chaque fois que la figure sera imprimée ou mise à l’échelle ; utilisez le PNG quand vous avez besoin d’un raster de taille fixe.
Les périphériques raster restants suivent le même schéma ouvrir–dessiner–fermer ; seuls le nom de la fonction et l’extension changent :
quartz_off_screen
2
quartz_off_screen
2
jpeg tiff
TRUE TRUE
bmp() est aussi disponible (bmp("myplot.bmp")) mais non compressé et rarement nécessaire. Un guide rapide des formats :
| Function | Format | Type | À utiliser pour |
|---|---|---|---|
png() |
PNG | raster | web, diapositives, README — lignes nettes, fichiers légers |
jpeg() |
JPEG | raster | photos ; à éviter pour les tracés en lignes (artefacts de compression) |
tiff() |
TIFF | raster | revues qui exigent un raster sans perte à 300 ppp |
bmp() |
BMP | raster | rarement — non compressé, lourd |
pdf() |
vector | impression, articles, figures redimensionnables | |
svg() |
SVG | vector | figures modifiables, intégration web |
Parfois vous avez déjà dessiné un graphique de façon interactive et vous voulez simplement garder celui-là, sans réexécuter le code. dev.copy() copie le graphique courant de l’écran vers un périphérique fichier, et dev.print() fait la copie et ferme en un seul appel.

quartz_off_screen
2
[1] TRUE
dev.print(png, file = f, ...) est la forme compacte — elle ouvre le périphérique PNG, copie le graphique courant dedans, et le ferme pour vous. Avec dev.copy() vous écririez dev.copy(png, f, ...) suivi de son propre dev.off(). Dans les deux cas vous évitez de redessiner.
Un périphérique fichier reste ouvert jusqu’à dev.off(), donc tout ce que vous dessinez entre-temps va dans le même fichier. Combinez cela avec par(mfrow = ...) pour placer une grille de graphiques sur une page — idéal pour une figure PDF multi-panneaux :
f <- tempfile(fileext = ".pdf")
pdf(f, width = 8, height = 4)
op <- par(mfrow = c(1, 2)) # 1 row, 2 columns on the page
plot(mtcars$wt, mtcars$mpg, pch = 16, frame = FALSE,
xlab = "Weight", ylab = "MPG", col = "#3a86d4")
plot(mtcars$hp, mtcars$mpg, pch = 16, frame = FALSE,
xlab = "Horsepower", ylab = "MPG", col = "#e07b39")
par(op) # restore the layout
dev.off() # one PDF, two panelsquartz_off_screen
2
[1] TRUE
Pour un PDF multi-pages, supprimez par(mfrow=) et appelez simplement plot() plusieurs fois entre pdf() et dev.off() — chaque plot() démarre une nouvelle page. (Le PDF est le seul périphérique qui pagine ainsi ; un périphérique PNG écraserait chaque graphique.)
Changez le format, la taille ou la résolution et appuyez sur Run — cela s’exécute dans votre navigateur via webR. Nous enregistrons dans un fichier temporaire et indiquons sa taille pour que vous puissiez voir le résultat sans qu’une image surgisse.
Demandez à Prova « mon PNG enregistré est vide — qu’est-ce qui a mal tourné ? » — elle répond avec du code R de base que vous pouvez exécuter, donc la correction est reproductible. The runtime is the judge. Demander à Prova →
Le fichier est vide ou blanc. Vous avez oublié dev.off(). Le périphérique reste ouvert et le fichier n’est pas fini d’écrire tant que vous ne le fermez pas — c’est la seule erreur la plus courante. Associez toujours chaque png()/pdf()/… à un dev.off(). Si un périphérique reste bloqué ouvert, exécutez dev.off() jusqu’à voir null device 1, ou graphics.off() pour les fermer tous.
Le texte et les points paraissent énormes ou minuscules. Vous avez réglé units = "in" sans res, donc R a lu la taille comme des pixels (une image de 6 × 4 pixels). Ajoutez res = 300 (ou 72) chaque fois que vous donnez la taille en pouces ou en centimètres. Le même res met aussi à l’échelle l’épaisseur des lignes et la taille des polices, alors réglez-le avant d’ajuster cex.
Rien ne s’affiche en ligne dans un notebook ou sur cette page. C’est attendu — un périphérique fichier écrit sur le disque, pas à l’écran. Ouvrez le fichier enregistré pour le voir, ou dessinez le graphique normalement (sans périphérique) quand vous le voulez en ligne.
Ouvrez un périphérique graphique pour le format de fichier que vous voulez (png("myplot.png"), pdf("myplot.pdf"), …), exécutez votre code de tracé, puis fermez le périphérique avec dev.off(). Tout ce qui est dessiné entre les deux appels est écrit dans le fichier.
Appelez png("myplot.png"), dessinez le graphique, puis dev.off(). Ajoutez width, height, units = "in" et res = 300 pour une image de qualité d’impression, correctement dimensionnée.
Utilisez pdf("myplot.pdf", width = 6, height = 4), dessinez le graphique, puis dev.off(). Le PDF est un format vectoriel, donc la taille est en pouces et il n’y a pas de résolution à régler — la figure reste nette à n’importe quelle échelle.
Vous avez presque certainement oublié dev.off(). Le fichier n’est pas terminé tant que le périphérique n’est pas fermé. Exécutez dev.off() (répétez jusqu’à voir null device 1) et réenregistrez.
Utilisez dev.print(png, file = "myplot.png", width = 6, height = 4, units = "in", res = 300) pour copier le graphique courant de l’écran vers un fichier en un seul appel — sans avoir à réexécuter le code de tracé. dev.copy() fait la même chose mais nécessite son propre dev.off().
Enregistrez le nuage de points ci-dessous dans un PDF nommé dans f, de taille 7 × 5 pouces. Puis confirmez que le fichier existe. Rappelez-vous les trois étapes — ouvrir, dessiner, fermer.
La taille d’un PDF est en pouces et ne prend pas de res. Ouvrez avec pdf(f, width = 7, height = 5) avant l’appel à plot(), et n’oubliez pas dev.off() après lui.
Vérification rapide. Vous voulez une figure de qualité d’impression à 300 ppp pour une revue qui exige un format raster sans perte. Quel périphérique devez-vous ouvrir ?
tiff() — c’est un raster sans perte, le format que la plupart des revues exigent. Utilisez tiff(file, width = 6, height = 4, units = "in", res = 300). (jpeg() est avec perte et ajoute des artefacts aux tracés en lignes ; png() convient quand la revue l’accepte.)
Enregistrer un graphique en R de base, c’est toujours les mêmes trois étapes : ouvrir un périphérique pour le format que vous voulez, dessiner le graphique, fermer le périphérique avec dev.off(). Choisissez png()/jpeg()/tiff()/bmp() pour le raster et pdf()/svg() pour le vectoriel, réglez width/height (plus res pour le raster), et tournez-vous vers dev.copy()/dev.print() quand le graphique est déjà à l’écran. La seule règle à intérioriser : chaque périphérique ouvert a besoin d’un dev.off().
Prouvez que vous savez le faire. Maîtrisez toute la série R Base Graphics — suivez votre parcours, construisez des projets et obtenez un certificat.
Passez à Pro — Prova illimité sur vos propres données et un certificat vérifiable qui atteste la compétence.
dès 15 $/mois facturé annuellement
✓ Vous êtes Pro — continuez. The runtime is the judge.
Prêt à passer à la vitesse supérieure ?
Recevez les nouvelles leçons R & Python par e-mail
Pratique, reproductible, sans spam. Désinscription à tout moment.
Double opt-in. Nous ne partageons jamais votre e-mail.
Cette leçon est reproductible : chaque résultat sur cette page a été produit par le code affiché, exécuté lors de la génération du site (si elles s’affichent, le code fonctionne), et le bac à sable se réexécute en direct dans votre navigateur. Modifiez n’importe quel bloc et appuyez sur Run. The runtime is the judge.
@online{2026,
author = {},
title = {Enregistrer un graphique en R : exporter en PNG, PDF, JPEG,
TIFF et SVG},
date = {2026-06-27},
url = {https://www.datanovia.com/learn/data-visualization/r-base/save-graphs},
langid = {fr}
}