################################################################################ # Sémin-R du Muséum national d'Histoire naturelle # # 08-01-2008 # # Jérôme Sueur (MNHN, DSE, OSEB, sueur@mnhn.fr) # # "Sauvegarde des graphiques: formats et méthodes" # # R.2.61 / WIndow XP Pack2 # ################################################################################ ################################################################################ # CREATION D'UN PLOT SIMPLE DE REFERENCE ################################################################################ x<-rep(1:10,10) y<-rep(1:10,each=10) plot(x,y,col=1:10,cex=3,pch=15,main="test") ################################################################################ # SAUVEGARDE DEPUIS LA FENETRE GRAPHIQUE (GRAPHICS DEVICE) ################################################################################ # Fichier | Copier vers le presse-papier... : # ctrl+c [matriciel] # ctrl+w [vectoriel] # Conserve le format de la fenêtre # Raccourcis pour sauvegarde directe dans le presse-papier # Très rapide mais qualité moyenne, utile pour des graphiques exploratoires # Fichier | Sauver sous... : # Sauve directement en différents formats # Pratique mais pas d'options de dimension ni de résolution. # Vectoriel (métafichier...) = .emf = enhanced metafile, vectoriel 32 bits de windows # postscript = .ps = vectoriel # PDF = portable document format = vectoriel pour Adobe Acrobat et Reader # PNG = portable netwwork graphics = matriciel non destructeur # BMP = matriciel de windows, non destructeur, universel # JPEG = Joint Photographic Experts Group = matriciel destructeur, universel # Pour un graphique simple plot(x,y,col=1:10,cex=3,pch=15,main="test") # Si on teste les différentes formats, on obtient par ordre de poids # PNG [5 ko] / PS [12 ko] / PDF [13 ko] / JPG_50% [29 ko] / JPG_75% [36 ko] / # EMF [38 ko] / JPG_100% [81 ko]/ BMP [467 ko] # Soit graphiquement: format<-1:8 ; poids1<-c(5,12,13,29,36,38,81,467) formatlabel<-c("PNG","PS","PDF","JPG_50%","JPG_75%","EMF","JPG_100%","BMP") plot(format,poids1,type="l",col="grey", xlab="Format",ylab="Poids du fichier (ko)",ylim=c(0,2200),font.lab=2) text(formatlabel,x=format,y=poids1,cex=0.75,col=c(2,4,4,2,2,4,2,2),font=2) # Mais si on refait la même expérience avec un graphique plus complexe # c'est-à-dire avec plus de points, par exemple: x11() # nouvelle fenêtre graphique filled.contour(volcano, color = terrain.colors, asp = 1) dev.off() # fermeture de la fenêtre graphique # Le classement devient # PNG [13 ko] / PS [908 ko] / PDF [983 ko] / JPG_50% [27 ko] / JPG_75% [36 ko] / # EMF [2169 ko] / JPG_100% [139 ko]/ BMP [467 ko] # On complète le graphique suivant: poids2<-c(13,908,983,27,36,2169,139,467) lines(poids2,col="grey",lty=2) text(formatlabel,x=format,y=poids2,cex=0.75,col=c(2,4,4,2,2,4,2,2),font=2) legend("topleft",c("Matriciel","Vectoriel"),text.col=c(2,4)) legend("topright",c("Simple","Complexe"),lty=c(1,2),col="grey") # Conclusion: à vous de choisir selon # (1) la complexité du graphique, # (2) la taille de votre espace de stockage # (3) les exigences de l'éditeur... ################################################################################ # SAUVEGARDE DEPUIS LA CONSOLE EN MATRICIEL ################################################################################ # Les menus de la fenêtre graphique ont un équivalent en console # mais la commande ne donne pas plus de liberté: ?savePlot() # Pour avoir plus d'options, il faut suivre un principe en 3 étapes # (1) appel d'une fonction sortie graphique à choisir entre: bmp("test2.bmp") png("test2.png") jpeg("test2.jpg") # (2) insertion des lignes de commandes graphiques plot(x,y,col=1:10,cex=3,pch=15,main="test") # (3) fermeture du graphique dev.off() # Attention le graphique est sauvegardé dans le dossier de travail par défaut, # si vous voulez le sauver dans un répertoire particulier il faut soit : # (1) changer le chemin par défaut avec setwd(), setwd("C:/") # (2) utiliser le menu de la console: Fichier |Changer le répertoire courant... # (3) modifier directement le nom du graphique bmp("C:/test2.bmp") # Modifions maintenant les arguments des fonctions de sortie graphique # On se limite à la fonction jpeg() car png() ne conserve pas toujours le titre ! # bug apparemment lié à windows... idem sous Linux? # Par défaut jpeg("test2_1.jpg") plot(x,y,col=1:10,cex=3,pch=15,main="test2_1") dev.off() # Changeons le paramètre pointsize # Par défaut point size = 12, interprété comme 72 dpi # qui est la résolution des écrans. Sachant que 1 inch = 2.54 cm : # 72 pixels/inch d'écran = 28 pixels/cm d'écran # si bien que 1 point écran = 1 point sortie # Avec pointsize = 12, on obtient à peu près ce que l'on voit à l'écran # Que se passe-t-il si on l'augmente ? jpeg("test2_2.jpg",point=12*1.25) plot(x,y,col=1:10,cex=3,pch=15,main="test2_2") dev.off() # Résultat: petit problème... # Augmentons alors les dimensions du graphique jpeg("test2_3.jpg",width=480*1.25,height=480*1.25,point=12*1.25) plot(x,y,col=1:10,cex=3,pch=15,main="test2_3") dev.off() # Résultat: on récupère à peu près la même chose mais le graphique est plus grand # Il faut donc jouer sur les deux paramètres en même temps # Depuis peu, il est possible de spécifier les dimensions du graphique en cm et en mm # au lieu des inch et du nombre de pixels(ouf !) # Dans ce cas, il est nécessaire de renseigner la résolution de sortie # par exemple 300 dpi (=118 pixels/cm) qui est la résolution calssique d'impression # On essaye un graphique de 12 cm par 10 cm avec une résolution de 300 dpi jpeg("test2_4.jpg",width=12,height=10,units="cm",res=300) plot(x,y,col=1:10,cex=3,pch=15,main="test2_4") dev.off() # Résultat = bien différent ! # La correspondance en pixels s'écrit ainsi: jpeg("test2_5.jpg",width=118*12,height=118*10) plot(x,y,col=1:10,cex=3,pch=15,main="test2_5") dev.off() # Résultat = on retrouve bien la même chose (ouf!) # Revenons aux centimètres # Si on veut augmenter la résolution par 2 jpeg("test2_6.jpg",width=12,height=10,units="cm",res=300*2) plot(x,y,col=1:10,cex=3,pch=15,main="test2_6") dev.off() # Résultat = le poids du fichier augmente, la taille des points diminue # Ce n'est pas beau ! # Augmentons alors la taille des points # On multiplie par 4 car 300/72 = 4.16 et par défaut pointsize = 12 = 72 dpi jpeg("test2_7.jpg",width=12,height=10,units="cm",point=12*4,res=300*2) plot(x,y,col=1:10,cex=3,pch=15,main="test2_7") dev.off() # Résultat = (ouf!) Il ne faut pas oublier que résolution = nombre de pixels/cm ! ################################################################################ # SAUVEGARDE DEPUIS LA CONSOLE EN VECTORIEL ################################################################################ # Il y a trois fonctions possibles # Dans tous les cas on peut modifier les dimensions du graphique # avec les arguements height et width, cette fois-ci en inch (!!) # Format postscript (.ps) postscript("test3_1.ps") plot(x,y,col=1:10,cex=3,pch=15,main="test3_1") dev.off() # Format encapsuled postcript (.eps) = postcript pour Adobe plot(x,y,col=1:10,cex=3,pch=15,main="test3_2") # Vous pouvez changer la forme du graphique à l'écran, # ces modifications seront conservées lors de la sauvegarde # Il est nécessaire d'avoir installé Ghostscript et GsView # pour que cette fonctionne marche dev.copy2eps(file="test3_2.ps") # Format PDF pdf("test3_3.pdf") plot(x,y,col=1:10,cex=3,pch=15,main="test3_3") dev.off() ################################################################################ # SAUVEGARDE DE PLUSIEURS FICHIERS (BOUCLE) ################################################################################ # On peut faire des boucles et sauver plusieurs images à la suite # Par exemple en format matriciel z<-1:1000 for (i in 1:9) { jpeg(paste("test4_",i,".jpg",sep="")) plot(z^(i+1),type="l",col=i,main=paste(i)) dev.off() }