Enregistrer un graphique en R : exporter en PNG, PDF, JPEG, TIFF et SVG

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.

Date de publication

27 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Enregistrer un graphique se fait en trois étapes : ouvrir un périphérique graphique (png(), pdf(), …), dessiner le graphique, fermer le périphérique avec dev.off().
  • Le format du fichier, c’est la fonction : png() · jpeg() · tiff() · bmp() pour le raster, pdf() · svg() pour le vectoriel.
  • Réglez la taille avec width/height (et units + res pour le raster) — 300 ppp pour l’impression, 72–96 pour le web.
  • Vous avez déjà un graphique à l’écran ? Enregistrez-le sans le redessiner avec dev.copy() ou dev.print().
  • Oublier dev.off() est le piège n° 1 : le fichier reste ouvert, vide ou corrompu, tant que vous ne l’appelez pas.

Introduction

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 :

png("myplot.png")   # 1. open a device pointing at a file
plot(...)           # 2. draw — output goes to the file, not the screen
dev.off()           # 3. close the device and finish writing the file

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.

Le graphique que nous allons enregistrer

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 :

plot(mtcars$wt, mtcars$mpg,
     pch = 16, frame = FALSE,
     xlab = "Weight (1000 lbs)", ylab = "Miles per gallon",
     col = "#3a86d4")

A base R scatter plot of car weight on the x axis against miles per gallon on the y axis, drawn with solid azure points and no box frame.

Chaque exemple d’enregistrement ci-dessous dessine ce même graphique — seul le périphérique qui l’entoure change.

Note

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.

Enregistrer en PNG

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 :

f <- tempfile(fileext = ".png")

png(f)                                    # 1. open the PNG device
plot(mtcars$wt, mtcars$mpg, pch = 16, frame = FALSE,
     xlab = "Weight (1000 lbs)", ylab = "Miles per gallon", col = "#3a86d4")
dev.off()                                 # 3. close it — the file is now written
quartz_off_screen 
                2 
file.exists(f)                            # TRUE: the plot was saved
[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.

Régler la taille et la résolution

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 :

f <- tempfile(fileext = ".png")

# 6 x 4 inches at 300 dpi — print-quality
png(f, width = 6, height = 4, units = "in", res = 300)
plot(mtcars$wt, mtcars$mpg, pch = 16, frame = FALSE,
     xlab = "Weight (1000 lbs)", ylab = "Miles per gallon", col = "#3a86d4")
dev.off()
quartz_off_screen 
                2 
# The higher-res file is meaningfully larger
file.size(f) > 0
[1] TRUE

Deux règles empiriques pour la résolution :

  • Impression / publication : res = 300 (300 ppp), taille en pouces pour correspondre à la largeur de colonne.
  • Web / écran : 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.

Enregistrer en PDF (et SVG) : les formats vectoriels

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) :

f <- tempfile(fileext = ".pdf")

pdf(f, width = 6, height = 4)             # size in inches; no res for vector
plot(mtcars$wt, mtcars$mpg, pch = 16, frame = FALSE,
     xlab = "Weight (1000 lbs)", ylab = "Miles per gallon", col = "#3a86d4")
dev.off()
quartz_off_screen 
                2 
file.exists(f)
[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.

Enregistrer en JPEG, TIFF et BMP

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 :

# JPEG — photographs and lossy web images
f1 <- tempfile(fileext = ".jpg")
jpeg(f1, width = 6, height = 4, units = "in", res = 300)
plot(mtcars$wt, mtcars$mpg, pch = 16, frame = FALSE,
     xlab = "Weight (1000 lbs)", ylab = "Miles per gallon", col = "#3a86d4")
dev.off()
quartz_off_screen 
                2 
# TIFF — lossless, the format many journals require
f2 <- tempfile(fileext = ".tiff")
tiff(f2, width = 6, height = 4, units = "in", res = 300)
plot(mtcars$wt, mtcars$mpg, pch = 16, frame = FALSE,
     xlab = "Weight (1000 lbs)", ylab = "Miles per gallon", col = "#3a86d4")
dev.off()
quartz_off_screen 
                2 
c(jpeg = file.exists(f1), tiff = file.exists(f2))
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() PDF vector impression, articles, figures redimensionnables
svg() SVG vector figures modifiables, intégration web

Enregistrer le graphique déjà à l’écran : dev.copy() et dev.print()

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.

f <- tempfile(fileext = ".png")

# Draw the plot (on a real device this is your on-screen figure)
plot(mtcars$wt, mtcars$mpg, pch = 16, frame = FALSE,
     xlab = "Weight (1000 lbs)", ylab = "Miles per gallon", col = "#3a86d4")

A base R scatter plot of car weight against miles per gallon with solid azure points and no box frame — the current on-screen figure that dev.print() copies to a PNG file.

# Copy the current plot to a PNG, then close that device
dev.print(png, file = f, width = 6, height = 4, units = "in", res = 300)
quartz_off_screen 
                2 
file.exists(f)
[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.

Plusieurs graphiques dans un seul fichier

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 panels
quartz_off_screen 
                2 
file.exists(f)
[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.)

Essayez en direct

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.

🟢 Avec un agent IA

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 →

Problèmes courants

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.

Questions fréquentes

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().

Testez vos connaissances

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.

f <- tempfile(fileext = ".pdf")

pdf(f, width = 7, height = 5)
plot(mtcars$wt, mtcars$mpg, pch = 16, frame = FALSE,
     xlab = "Weight", ylab = "MPG", col = "#3a86d4")
dev.off()

file.exists(f)   # TRUE

pdf() ouvre le périphérique, plot() dessine dedans, et dev.off() ferme et écrit le fichier.

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.)

Conclusion

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().

Leçons connexes

Cette page vous a-t-elle été utile ?

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.

Commencer gratuitement →

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

Passer à Pro →

✓ Vous êtes Pro — continuez. The runtime is the judge.

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.

Partager cette pageXLinkedInRedditHN
Note

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.

Réutilisation

Citation

BibTeX
@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}
}
Veuillez citer ce travail comme suit :
“Enregistrer un graphique en R : exporter en PNG, PDF, JPEG, TIFF et SVG.” 2026. June 27. https://www.datanovia.com/learn/data-visualization/r-base/save-graphs.