\SweaveOpts{prefix.string=images/grafic} \subsection{Introdución} \begin{frame} \frametitle{Introducción} \begin {itemize} \item \R tiene grandes posibilidades para hacer gráficos. \begin{itemize} \item \texttt{demo(graphics)} \item \url{http://addictedtor.free.fr/graphiques} \end{itemize} \item Idea: la visualización es parte integral del análisis y la comunicación de los resultados \item Los gráficos deben ser en primer lugar \emph{estadísticos}. \item También pueden ser \emph{estéticos}. \end{itemize} \end{frame} \begin{frame} \frametitle{Tipos de funciones gráficas en \R} \begin {itemize} \item Funciones de alto nivel \begin{itemize} \item Permiten crear los gráficos básicos \item \Rfun{plot, hist, boxplot, pairs,...} \end{itemize} \item Funciones de bajo nivel \begin{itemize} \item Permiten modificar los gráficos creados \item \Rfun{points, lines, text, axis,...} \end{itemize} \item Gráficos \Rfun{Trellis}: Permiten describir situaciones complejas, a menudo multivariantes, con un sólo gráfico organizado en paneles. \end{itemize} \end{frame} \begin{frame} \frametitle{Los dispositivos gráficos} \begin {itemize} \item Cuando creamos un gráfico en \R dirigimos la salida hacia un \emph{dispositivo} o ``driver''. \begin{itemize} \item Por defecto es la pantalla. \item Hay muchos formatos disponibles: \Rfun{'postscript','pdf','png','jpeg','bmp',...} \end{itemize} \item La utilización de los distintos drivers aumenta la flexibilidad y potencia de \R \begin{itemize} \item Podemos crear gráficos de gran calidad, de manera automàtica. \item Podemos crear grandes cantidades de gráficos mediante scripts para tratamientos masivos de datos. \end{itemize} \end{itemize} \end{frame} \begin{frame} \frametitle{Los pasos para crear un gráfico} \begin {itemize} \item Una forma típica de crear gráficos puede ser: \begin{itemize} \item Llamar el driver hacia el que se dirigirá la salida \item Establecer los parámetros por defecto (Ajustes \emph{previos} al gráfico) \item Crear el gráfico utilizando funciones de alto nivel (Ajustes \emph{al crear} el gráfico) \item Modificar el gráfico con funciones de bajo nivel (Ajustes \emph{prosteriores} al gráfico) \item Restablecer los parámetros \item Cerrar el dispositivo de salida. \end{itemize} \end{itemize} \end{frame} \subsection{Instrucciones de alto nivel} \begin{frame}[fragile] \frametitle{\Rfun{plot()} y compañía} \begin{itemize} \item La instrucción básica para crear un gráfico es \Rfun{plot()} \item Se trata de una \emph{función genérica}: Al ser \R un lenguaje orientado a objetos el resultado de la funcion será diferente segun sobre que tipo de datos se aplique. <>= <>= # postcript("Ejemplo1.eps") # Para llamar al dispositivo postcript opt<-par(bg="lightyellow",mfrow=c(1,1)) # Ajustes previos barplot(VADeaths, beside = T, # col = c("lightblue", "mistyrose", "lightcyan", "lavender", "cornsilk"), col = c("blue", "pink", "cyan", "yellow", "red"), legend = rownames(VADeaths), ylim = c(0, 100)) title(main = "Death Rates in Virginia", font.main = 3) # Ajustes posteriores par(opt) # dev.off () # Para cerrar el dispositivo @ @ \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Ejemplo} {\small <>= <> @ } \end{frame} \subsection{Ajuste de parámetros} \begin{frame}[fragile] \frametitle{Ajustes previos al gráfico: \Rfun{par()}} \begin{itemize} \item La instrucción \Rfun{par()} permie establecer un grandísimo número de opciones gráficas (\Rfun{? par}) \item A diferencia de otros programas, muchos aspectos de configuración deben establecerse \emph{antes} de crear el gráfico. \item Las opciones deben restaurarse despues de su utilización %\begin{verbatim} <>= <>= library(DAAG) attach(elasticband) oldpar <- par(cex.main=1.5, mex=1.5, bg="lightblue") plot(distance~stretch) par(oldpar) # Restores the earlier settings detach(elasticband);detach(package:DAAG) @ @ %\end{verbatim} \end{itemize} \end{frame} \begin{frame}[fragile] <>= <> @ \end{frame} \begin{frame}[fragile] \frametitle{Ajustes al crear el gráfico} \begin{itemize} \item La mayoria de instrucciones admiten un numero mínimo de parámetros para definir cosas como el título (\Rfun{main}) o las etiquetas (\Rfun{xlab}, \Rfun{ylab}) <>= <>= library(DAAG) attach(elasticband) oldpar <- par(cex.main=1.5, mex=1.5) plot(distance~stretch,main="Analisis de elasticidad", xlab="Estiramiento", ylab="Distancia", sub ="Tomado de 'Using R...'", xlim=c(40,60), ylim=c(100,200)) par(oldpar) # Restores the earlier settings detach(elasticband);detach(package:DAAG) @ @ %\end{verbatim} \end{itemize} \end{frame} \begin{frame}[fragile] <>= <> @ \end{frame} \begin{frame}[fragile] \frametitle{Ajustes despues del gráfico: funciones de bajo nivel} \begin{itemize} \item Una vez dibujado el gráfico podemos añadirle lineas o texto facilmente. \Rfun{ylab}) <>= <>= library(DAAG) attach(elasticband) oldpar <- par(cex=1.5, mex=1.5) plot(distance~stretch,main="Analisis de elasticidad", xlab="Estiramiento", ylab="Distancia") abline(lm(distance~stretch)) text(stretch,distance, rownames(elasticband),pos=2,cex=0.8,col="red") par(oldpar) # Restores the earlier settings detach(elasticband);detach(package:DAAG) @ @ %\end{verbatim} \end{itemize} \end{frame} \begin{frame}[fragile] <>= <> @ \end{frame} \begin{frame}[fragile] \frametitle{Símbolos, colores y tamaños para los gráficos} <>= <>= # 3.3.1 Size, colour and choice of plotting symbol plot(1, 1, xlim=c(1, 7.5), ylim=c(0,5), type="n") # Do not plot points points(1:7, rep(4.5, 7), cex=1:7, col=1:7, pch=0:6) text(1:7,rep(3.5, 7), labels=paste(0:6), cex=1:7, col=1:7) points(1:7,rep(2,7), pch=(0:6)+7) # Plot symbols 7 to 13 text((1:7)+0.25, rep(2,7), paste((0:6)+7)) # Label with symbol number points(1:7,rep(1,7), pch=(0:6)+14) # Plot symbols 14 to 20 text((1:7)+0.25, rep(1,7), paste((0:6)+14)) # Labels with symbol number @ @ \end{frame} \begin{frame}[fragile] <>= <> @ \end{frame} \subection{Gráficos múltiples} \begin{frame}[fragile] \frametitle{Scatterplots matriciales con \texttt{pairs()}} <>= <>= library(MASS);data(hills) pairs(hills) detach(package:MASS) @ @ \end{frame} \begin{frame}[fragile] <>= <> @ \end{frame} \begin{frame}[fragile] \frametitle{Scatterplots matriciales panelados \texttt{pairs(, lower.panel(), upper.panel())}} <>= <>= panel.cor <- function(x, y, digits=2, prefix="", cex.cor) { usr <- par("usr"); on.exit(par(usr)) par(usr = c(0, 1, 0, 1)) r <- cor(x, y,use="complete.obs") txt <- format(c(r, 0.123456789), digits=digits)[1] txt <- paste(prefix, txt, sep="") if(missing(cex.cor)) cex <- 0.8/strwidth(txt) text(0.5, 0.5, txt, cex = cex * 0.5) } # pdf(file.path(resultsDir,"CorrelationPlots.raw.pdf")) pairs(hills,main="Correlation between genes (alls spots)", #upper.panel=panel.smooth, lower.panel=panel.cor) #dev.off() @ @ \end{frame} \begin{frame}[fragile] <>= <> @ \end{frame} \begin{frame}[fragile] \frametitle{Varios gráficos por pantalla} \begin{itemize} \item Probablemente las opciones más utilizadas sean \Rfun{mfrow()} y \Rfun{mfcol()} \item Permiten representar más de un gráfico por pantalla organizándolos por filas o columnas. <>= <>= library(MASS);attach(Animals) par(mfrow=c(2,2), pch=16) plot(body, brain) plot(sqrt(body), sqrt(brain)) plot((body)^0.1, (brain)^0.1) plot(log(body),log(brain)) par(mfrow=c(1,1), pch=1) mtext("Relación entre el peso del cuerpo y del cerebro",line=2) detach(Animals);detach(package:MASS) @ @ \end{itemize} \end{frame} \begin{frame}[fragile] <>= <> @ \end{frame} \subsection{Más ejemplos} \begin{frame}[fragile] \frametitle{Más ejemplos} \begin{itemize} \item La mejor forma de aprender a utilizar los parámetros es probando que efecto producen sobre los gráficos. \item Una buena fuente de ejemplos esta en la página web del libro ``\R graphics'' de Paul Murrell \url{http://www.stat.auckland.ac.nz/~paul/RGraphics/rgraphics.html} \item El codigo contenido en este script: \newline \url{http://www.stat.auckland.ac.nz/~paul/RGraphics/examples-stdplots.R} realiza los gráficos de la página siguiente. \end{itemize} \end{frame} \begin{frame}[fragile] <>= # # Comment: # # Examples of the use of standard high-level plotting functions. # # In each case, extra output is also added using low-level # plotting functions. # oldpar<-par(mfrow=c(3, 2)) # Scatterplot x <- c(0.5, 2, 4, 8, 12, 16) y1 <- c(1, 1.3, 1.9, 3.4, 3.9, 4.8) y2 <- c(4, .8, .5, .45, .4, .3) par(las=1, mar=c(4, 4, 2, 4)) plot.new() plot.window(range(x), c(0, 6)) lines(x, y1) lines(x, y2) points(x, y1, pch=16, cex=2) points(x, y2, pch=21, bg="white", cex=2) par(col="grey50", fg="grey50", col.axis="grey50") axis(1, at=seq(0, 16, 4)) axis(2, at=seq(0, 6, 2)) axis(4, at=seq(0, 6, 2)) box(bty="u") mtext("Travel Time (s)", side=1, line=2, cex=0.8) mtext("Responses per Travel", side=2, line=2, las=0, cex=0.8) mtext("Responses per Second", side=4, line=2, las=0, cex=0.8) text(4, 5, "Bird 131") par(mar=c(5.1, 4.1, 4.1, 2.1), col="black", fg="black", col.axis="black") # Histogram # Random data Y <- rnorm(50) # Make sure no Y exceed [-3.5, 3.5] Y[Y < -3.5 | Y > 3.5] <- NA x <- seq(-3.5, 3.5, .1) dn <- dnorm(x) par(mar=c(4.5, 4.1, 3.1, 0)) hist(Y, breaks=seq(-3.5, 3.5), ylim=c(0, 0.5), col="grey80", freq=FALSE) lines(x, dnorm(x), lwd=2) par(mar=c(5.1, 4.1, 4.1, 2.1)) # Barplot # Modified from example(barplot) par(mar=c(2, 3.1, 2, 2.1)) midpts <- barplot(VADeaths, col=grey(0.5 + 1:5/12), names=rep("", 4)) mtext(sub(" ", "\n", colnames(VADeaths)), at=midpts, side=1, line=0.5, cex=0.5) text(rep(midpts, each=5), apply(VADeaths, 2, cumsum) - VADeaths/2, VADeaths, col=rep(c("white", "black"), times=2:3, cex=0.8)) par(mar=c(5.1, 4.1, 4.1, 2.1)) # Boxplot # Modified example(boxplot) - itself from suggestion by Roger Bivand par(mar=c(3, 4.1, 2, 0)) boxplot(len ~ dose, data = ToothGrowth, boxwex = 0.25, at = 1:3 - 0.2, subset= supp == "VC", col="grey90", xlab="", ylab="tooth length", ylim=c(0,35)) mtext("Vitamin C dose (mg)", side=1, line=2.5, cex=0.8) boxplot(len ~ dose, data = ToothGrowth, add = TRUE, boxwex = 0.25, at = 1:3 + 0.2, subset= supp == "OJ", col="grey70") legend(1.5, 9, c("Ascorbic acid", "Orange juice"), bty="n", fill = c("grey90", "grey70")) par(mar=c(5.1, 4.1, 4.1, 2.1)) # Persp # Almost exactly example(persp) x <- seq(-10, 10, length= 30) y <- x f <- function(x,y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r } z <- outer(x, y, f) z[is.na(z)] <- 1 # 0.5 to include z axis label par(mar=c(0, 0.5, 0, 0), lwd=0.1) persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "grey80") par(mar=c(5.1, 4.1, 4.1, 2.1), lwd=1) # Piechart # Example 4 from help(pie) par(mar=c(0, 2, 1, 2), xpd=FALSE, cex=0.5) pie.sales <- c(0.12, 0.3, 0.26, 0.16, 0.04, 0.12) names(pie.sales) <- c("Blueberry", "Cherry", "Apple", "Boston Cream", "Other", "Vanilla") pie(pie.sales, col = gray(seq(0.4,1.0,length=6))) par<-oldpar @ \end{frame} \subsection{Identificación de puntos en la región gráfica} \begin{frame}[fragile] \frametitle{} \begin{itemize} \item \R permite una cierta interacción con interactuar con los gráficos en pantalla. \begin{itemize} \item \Rfun{identify()} Permite etiquetar puntos, colocando el cursor sobre ellos y haciendo un clic con el botón izquierdo. \item \Rfun{locate()} Permite obtener las coordenadas del punto, colocando el cursor sobre ellos y haciendo un clic con el botón izquierdo. \end{itemize} \item La interacción finaliza si se alcanza el total de puntos solicitados o se pulsa el botón derecho. \begin{verbatim} library(UsingR);attach(florida) plot(BUSH, BUCHANAN, xlab="Bush", ylab="Buchanan") identify(BUSH, BUCHANAN, County) locator() detach(florida);detach(package:UsingR) \end{verbatim} \end{itemize} \end{frame} \subsection{Graficos \Rfun{Trellis}} \begin{frame}[fragile] \frametitle{La libreria \Rfun{lattice}} \begin{itemize} \item El paquete \textsf{lattice} es muy útil para describir gráficamente datos multivariantes. \item La idea consiste en que el gráfico está formado por un cierto número de paneles. \item Normalmente cada uno de ellos corresponde a alguno de los valores de una variable que condiciona. \item Las funciones se escriben con la notación de la fórmula del modelo. \item En los gráficos univariantes como los histogramas, la variable respuesta, a la izquierda, se deja vacía. \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Un grafico Trellis básico} <>= library(MASS);library(lattice) print(histogram( ~ CW | sp, data = crabs)) detach(package:MASS);detach(package:lattice) @ \end{frame} \begin{frame}[fragile] \frametitle{Representación de una variable condicionada por los valores de otra} <>= library(MASS);library(lattice) print(bwplot( ~ CW | sp, data = crabs, layout = c(1, 2))) detach(package:MASS);detach(package:lattice) @ \end{frame} \begin{frame}[fragile] \frametitle{Notación de fórmula en gráficos Trellis} <>= library(MASS);library(lattice) print(bwplot(sex ~ CW | sp, data = crabs, layout = c(1, 2))) detach(package:MASS);detach(package:lattice) @ La última instrucción es muy interesante porque nos permite estudiar comparativamente el sexo separado por especies. \end{frame}