3.7 Graficación

La comunicación visual siempre será un recurso muy importante para presentar y aclarar la información con la que se esta trabajando así como los resultados obtenidos. R cuenta con una gran cantidad de funciones para crear elementos gráficos, principalmente en el ámbito estadístico, a partir de ciertas estructuras u objetos, las cuales se pueden personalizar y dar un mejor formato a gusto del programador.

En esta sección sólo se verán algunas funciones y estrategias para crear objetos gráficos usando las funciones que proporciona R por defecto, así como funciones de ciertos paquetes a excepción de paquetes y funciones relacionados con ggplot.

Una de las funciones más importantes es la función plot(), la cual es una función genérica por lo que dependiendo del tipo de objeto u objetos que se den como parámetros se comporta de manera distinta, esta función devolverá un gráfico relacionando dos variables (\(x\) y \(y\)) en un plano cartesiano. Tómese como ejemplo los datos pressure del paquete datasets. ¿Qué dice la documentación acerca de estos datos?

head(pressure)
  temperature pressure
1           0   0.0002
2          20   0.0012
3          40   0.0060
4          60   0.0300
5          80   0.0900
6         100   0.2700
plot(pressure)

El anterior gráfico también pudo obtenerse especificando lo que se considerará como variable \(x\) y \(y\) o dando una formula:

  • plot(pressure$temperature, pressure$pressure)
  • plot(pressure ~ temperature, data=pressure)

La anterior gráfica contiene muchos elementos gráficos, como títulos para los ejes y hasta los propios ejes, además las observaciones en los datos son dibujados como circunferencias. Véase en la siguiente gráfica que se puede modificar todo esto y agregar unos cuantos elementos gráficos más

plot(pressure ~ temperature, data=pressure,
     main = "Gráfico de dispersión y Lineas: Presión VS Temperatura", # Título principal
     col.main = "#0e608f", # Color para el título
     sub="Ejemplo 1", # Sub título
     col.sub= "grey50", # Color para el sub título
     xlab="Temperatura", # Eje x
     ylab="Presión", # Eje y
     col.lab = "#284c73", #Color para los nombres dados en los ejes
     col.axis = "#284c73", # Color para las anotaciones en los ejes
     fg = "#9fb3c9", # Color para otros elementos gráficos como los ejes
     type = "o", # Tipo de gráfico
     pch= 24, # símbolo para dibujar las observaciones
     col= "#0b3666",# Color para los anteriores símbolos y lineas
     bg= "#12b587", # Color de relleno de los anteriores elementos
     lty = 3, #Tipo de líneas
     lwd = 2, # Ancho de las líneas
     cex.main = 1.3, # Tamaño para el título
     cex.sub = .8, # Tamaño para el sub título
     cex.lab = 1.1, # Tamaño para los títulos en los ejes
     cex.axis = .8 # Tamaño para los ejes
     #cex haría proporcional el tamaño en todo.
     )

También pueden eliminarse los ejes y el marco

plot(pressure ~ temperature, data=pressure,
     main = "Gráfico de dispersión y Lineas: Presión VS Temperatura", # Título principal
     col.main = "#0e608f", # Color para el título
     sub="Ejemplo 1", # Sub título
     col.sub= "grey50", # Color para el sub título
     axes = FALSE,  #Eliminando ejes
     xlab="Temperatura", # Eje x
     ylab="Presión", # Eje y
     col.lab = "#284c73", #Color para los nombres dados en los ejes
     type = "o", # Tipo de gráfico
     pch= 24, # símbolo para dibujar las observaciones
     col= "#0b3666",# Color para los anteriores símbolos y lineas
     bg= "#12b587", # Color de relleno de los anteriores elementos
     lty = 3, #Tipo de líneas
     lwd = 2, # Ancho de las líneas
     cex.main = 1.3, # Tamaño para el título
     cex.sub = .8, # Tamaño para el sub título
     cex.lab = 1.1 # Tamaño para los títulos en los ejes
     )

Para solo eliminar el marco se puede usar frame=FALSE y para eliminar alguno de los ejes con xaxt="n" o yaxt="n". Aún se puede dar una mejor presentación modificando el tipo de fuente

plot(pressure ~ temperature, data=pressure,
     main = "Gráfico de dispersión y Lineas: Presión VS Temperatura", # Título principal
     col.main = "#0e608f", # Color para el título
     sub="Ejemplo 1", # Sub título
     col.sub= "grey50", # Color para el sub título
     xlab="Temperatura", # Eje x
     ylab="Presión", # Eje y
     col.lab = "#284c73", #Color para los nombres dados en los ejes
     col.axis = "#284c73", # Color para las anotaciones en los ejes
     fg = "#9fb3c9", # Color para otros elementos gráficos como los ejes
     type = "o", # Tipo de gráfico
     pch= 24, # símbolo para dibujar las observaciones
     col= "#0b3666",# Color para los anteriores símbolos y lineas
     bg= "#12b587", # Color de relleno de los anteriores elementos
     lty = 3, #Tipo de líneas
     lwd = 2, # Ancho de las líneas
     cex.main = 1.3, # Tamaño para el título
     cex.sub = .8, # Tamaño para el sub título
     cex.lab = 1.1, # Tamaño para los títulos en los ejes
     cex.axis = .8, # Tamaño para los ejes
     font.axis = 1, # Formato para los ejes
     font.lab = 3, # Formato para los títulos en los ejes
     font.main = 4, # Formato para el título
     font.sub = 3, # Formato para el sub título
     family = "Fira Sans Condensed"
     )

Muchos de los argumentos anteriores no son específicamente de la función plot(), ya que dicha función solo solicita la información para los ejes \(x\) y \(y\) y lo demás es opcional mediante el argumento ... en el cual se pueden agregar opciones de texto y parámetros gráficos.

De los anteriores las opciones de texto son los parámetros main, sub, xlab y ylab. El tipo de gráfico no es exclusivamente un graphical parameter para todas las gráficas, si no que es para la función plot() en general. Los demás argumentos son graphical parameters los cuales pueden ser usados en otros tipos de gráficos.

La gráfica se ve bien aunque se puede mejorar el aspecto de los ejes con la función axis(). Para usar la función axis primero se deben eliminar los ejes.

plot(pressure ~ temperature, data=pressure,
     main = "Gráfico de dispersión y Lineas: Presión VS Temperatura", # Título principal
     col.main = "#0e608f", # Color para el título
     sub="Ejemplo 1", # Sub título
     col.sub= "grey50", # Color para el sub título
     xlab="Temperatura", # Eje x
     ylab="Presión", # Eje y
     col.lab = "#284c73", #Color para los nombres dados en los ejes
     type = "o", # Tipo de gráfico
     pch= 24, # símbolo para dibujar las observaciones
     col= "#0b3666",# Color para los anteriores símbolos y lineas
     bg= "#12b587", # Color de relleno de los anteriores elementos
     lty = 3, #Tipo de líneas
     lwd = 2, # Ancho de las líneas
     cex.main = 1.3, # Tamaño para el título
     cex.sub = .8, # Tamaño para el sub título
     cex.lab = 1.1, # Tamaño para los títulos en los ejes
     font.lab = 3, # Formato para los títulos en los ejes
     font.main = 4, # Formato para el título
     font.sub = 3, # Formato para el sub título
     family = "Fira Sans Condensed",
     axes=FALSE
     )
axis(side = 1, #Indicando el eje al que se le aplicará diseño 
     at = c(-15,seq(0, 360, 45), 380), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0, 360, 45), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -40,# Coordenada para indicar donde se intersecta con el otro eje
     las = 0, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9",
     cex.axis = .8,
     font.axis = 1,
     family = "Fira Sans Condensed"
    )
axis(side = 2, #Indicando el eje al que se le aplicará diseño 
     at = c(-40, seq(0,810, 162), 840), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0,810, 162), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -15,# Coordenada para indicar donde se intersecta con el otro eje
     las = 2, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9",
     cex.axis = .8,
     font.axis = 1,
     family = "Fira Sans Condensed"
    )

Para aclarar, el argumento side hace referencia al eje que se esta modificando, 1-below, 2-left, 3-above y 4-right. La función axis tiene más argumentos como lyt para indicar el tipo de línea sobre el eje y col para el color del eje. ¿Qué pasa cuando en tck se da un valor negativo?

Ahora, si se desea agregar texto en la gráfica se puede usar la función text()

plot(pressure ~ temperature, data=pressure,
     main = "Gráfico de dispersión y Lineas: Presión VS Temperatura", # Título principal
     col.main = "#0e608f", # Color para el título
     sub="Ejemplo 1", # Sub título
     col.sub= "grey50", # Color para el sub título
     xlab="Temperatura", # Eje x
     ylab="Presión", # Eje y
     col.lab = "#284c73", #Color para los nombres dados en los ejes
     type = "o", # Tipo de gráfico
     pch= 24, # símbolo para dibujar las observaciones
     col= "#0b3666",# Color para los anteriores símbolos y lineas
     bg= "#12b587", # Color de relleno de los anteriores elementos
     lty = 3, #Tipo de líneas
     lwd = 2, # Ancho de las líneas
     cex.main = 1.3, # Tamaño para el título
     cex.sub = .8, # Tamaño para el sub título
     cex.lab = 1.1, # Tamaño para los títulos en los ejes
     font.lab = 3, # Formato para los títulos en los ejes
     font.main = 4, # Formato para el título
     font.sub = 3, # Formato para el sub título
     family = "Fira Sans Condensed",
     axes=FALSE
     )
axis(side = 1, #Indicando el eje al que se le aplicará diseño 
     at = c(-15,seq(0, 360, 45), 380), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0, 360, 45), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -40,# Coordenada para indicar donde se intersecta con el otro eje
     las = 0, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9",
     cex.axis = .8,
     font.axis = 1,
     family = "Fira Sans Condensed"
    )
axis(side = 2, #Indicando el eje al que se le aplicará diseño 
     at = c(-40, seq(0,810, 162), 840), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0,810, 162), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -15,# Coordenada para indicar donde se intersecta con el otro eje
     las = 2, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9",
     cex.axis = .8,
     font.axis = 1,
     family = "Fira Sans Condensed"
    )
text(270,810, #Posición para el texto
     "Presión máxima",
     family = "Fira Sans Condensed",
     cex = .8,
     font = 3,
     col = "#7d522a"
     )

La función tex() tiene otro argumento, pos, que modifican la posición del texto de acuerdo a las coordenadas dadas. Con la función mtext() se puede modificar el título de los ejes o mejor dicho en cada margen de la gráfica con la ventaja de manipular el margen entre los ejes y los correspondientes títulos.

plot(pressure ~ temperature, data=pressure,
     main = "Gráfico de dispersión y Lineas: Presión VS Temperatura", # Título principal
     col.main = "#0e608f", # Color para el título
     sub="Ejemplo 1", # Sub título
     col.sub= "grey50", # Color para el sub título
     xlab=NA,
     ylab=NA,
     type = "o", # Tipo de gráfico
     pch= 24, # símbolo para dibujar las observaciones
     col= "#0b3666",# Color para los anteriores símbolos y lineas
     bg= "#12b587", # Color de relleno de los anteriores elementos
     lty = 3, #Tipo de líneas
     lwd = 2, # Ancho de las líneas
     cex.main = 1.3, # Tamaño para el título
     cex.sub = .8, # Tamaño para el sub título
     font.main = 4, # Formato para el título
     font.sub = 3, # Formato para el sub título
     family = "Fira Sans Condensed",
     axes=FALSE
     )
axis(side = 1, #Indicando el eje al que se le aplicará diseño 
     at = c(-15,seq(0, 360, 45), 380), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0, 360, 45), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -40,# Coordenada para indicar donde se intersecta con el otro eje
     las = 0, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9",
     cex.axis = .8,
     font.axis = 1,
     family = "Fira Sans Condensed"
    )
axis(side = 2, #Indicando el eje al que se le aplicará diseño 
     at = c(-40, seq(0,810, 162), 840), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0,810, 162), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -15,# Coordenada para indicar donde se intersecta con el otro eje
     las = 2, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9",
     cex.axis = .8,
     font.axis = 1,
     family = "Fira Sans Condensed"
    )
text(270,810, #Posición para el texto
     "Presión máxima",
     family = "Fira Sans Condensed",
     cex = .8,
     font = 3,
     col = "#7d522a"
     )
mtext(side = 1,"Temperatura", 
      line=2.4,
      family = "Fira Sans Condensed",
      cex= 1.1,
      col = "#284c73",
      font= 3
      )
mtext(side = 2, #Al igual que con axis
      "Presión", 
      line=2.4, #Agregar margen
      family = "Fira Sans Condensed",
      cex= 1.1,
      col= "#284c73",
      font= 3
      )

Ahora, se desearía que la etiqueta de “Presión máxima” apuntará hacia el valor máximo con una flecha, además de agregar lineas para ubicar mejor las proyecciones en los ejes de dicho valor. Esto se puede lograr con las funciones arrow() y abline()

plot(pressure ~ temperature, data=pressure,
     main = "Gráfico de dispersión y Lineas: Presión VS Temperatura", # Título principal
     col.main = "#0e608f", # Color para el título
     sub="Ejemplo 1", # Sub título
     col.sub= "grey50", # Color para el sub título
     xlab=NA,
     ylab=NA,
     type = "o", # Tipo de gráfico
     pch= 24, # símbolo para dibujar las observaciones
     col= "#0b3666",# Color para los anteriores símbolos y lineas
     bg= "#12b587", # Color de relleno de los anteriores elementos
     lty = 3, #Tipo de líneas
     lwd = 2, # Ancho de las líneas
     cex.main = 1.3, # Tamaño para el título
     cex.sub = .8, # Tamaño para el sub título
     font.main = 4, # Formato para el título
     font.sub = 3, # Formato para el sub título
     family = "Fira Sans Condensed",
     axes=FALSE
     )
axis(side = 1, #Indicando el eje al que se le aplicará diseño 
     at = c(-15,seq(0, 360, 45), 380), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0, 360, 45), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -40,# Coordenada para indicar donde se intersecta con el otro eje
     las = 0, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9",
     cex.axis = .8,
     font.axis = 1,
     family = "Fira Sans Condensed"
    )
axis(side = 2, #Indicando el eje al que se le aplicará diseño 
     at = c(-40, seq(0,810, 162), 840), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0,810, 162), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -15,# Coordenada para indicar donde se intersecta con el otro eje
     las = 2, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9",
     cex.axis = .8,
     font.axis = 1,
     family = "Fira Sans Condensed"
    )
text(270,810, #Posición para el texto
     "Presión máxima",
     family = "Fira Sans Condensed",
     cex = .8,
     font = 3,
     col = "#7d522a",
     pos = 2 # Se coloca la etiqueta a la izquierda de la posición dada.
     )
mtext(side = 1,"Temperatura", 
      line=2.4,
      family = "Fira Sans Condensed",
      cex= 1.1,
      col = "#284c73",
      font= 3
      )
mtext(side = 2, #Al igual que con axis
      "Presión", 
      line=2.4, #Agregar margen
      family = "Fira Sans Condensed",
      cex= 1.1,
      col= "#284c73",
      font= 3
      )
arrows(270,810, #Posición de inicio
      max(pressure$temperature)-5, max(pressure$pressure),  #Posición de término
      col = "grey50",
      lwd = 1.2 #Ancho de la línea
      )
abline(h = max(pressure$pressure), #h es especial para líneas horizontales
       col = "gray73",
       lty = 3)
abline(v = max(pressure$temperature),#v es especial para líneas horizontales
       col = "gray73",
       lty = 3) 

A la función abline() también se le puede dar la información en la forma \(ax+b\) donde el argumento a sirve para establecer la pendiente y b para el intercepto. Véase que las rectas dibujadas con la función abline() cubren todo el rango de ambos ejes y en este caso se desea que estas terminen cuando lleguen a la coordenada específica, para eso se utilizará la función segments() donde sus argumentos indican las coordenadas de inicio y de final. Además el diseño de la flecha puede mejorar con shape::Arrows.

plot(pressure ~ temperature, data=pressure,
     main = "Gráfico de dispersión y Lineas: Presión VS Temperatura", # Título principal
     col.main = "#0e608f", # Color para el título
     sub="Ejemplo 1", # Sub título
     col.sub= "grey50", # Color para el sub título
     xlab=NA,
     ylab=NA,
     type = "o", # Tipo de gráfico
     pch= 24, # símbolo para dibujar las observaciones
     col= "#0b3666",# Color para los anteriores símbolos y lineas
     bg= "#12b587", # Color de relleno de los anteriores elementos
     lty = 3, #Tipo de líneas
     lwd = 2, # Ancho de las líneas
     cex.main = 1.3, # Tamaño para el título
     cex.sub = .8, # Tamaño para el sub título
     font.main = 4, # Formato para el título
     font.sub = 3, # Formato para el sub título
     family = "Fira Sans Condensed",
     axes=FALSE
     )
axis(side = 1, #Indicando el eje al que se le aplicará diseño 
     at = c(-15,seq(0, 360, 45), 380), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0, 360, 45), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -40,# Coordenada para indicar donde se intersecta con el otro eje
     las = 0, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9",
     cex.axis = .8,
     font.axis = 1,
     family = "Fira Sans Condensed"
    )
axis(side = 2, #Indicando el eje al que se le aplicará diseño 
     at = c(-40, seq(0,810, 162), 840), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0,810, 162), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -15,# Coordenada para indicar donde se intersecta con el otro eje
     las = 2, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9",
     cex.axis = .8,
     font.axis = 1,
     family = "Fira Sans Condensed"
    )
text(270,648, #Posición para el texto
     "Presión máxima",
     family = "Fira Sans Condensed",
     cex = .8,
     font = 3,
     col = "#7d522a",
     pos = 2 # Se coloca la etiqueta a la izquierda de la posición dada.
     )
mtext(side = 1,"Temperatura", 
      line=2.4,
      family = "Fira Sans Condensed",
      cex= 1.1,
      col = "#284c73",
      font= 3
      )
mtext(side = 2, #Al igual que con axis
      "Presión", 
      line=2.4, #Agregar margen
      family = "Fira Sans Condensed",
      cex= 1.1,
      col= "#284c73",
      font= 3
      )
Arrows(270,648, #Posición de inicio
      max(pressure$temperature), max(pressure$pressure),  #Posición de término
      arr.type="triangle", #Tipo de flecha
      arr.adj = 2, #Ajuste para que la punta de la flecha toque el punto seleccionado
      # arr.width=0.5, #Ancho de flecha
      arr.col = "gray47",#color de la flecha
      col = "grey50",
      lwd = 1.2
      )
segments(max(pressure$temperature), -40, #Coordenadas del primer punto
         max(pressure$temperature), max(pressure$pressure), #Coordenadas del segundo punto
       col = "gray73",
       lty = 3)
segments(-15, max(pressure$pressure), max(pressure$temperature), max(pressure$pressure),
       col = "gray73",
       lty = 3) 

Todos los parámetros gráficos se podrían haber incluido directamente con la función par(). En el siguiente ejemplo se ve como dicha función ahorra código. Hay que tener en cuenta que aveces es bueno hacer una copia donde no se tengan los parámetros gráficos alterados, esto guardando el estado actual de estos: par_default <- par()y después llamando par(par_default).

par(col.main = "#0e608f",
    col.sub= "grey50",
    font.main = 4,
    font.sub = 3,
    family = "Fira Sans Condensed",
    font.axis = 1,
    cex.axis = .8
    )
plot(pressure ~ temperature, data=pressure,
     main = "Gráfico de dispersión y Lineas: Presión VS Temperatura", # Título principal
     sub="Ejemplo 1", # Sub título
     xlab=NA, ylab=NA,
     type = "o", # Tipo de gráfico
     pch= 24, # símbolo para dibujar las observaciones
     col= "#0b3666",# Color para los anteriores símbolos y lineas
     bg= "#12b587", # Color de relleno de los anteriores elementos
     lty = 3, #Tipo de líneas
     lwd = 2, # Ancho de las líneas
     cex.main = 1.3, # Tamaño para el título
     cex.sub = .8, # Tamaño para el sub título
     axes=FALSE
     )
axis(side = 1, #Indicando el eje al que se le aplicará diseño 
     at = c(-15,seq(0, 360, 45), 380), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0, 360, 45), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -40,# Coordenada para indicar donde se intersecta con el otro eje
     las = 0, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9" #Color de los ticks y el marco de los ejes
    )
axis(side = 2, #Indicando el eje al que se le aplicará diseño 
     at = c(-40, seq(0,810, 162), 840), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0,810, 162), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -15,# Coordenada para indicar donde se intersecta con el otro eje
     las = 2, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9" #Color de los ticks y el marco de los ejes
    )
text(270,648, #Posición para el texto
     "Presión máxima",
     cex = .8,
     font = 3,
     col = "#7d522a",
     pos = 2 # Se coloca la etiqueta a la izquierda de la posición dada.
     )
mtext(side = 1,"Temperatura", 
      line=2.4,
      cex= 1.1,
      col = "#284c73",
      font= 3
      )
mtext(side = 2, #Al igual que con axis
      "Presión", 
      line=2.4, #Agregar margen
      cex= 1.1,
      col= "#284c73",
      font= 3
      )
Arrows(270,648, #Posición de inicio
      max(pressure$temperature), max(pressure$pressure),  #Posición de término
      arr.type="triangle", #Tipo de flecha
      arr.adj = 2, #Ajuste para que la punta de la flecha toque el punto seleccionado
      # arr.width=0.5, #Ancho de flecha
      arr.col = "gray47",#color de la flecha
      col = "grey50",
      lwd = 1.2
      )
segments(max(pressure$temperature), -40, #Coordenadas del primer punto
         max(pressure$temperature), max(pressure$pressure), #Coordenadas del segundo punto
       col = "gray73",
       lty = 3)
segments(-15, max(pressure$pressure), max(pressure$temperature), max(pressure$pressure),
       col = "gray73",
       lty = 3) 

Se puede utilizar la función par() para algunas características especiales como cambiar el color de fondo (background) de la gráfica con bg

par(bg="#daeff5",
    col.main = "#0e608f",
    col.sub= "grey50",
    font.main = 4,
    font.sub = 3,
    family = "Fira Sans Condensed",
    font.axis = 1,
    cex.axis = .8
    )
plot(pressure ~ temperature, data=pressure,
     main = "Gráfico de dispersión y Lineas: Presión VS Temperatura", # Título principal
     sub="Ejemplo 1", # Sub título
     xlab=NA, ylab=NA,
     type = "o", # Tipo de gráfico
     pch= 24, # símbolo para dibujar las observaciones
     col= "#0b3666",# Color para los anteriores símbolos y lineas
     bg= "#12b587", # Color de relleno de los anteriores elementos
     lty = 3, #Tipo de líneas
     lwd = 2, # Ancho de las líneas
     cex.main = 1.3, # Tamaño para el título
     cex.sub = .8, # Tamaño para el sub título
     axes=FALSE
     )
axis(side = 1, #Indicando el eje al que se le aplicará diseño 
     at = c(-15,seq(0, 360, 45), 380), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0, 360, 45), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -40,# Coordenada para indicar donde se intersecta con el otro eje
     las = 0, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9" #Color de los ticks y el marco de los ejes
    )
axis(side = 2, #Indicando el eje al que se le aplicará diseño 
     at = c(-40, seq(0,810, 162), 840), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0,810, 162), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -15,# Coordenada para indicar donde se intersecta con el otro eje
     las = 2, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9" #Color de los ticks y el marco de los ejes
    )
text(270,648, #Posición para el texto
     "Presión máxima",
     cex = .8,
     font = 3,
     col = "#7d522a",
     pos = 2 # Se coloca la etiqueta a la izquierda de la posición dada.
     )
mtext(side = 1,"Temperatura", 
      line=2.4,
      cex= 1.1,
      col = "#284c73",
      font= 3
      )
mtext(side = 2, #Al igual que con axis
      "Presión", 
      line=2.4, #Agregar margen
      cex= 1.1,
      col= "#284c73",
      font= 3
      )
Arrows(270,648, #Posición de inicio
      max(pressure$temperature), max(pressure$pressure),  #Posición de término
      arr.type="triangle", #Tipo de flecha
      arr.adj = 2, #Ajuste para que la punta de la flecha toque el punto seleccionado
      # arr.width=0.5, #Ancho de flecha
      arr.col = "gray47",#color de la flecha
      col = "grey50",
      lwd = 1.2
      )
segments(max(pressure$temperature), -40, #Coordenadas del primer punto
         max(pressure$temperature), max(pressure$pressure), #Coordenadas del segundo punto
       col = "gray73",
       lty = 3)
segments(-15, max(pressure$pressure), max(pressure$temperature), max(pressure$pressure),
       col = "gray73",
       lty = 3) 

Si se desea solo colorear el fondo del plano coordenado, véase el ejemplo que se da en el siguiente link.

También se pueden crear matrices de gráficas, esto gracias al parámetro mfrow

par(mfrow=c(1,2), oma = c(0, 0, 2, 0))
par(bg="#daeff5",
    col.sub= "grey50",
    font.main = 4,
    font.sub = 3,
    family = "Fira Sans Condensed",
    font.axis = 1,
    cex.axis = .8
    )
plot(pressure ~ temperature, data=pressure,
     sub="Ejemplo 1", # Sub título
     xlab=NA, ylab=NA,
     type = "o", # Tipo de gráfico
     pch= 24, # símbolo para dibujar las observaciones
     col= "#0b3666",# Color para los anteriores símbolos y lineas
     bg= "#12b587", # Color de relleno de los anteriores elementos
     lty = 3, #Tipo de líneas
     lwd = 2, # Ancho de las líneas
     cex.sub = .8, # Tamaño para el sub título
     axes=FALSE
     )
axis(side = 1, #Indicando el eje al que se le aplicará diseño 
     at = c(-15,seq(0, 360, 45), 380), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0, 360, 45), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -40,# Coordenada para indicar donde se intersecta con el otro eje
     las = 0, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9" #Color de los ticks y el marco de los ejes
    )
axis(side = 2, #Indicando el eje al que se le aplicará diseño 
     at = c(-40, seq(0,810, 162), 840), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0,810, 162), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -15,# Coordenada para indicar donde se intersecta con el otro eje
     las = 2, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9" #Color de los ticks y el marco de los ejes
    )
text(270,648, #Posición para el texto
     "Presión máxima",
     cex = .8,
     font = 3,
     col = "#7d522a",
     pos = 2 # Se coloca la etiqueta a la izquierda de la posición dada.
     )
mtext(side = 1,"Temperatura", 
      line=2.4,
      cex= 1.1,
      col = "#284c73",
      font= 3
      )
mtext(side = 2, #Al igual que con axis
      "Presión", 
      line=2.4, #Agregar margen
      cex= 1.1,
      col= "#284c73",
      font= 3
      )
Arrows(270,648, #Posición de inicio
      max(pressure$temperature), max(pressure$pressure),  #Posición de término
      arr.type="triangle", #Tipo de flecha
      arr.adj = 2, #Ajuste para que la punta de la flecha toque el punto seleccionado
      # arr.width=0.5, #Ancho de flecha
      arr.col = "gray47",#color de la flecha
      col = "grey50",
      lwd = 1.2
      )
segments(max(pressure$temperature), -40, #Coordenadas del primer punto
         max(pressure$temperature), max(pressure$pressure), #Coordenadas del segundo punto
       col = "gray73",
       lty = 3)
segments(-15, max(pressure$pressure), max(pressure$temperature), max(pressure$pressure),
       col = "gray73",
       lty = 3) 

plot(pressure ~ temperature, data=pressure,
     sub="Ejemplo 1", # Sub título
     xlab=NA, ylab=NA,
     type = "o", # Tipo de gráfico
     pch= 24, # símbolo para dibujar las observaciones
     col= "#0b3666",# Color para los anteriores símbolos y lineas
     bg= "#12b587", # Color de relleno de los anteriores elementos
     lty = 3, #Tipo de líneas
     lwd = 2, # Ancho de las líneas
     cex.sub = .8, # Tamaño para el sub título
     axes=FALSE
     )
axis(side = 1, #Indicando el eje al que se le aplicará diseño 
     at = c(-15,seq(0, 360, 45), 380), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0, 360, 45), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -40,# Coordenada para indicar donde se intersecta con el otro eje
     las = 0, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9" #Color de los ticks y el marco de los ejes
    )
axis(side = 2, #Indicando el eje al que se le aplicará diseño 
     at = c(-40, seq(0,810, 162), 840), #Se indica donde se darán las etiquetas
     labels = c(NA, seq(0,810, 162), NA), # Se dan explícitamente las anotaciones en los ejes (en los tickmarks)
     pos = -15,# Coordenada para indicar donde se intersecta con el otro eje
     las = 2, # 0 para un eje paralelo y 2 para uno perpendicular
     tck = 0.03, # Ajuste de longitud de los ticks.
     col.axis = "#284c73",
     fg = "#9fb3c9" #Color de los ticks y el marco de los ejes
    )
text(270,648, #Posición para el texto
     "Presión máxima",
     cex = .8,
     font = 3,
     col = "#7d522a",
     pos = 2 # Se coloca la etiqueta a la izquierda de la posición dada.
     )
mtext(side = 1,"Temperatura", 
      line=2.4,
      cex= 1.1,
      col = "#284c73",
      font= 3
      )
mtext(side = 2, #Al igual que con axis
      "Presión", 
      line=2.4, #Agregar margen
      cex= 1.1,
      col= "#284c73",
      font= 3
      )
Arrows(270,648, #Posición de inicio
      max(pressure$temperature), max(pressure$pressure),  #Posición de término
      arr.type="triangle", #Tipo de flecha
      arr.adj = 2, #Ajuste para que la punta de la flecha toque el punto seleccionado
      # arr.width=0.5, #Ancho de flecha
      arr.col = "gray47",#color de la flecha
      col = "grey50",
      lwd = 1.2
      )
segments(max(pressure$temperature), -40, #Coordenadas del primer punto
         max(pressure$temperature), max(pressure$pressure), #Coordenadas del segundo punto
       col = "gray73",
       lty = 3)
segments(-15, max(pressure$pressure), max(pressure$temperature), max(pressure$pressure),
       col = "gray73",
       lty = 3) 

mtext("Gráfico de dispersión y Lineas: Presión VS Temperatura", outer = TRUE, cex= 1.3,col = "#0e608f",font = 4 )

El parámetro oma es para modificar el margen exterior de la gráfica. Puede verse más de esto y del argumento mar en los siguientes enlaces:

Finalmente, un conjunto de funciones comunes para crear una matriz de dispersión

par(bg = "#e3e9ff", font.main = 4,
    font.sub = 3,
    family = "Fira Sans Condensed",
    font.axis = 1,
    cex.axis = .8)
pairs(iris, col = c("#865fd4", "#b34769", "#a19f4c")[ifelse(iris$Species=="setosa", yes = 1, no = ifelse(iris$Species=="versicolor", yes = 2, no = 3))])

  • Histograma, Gráfico de densidad, Pie Chart y Boxplot
set.seed(20)
datos_fic <- c(sample(seq(1,2,by = 0.01), replace = T, size = 1000))
datos_fic_1 <- sample(1:5, replace = T, size = 100)
par(mfrow=c(2,2), bg = "#e3e9ff", font.main = 4,
    font.sub = 3,
    family = "Fira Sans Condensed",
    font.axis = 1,
    cex.axis = .8)
hist(datos_fic, freq=TRUE, col = "#2241b5", ylab = "Frecuencia", main = "Histograma de datos_fic")
plot(density(datos_fic), col="#2241b5", main = "Densidad de datos_fic", xlab = "datos_fic", ylab = "Densidad")
pie(table(datos_fic_1), col=wes_palette("Rushmore1"), clockwise=TRUE, main = "Gráfico de pastel")
boxplot(iris$Sepal.Length~iris$Species, col = c("#865fd4", "#b34769", "#a19f4c"), xlab = "Especies", ylab = "Longitud del Sépalo", main = "Boxplots por especie")

3.7.0.1 Comentarios finales

  • Aún falta mucho por ver.
  • Existen paquetes especiales para obtener colores.
  • Se pueden agregar colores de tipo gradiente.
  • Se pueden crear mapas.
  • Existen muchas más gráficas estadísticas.
  • Se pueden crear gráficas en 3D.
  • Se pueden crear gráficas interactivas.
  • Se pueden crear animaciones.
  • investíguese el paquete manipulate para poder manipular las gráficas base de R de manera más interactiva.
  • Además de saber crear gráficas, hay que tener conocimiento sobre cuando y cuales usar.
  • Aquí se dejan algunos enlaces que pueden ser de interés:

Ejercicios

  1. Es algo tedioso estar copiando y pegando el mismo contenido para hacer una gráfica. Investiga una forma para guardar una gráfica como las vistas en esta sección como un objeto para usarlo posteriormente.

  2. Investiga como agregar una leyenda en la siguiente gráfica

x<-1:40; square = x^2; fourth = x^4
plot(x, square, type="b", col="#cc5252", xlab="x", ylab="y", pch=19)
lines(x, fourth, pch=19, col="#e0773f", type="b")

  1. Investiga la función expression() para agregar en la anterior gráfica las respectivas ecuaciones (\(y = x^2\), \(y = x^4\)).

  2. Crear una gráfica donde se tenga el histograma y la gráfica de densidad para el siguiente vector numérico: rnorm(1000, 5, 0.4).

  3. En la gráfica anterior, agrega con la función curve() la ecuación del ejercicio 50 con \(\mu = 5\) y \(\sigma = 0.4\)

  4. Se puede agregar texto en una gráfica con el estilo de Latex, es decir, en \(esta \ forma \ junto \ con \ ecuaciones \ como \sum_{x = 20}^{40}x^2\cdot\log(x)\). Lee el siguiente post y crea una gráfica agregando alguna ecuación en ella.

  5. Escribe el código necesario para crear la siguiente gráfica

  6. Escribe el código necesario para crear la siguiente gráfica. Hint: Utiliza alguna de las funciones que se explican en Low-level plotting functions: YaRrr! The Pirate’s Guide to R

  7. Utiliza la función curve para gráficar la función \(sin(x)\), \(cos(x)\) y \(tan(x)\) en una sola gráfica. El rango debe abarcar tanto números negativos como positivos.

  8. Con las funciones rect(), polygon() y symbol(), crea la siguiente gráfica.

  9. Crea una gráfica con las siguientes ecuaciones parámetricas con \(t\in[0,2\pi]\)

\[ \begin{split} x &= 16 cos^3(t)\\ y &= 13 cos(t)-5cos(2t)-2cos(3t)-cos(4t) \end{split} \]

  1. Grafica 1000 puntos con dos vectores de números pseudo aleatorios entre 0 y 1 y utiliza la función rainbow para otorgarles color.

  2. Crea una representación geométricas de la integral \(\int_0^\pi sen(x)dx\)

  3. Crea una gráfica del las funciones \(sen(x)\) y \(cos(x)\) agregando anotaciones cada \(\frac{\pi}{2}\) e indicando que ecuación corresponde a cada gráfica.

  4. Crea una gráfica para comparar las funciones \(sen(x)\), \(2sen(x)\) y \(sen(\frac{x}{2})\).

  5. Crea una representación geométrica de la función \(sen(x)\) y \(cos(x)\) en una circunferencia.


Referencias y bibliografía adicional

Wickham and Grolemund. 2017. R for Data Science. https://r4ds.had.co.nz Versión en español: https://es.r4ds.hadley.nz

Grolemund, Garrett.2014. Hands-On Programming with R. https://rstudio-education.github.io/hopr/

Mendoza, Vega. R para principiantes. https://bookdown.org/jboscomendoza/r-principiantes4/

Wickham and Grolemund. 2019. Advanced R. Second Edition. https://adv-r.hadley.nz

Chang, W. (2012). R graphics cookbook: practical recipes for visualizing data. " O’Reilly Media, Inc.".

Rahlf, T. (2019). Data Visualisation with R: 111 Examples. Springer Nature.

Murrell, P. (2018). R graphics. CRC Press.