################################################################################ ### TALLER SOBRE FUNDAMENTOS DE R ### ### PRESENTATION 8: GRÁFICOS ### ### ### ### Center for Conservation and Sustainable Development ### ### Missouri Botanical Garden ### ### Website: rbasicsworkshop.weebly.com ### ################################################################################ # Esta presentación del taller se basa en el capítulo 4 de "R para principiantes" # (Paradis 2003) y esta dividida en las siguientes secciones: # A) Introducción # B) Manejo de dispositivos gráficos: abrir varios dispositivos gráficos # C) Manejo de dispositivos gráficos: división de un dispositivo gráfico # D) Funciones gráficas de alto nivel (crean gráficas) # E) Funciones gráficas de bajo nivel (modifican gráficas existentes) # F) Parámetros gráficos (determinan el formato de las gráficas, pueden # modificarse usando la función "par") # G) Funciones gráficas cuyos resultados pueden asignarse a objetos de R # (*hist*, *boxplot*, *barplot*) ################################################################################ # A) Introducción ################################################################################ # R ofrece una variedad muy amplia de opciones para construir gráficos. Escriba # este código en la consola para ver algunas de estas opciones: demo(graphics) # El siguiente código (de la página de ayuda de la función *image*) produce # una mejor versión del gráfico del volcán: x <- 10*(1:nrow(volcano)) y <- 10*(1:ncol(volcano)) image(x, y, volcano, col = terrain.colors(100), axes = FALSE) contour(x, y, volcano, levels = seq(90, 200, by = 5), add = TRUE, col = "peru") axis(1, at = seq(100, 800, by = 100)) axis(2, at = seq(100, 600, by = 100)) box() title(main = "Maunga Whau Volcano", font.main = 4) # CRAN Task View: Graphic Displays & Dynamic Graphics & Graphic Devices & # Visualization, http://cran.r-project.org/web/views/Graphics.html # El resultado de varias funciones gráficas (e.g., *plot*) no se puede asignar a # objetos de R como los que hemos visto (vectores, factores, matrices, arreglos, # marcos de datos o listas), sino que se envía a dispositivos gráficos. Los # dispositivos gráficos son ventanas o archivos. La excepción son algunas # funciones gráficas (e.g., *hist*, *boxplot*, *barplot*) cuyos resultados sí # pueden asignarse a objetos de R, como veremos en la última sección de esta # presentación. Pero primero nos enfocaremos en el manejo de dispositivos # gráficos (i.e., ventanas y archivos), ya que estos son el principal medio # para la presentación de gráficos en R. ################################################################################ # B) Manejo de dispositivos gráficos: abrir varios dispositivos gráficos ################################################################################ # Cuando R ejecuta una función gráfica, una ventana gráfica se abre, a menos que # ya haya un dispositivo gráfico abierto: data(iris) plot(iris$Sepal.Length, iris$Sepal.Width, pch=19) # puede utilizar el menú bajo "File" para guardar la figura en un archivo # La función *dev.new* abre una nueva ventana gráfica: dev.new() plot(iris$Sepal.Length, iris$Petal.Length, pch=19) # Hay varias funciones para abrir dispositivos gráficos que son archivos, # según el tipo de archivo. Antes de ejecutar el siguiente código, asegúrese # que el directorio de trabajo corresponde a la carpeta donde usted quiere # guardar varios archivos gráficos que se generarán en los ejemplos a # continuación (use las funciones *getwd* and *setwd* para definir y verificar # su directorio de trabajo). jpeg(file="SepalLenght_vs_SepalWidth.jpeg") plot(iris$Sepal.Length, iris$Sepal.Width, pch=19) dev.off() #closes graphical device png(file="SepalLenght_vs_SepalWidth.png") plot(iris$Sepal.Length, iris$Sepal.Width, pch=19) dev.off() pdf(file="SepalLenght_vs_SepalWidth.pdf") plot(iris$Sepal.Length, iris$Sepal.Width, pch=19) dev.off() postscript(file="SepalLenght_vs_SepalWidth.ps") # utilizado frecuentemente en publicaciones plot(iris$Sepal.Length, iris$Sepal.Width, pch=19) dev.off() postscript(file="SepalLenght_vs_SepalWidth.eps") # utilizado frecuentemente en publicaciones plot(iris$Sepal.Length, iris$Sepal.Width, pch=19) dev.off() # Visite la página de ayuda de la función *device* para ver los dispositivos # gráficos disponibles: ?device # Pueden haber varios dispositvos gráficos abiertos simultaneamente durante una # sesión de R. La función *dev.list* se utiliza para deteminar cuáles # dispositivos gráficos están abiertos en un momento dado: dev.list() # La función *dev.cur* se utiliza para determinar cuál es el dispositivo gráfico # activo en un momento dado, es decir, el dispositivo gráfico al cuál se # enviará el resultado de las funciones gráficas como *plot*: dev.cur() # La función *dev.set* define el dispositivo gráfico activo: dev.set(2) # La función *dev.off* cierra un dispositivo gráfico: dev.off(3) # Para cerrar el dispositivo gráfico activo: dev.off() ################################################################################ # C) Manejo de dispositivos gráficos: división de un dispositivo gráfico ################################################################################ # La función *layout* divide un dispositivo gráfico en partes a las que los # resultados de las funciones gráficas (tales como *plot*) son asignados # sucesivamente. El principal argumento de la función *layout* es una matriz # con números enteros que determina la división del dispositivo gráfico y, # además, el orden en el que los resultados de las funciones gráficas son # asignados a las diferentes divisiones. layout(matrix(1:4, 2, 2)) #ver la página de ayuda de *layout* layout.show(4) #ver la página de ayuda de *layout.show* plot(iris$Sepal.Length, iris$Sepal.Width, pch=19, cex.lab=1.5, cex.axis=1.5, xlab="Sepal length (cm)", ylab="Sepal width (cm)") plot(iris$Sepal.Length, iris$Petal.Length, pch=19, cex.lab=1.5, cex.axis=1.5, xlab="Sepal length (cm)", ylab="Petal length (cm)") plot(iris$Sepal.Length, iris$Petal.Width, pch=19, cex.lab=1.5, cex.axis=1.5, xlab="Sepal length (cm)", ylab="Petal width (cm)") plot(iris$Sepal.Length, iris$Petal.Width, pch=19, type="n", axes=F, bty="n", xlab="", ylab="") mtext("Sepal length", line=-3, cex=1.5) mtext("versus", line=-5, cex=1.5) mtext("other variables", line=-7, cex=1.5) mtext("in Anderson's Iris", line=-9, cex=1.5) layout(matrix(1:6, 3, 2)) layout.show(6) plot(iris$Sepal.Length, iris$Sepal.Width, pch=19) plot(iris$Sepal.Length, iris$Petal.Length, pch=19) plot(iris$Sepal.Length, iris$Petal.Width, pch=19) plot(iris$Sepal.Width, iris$Petal.Length, pch=19) plot(iris$Sepal.Width, iris$Petal.Width, pch=19) plot(iris$Petal.Length, iris$Petal.Width, pch=19) layout(matrix(1, 1, 1)) layout.show(1) # Por defecto la función *layout* divide un dispositivo gráfico en partes # de igual tamaño. Los argumentos "widths" y "heights" se pueden utilizar # para dividir un dispositivo gráfico en partes de tamaños diferentes: m <- matrix(1:4, 2, 2) layout(m, widths=c(1, 3), heights=c(3, 1)) layout.show(4) m <- matrix(c(1,1,2,1),2,2) layout(m, widths=c(2, 1), heights=c(1, 2)) layout.show(2) ################################################################################ # D) Funciones gráficas de alto nivel (crean gráficas) ################################################################################ # A continuación algunos ejemplos, ver més funciones en las páginas # 32-33 de "R para principiantes" (Paradis 2003) iris[1:5,] plot(iris$Sepal.Length) plot(iris$Sepal.Length, iris$Sepal.Width) plot(iris$Petal.Length, iris$Petal.Width) plot(iris$Petal.Length, iris$Petal.Width, xlab="Sepal length (cm)", ylab="Petal Width (cm)", cex.axis=1.5, cex.lab=1.5, bty="n", pch=19) sunflowerplot(iris$Sepal.Length, iris$Sepal.Width) boxplot(iris$Sepal.Length ~ iris$Species) boxplot(iris$Sepal.Length ~ iris$Species, names=expression(italic("Iris setosa"), italic("Iris versicolor"), italic("Iris virginica")), ylab="Sepal length (cm)", cex.axis=1.5, cex.lab=1.5) coplot(iris$Petal.Length ~ iris$Petal.Width | iris$Sepal.Length, overlap=0, pch=19) pairs(iris) hist(iris$Sepal.Length) ################################################################################ # E) Funciones gráficas de bajo nivel (modifican gráficas existentes) ################################################################################ # El siguiente código presenta algunos ejemplos con funciones *points* y *legend*; # ver otras funciones en lass páginas 34 de "R para principiantes" (Paradis 2003) plot(iris$Petal.Length, iris$Petal.Width, xlab="Sepal length (cm)", ylab="Petal Width (cm)", cex=1.3, cex.axis=1.5, cex.lab=1.5, bty="n") points(iris$Petal.Length[iris$Species=="setosa"], iris$Petal.Width[iris$Species=="setosa"], cex=1.3, pch=19, col="red") points(iris$Petal.Length[iris$Species=="versicolor"], iris$Petal.Width[iris$Species=="versicolor"], cex=1.3, pch=19, col="blue") points(iris$Petal.Length[iris$Species=="virginica"], iris$Petal.Width[iris$Species=="virginica"], cex=1.3, pch=19, col="green") legend("topleft", c("Iris setosa", "I. versicolor", "I. virginica"), pch=19, col=c("red", "blue", "green"), cex=1.3) legend("bottomright", c(expression(italic("Iris setosa")), expression(italic("Iris versicolor")), expression(italic("Iris virginica"))), pch=19, col=c("red", "blue", "green"), cex=1.3) legend(1.3, 1.9, c(expression(italic("Iris setosa")), expression(italic("Iris versicolor")), expression(italic("Iris virginica"))), pch=19, col=c("red", "blue", "green"), cex=1.3) ################################################################################ # F) Parámetros gráficos (determinan el formato de las gráficas, pueden # modificarse usando la función "par") ################################################################################ # Usted tendrá verdadero control de sus gráficas utilizando las amplias # posibilidades que brinda la función *par*. Para ello es importante familiarizarse # con la página de ayuda de esta función. Los siguientes tres bloques de código # ilustran el uso de la función *par* y, también, de las funciones gráficas de bajo # nivel "axis", "mtext" y "legend": par(mar = c(5, 4, 4, 2) + 0.1) # These are default values, see help for "par" hist(iris$Sepal.Length, breaks=seq(0,8,0.5), col="gray70", border="gray40", xlab="", ylab="", main="", xaxt="n", yaxt="n", ylim=c(0,40)) par(new=T) hist(iris$Petal.Length, breaks=seq(0,8,0.5), density=30, xlab="", ylab="", main="", xaxt="n", yaxt="n", ylim=c(0,40)) axis(1, at=seq(0,8,1), cex.axis=2, lwd=2) mtext("Length (cm)", side=1, line=3, cex=2) axis(2, cex.axis=1.5, cex.axis=2, lwd=2) mtext("Specimens", side=2, line=3, cex=2) legend("topright", c("Sepals", "Petals"), fill=c("gray70", "black"), density=c(1000, 30), pt.cex=2, border=c("gray40", "black"), cex=2) # There is a problem, see it? In the next block of code the problem is solved # using argument "mar" of function "par" par(mar = c(5, 5, 4, 2) + 0.1) hist(iris$Sepal.Length, breaks=seq(0,8,0.5), col="gray70", border="gray40", xlab="", ylab="", main="", xaxt="n", yaxt="n", ylim=c(0,40)) par(new=T) hist(iris$Petal.Length, breaks=seq(0,8,0.5), density=30, xlab="", ylab="", main="", xaxt="n", yaxt="n", ylim=c(0,40)) axis(1, at=seq(0,8,1), cex.axis=2, lwd=2) mtext("Length (cm)", side=1, line=3, cex=2) axis(2, cex.axis=1.5, cex.axis=2, lwd=2) mtext("Specimens", side=2, line=3, cex=2) legend("topright", c("Sepals", "Petals"), fill=c("gray70", "black"), density=c(1000, 30), pt.cex=2, border=c("gray40", "black"), cex=2) par(mfcol = c(1,2)) hist(iris$Sepal.Length, breaks=seq(0,8,0.5), col="gray", border="black", ylim=c(0,40), xlab="Length (cm)", ylab="Specimens", cex.lab=1.5, cex.axis=1.5, main="Sepals", cex.main=1.5) hist(iris$Petal.Length, breaks=seq(0,8,0.5), col="gray", border="black", ylim=c(0,40), xlab="Length (cm)", ylab="Specimens", cex.lab=1.5, cex.axis=1.5, main="Petals", cex.main=1.5) ################################################################################ # G) Funciones gráficas cuyos resultados pueden asignarse a objetos de R # (*hist*, *boxplot*, *barplot*) ################################################################################ par(mfcol = c(1,1)) h.Sepal.Length <- hist(iris$Sepal.Length, breaks=seq(0,8,0.5)) h.Sepal.Length class(h.Sepal.Length) attributes(h.Sepal.Length) str(h.Sepal.Length) h.Sepal.Length$mids h.Sepal.Length$counts bp.Sepal.Length <- boxplot(iris$Sepal.Length ~ iris$Species) bp.Sepal.Length class(bp.Sepal.Length) attributes(bp.Sepal.Length) str(bp.Sepal.Length) bp.Sepal.Length[[1]] bp.Sepal.Length[[1]][1,] bp.Sepal.Length[[2]]