Visualización de Datos con R (ggplot)

Por Jose R. Zapata

Invítame a un Café

En base a las herramientas actuales para el desarrollo de proyectos y productos de Ciencia de datos y Machine Learning, se recomienda el uso de Python, sin embargo, R es una herramienta muy poderosa para el análisis de datos y la visualización de los mismos.

Puede aprender python en el curso de Ciencia de Datos con Python.

Gráficas Básicas con R

La Librería principal para realizar gráficas en R es ggplot2 la cual es una implementación de la gramática de gráficos de Wilkinson, ggplot fue creado por Hadley Wickham en 2005,

La función genérica para realizar gráficas básicas con R es plot()

# Demo de las posibilidades de gráficas básicas de R
demo(graphics)
 demo(graphics)
 ---- ~~~~~~~~

> #  Copyright (C) 1997-2009 The R Core Team
>
> require(datasets)

> require(grDevices); require(graphics)

> ## Here is some code which illustrates some of the differences between
> ## R and S graphics capabilities.  Note that colors are generally specified
> ## by a character string name (taken from the X11 rgb.txt file) and that line
> ## textures are given similarly.  The parameter "bg" sets the background
> ## parameter for the plot and there is also an "fg" parameter which sets
> ## the foreground color.
>
>
> x <- stats::rnorm(50)

> opar <- par(bg = "white")

> plot(x, ann = FALSE, type = "n")

> abline(h = 0, col = gray(.90))

> lines(x, col = "green4", lty = "dotted")

> points(x, bg = "limegreen", pch = 21)

> title(main = "Simple Use of Color In a Plot",
+       xlab = "Just a Whisper of a Label",
+       col.main = "blue", col.lab = gray(.8),
+       cex.main = 1.2, cex.lab = 1.0, font.main = 4, font.lab = 3)

> ## A little color wheel.  This code just plots equally spaced hues in
> ## a pie chart. If you have a cheap SVGA monitor (like me) you will
> ## probably find that numerically equispaced does not mean visually
> ## equispaced.  On my display at home, these colors tend to cluster at
> ## the RGB primaries.  On the other hand on the SGI Indy at work the
> ## effect is near perfect.
>
> par(bg = "gray")

> pie(rep(1,24), col = rainbow(24), radius = 0.9)

png

> title(main = "A Sample Color Wheel", cex.main = 1.4, font.main = 3)

> title(xlab = "(Use this as a test of monitor linearity)",
+       cex.lab = 0.8, font.lab = 3)

> ## We have already confessed to having these.  This is just showing off X11
> ## color names (and the example (from the postscript manual) is pretty "cute".
>
> 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 Cream")

> pie(pie.sales,
+     col = c("purple","violetred1","green3","cornsilk","cyan","white"))

png

> title(main = "January Pie Sales", cex.main = 1.8, font.main = 1)

> title(xlab = "(Don't try this at home kids)", cex.lab = 0.8, font.lab = 3)

> ## Boxplots:  I couldn't resist the capability for filling the "box".
> ## The use of color seems like a useful addition, it focuses attention
> ## on the central bulk of the data.
>
> par(bg="cornsilk")

> n <- 10

> g <- gl(n, 100, n*100)

> x <- rnorm(n*100) + sqrt(as.numeric(g))

> boxplot(split(x,g), col="lavender", notch=TRUE)

png

> title(main="Notched Boxplots", xlab="Group", font.main=4, font.lab=1)

> ## An example showing how to fill between curves.
>
> par(bg="white")

> n <- 100

> x <- c(0,cumsum(rnorm(n)))

> y <- c(0,cumsum(rnorm(n)))

> xx <- c(0:n, n:0)

> yy <- c(x, rev(y))

> plot(xx, yy, type="n", xlab="Time", ylab="Distance")

png

> polygon(xx, yy, col="gray")

> title("Distance Between Brownian Motions")

> ## Colored plot margins, axis labels and titles.  You do need to be
> ## careful with these kinds of effects. It's easy to go completely
> ## over the top and you can end up with your lunch all over the keyboard.
> ## On the other hand, my market research clients love it.
>
> x <- c(0.00, 0.40, 0.86, 0.85, 0.69, 0.48, 0.54, 1.09, 1.11, 1.73, 2.05, 2.02)

> par(bg="lightgray")

> plot(x, type="n", axes=FALSE, ann=FALSE)

png

> usr <- par("usr")

> rect(usr[1], usr[3], usr[2], usr[4], col="cornsilk", border="black")

> lines(x, col="blue")

> points(x, pch=21, bg="lightcyan", cex=1.25)

> axis(2, col.axis="blue", las=1)

> axis(1, at=1:12, lab=month.abb, col.axis="blue")

> box()

> title(main= "The Level of Interest in R", font.main=4, col.main="red")

> title(xlab= "1996", col.lab="red")

> ## A filled histogram, showing how to change the font used for the
> ## main title without changing the other annotation.
>
> par(bg="cornsilk")

> x <- rnorm(1000)

> hist(x, xlim=range(-4, 4, x), col="lavender", main="")

png

> title(main="1000 Normal Random Variates", font.main=3)

> ## A scatterplot matrix
> ## The good old Iris data (yet again)
>
> pairs(iris[1:4], main="Edgar Anderson's Iris Data", font.main=4, pch=19)

png

> pairs(iris[1:4], main="Edgar Anderson's Iris Data", pch=21,
+       bg = c("red", "green3", "blue")[unclass(iris$Species)])

png

> ## Contour plotting
> ## This produces a topographic map of one of Auckland's many volcanic "peaks".
>
> x <- 10*1:nrow(volcano)

> y <- 10*1:ncol(volcano)

> lev <- pretty(range(volcano), 10)

> par(bg = "lightcyan")

> pin <- par("pin")

> xdelta <- diff(range(x))

> ydelta <- diff(range(y))

> xscale <- pin[1]/xdelta

> yscale <- pin[2]/ydelta

> scale <- min(xscale, yscale)

> xadd <- 0.5*(pin[1]/scale - xdelta)

> yadd <- 0.5*(pin[2]/scale - ydelta)

> plot(numeric(0), numeric(0),
+      xlim = range(x)+c(-1,1)*xadd, ylim = range(y)+c(-1,1)*yadd,
+      type = "n", ann = FALSE)

png

> usr <- par("usr")

> rect(usr[1], usr[3], usr[2], usr[4], col="green3")

> contour(x, y, volcano, levels = lev, col="yellow", lty="solid", add=TRUE)

> box()

> title("A Topographic Map of Maunga Whau", font= 4)

> title(xlab = "Meters North", ylab = "Meters West", font= 3)

> mtext("10 Meter Contour Spacing", side=3, line=0.35, outer=FALSE,
+       at = mean(par("usr")[1:2]), cex=0.7, font=3)

> ## Conditioning plots
>
> par(bg="cornsilk")

> coplot(lat ~ long | depth, data = quakes, pch = 21, bg = "green3")

png

> par(opar)

png

# Ayuda de la función para hacer gráficos básicos en R
?plot

Scatter

# Gráfica scatter plot sencilla de una sola columna
plot(iris$Sepal.Length)

png

# Scatter Variable1 vs. Variable2
plot(iris$Sepal.Length, iris$Sepal.Width)

png

Agregando una tercera Caracteristica

Se puede agregar una tercera caractaristica que modifica el color de los puntos

plot(iris$Sepal.Length, iris$Sepal.Width, col=iris$Species)

png

Agregegar etiquetas y titulo

plot(iris$Petal.Length, iris$Petal.Width, col=iris$Species,
     xlab = 'Longitud del petalo', ylab = 'Ancho del pétalo') # agregando nombre de los ejes
title(main = 'IRIS', # Nombre Principal
      sub = 'Exploración de los pétalos según especie', # Subtitulo
      col.main = 'blue', col.sub = 'blue') #Colores del titulo principal y subtitulo

png

Grafico de Lineas

# Creando datos
nitrogeno1 <- c(-1.075103, 1.280028, 2.683602, 6.666022, 9.116407,
                9.343273, 10.664870,10.789350, 12.978650, 14.159840, 16.503100,
                17.095810, 17.329490, 18.393520,19.737110, 21.092610, 22.436250,
                23.544800, 24.827950, 25.769430, 26.559980,29.064630, 29.134650,
                31.338990, 31.450320, 31.669930, 32.029450, 33.159360, 39.492470,
                49.286340)
ganancia1 <- c(28.31418, 28.25424, 31.63590, 26.07938, 38.90268,
                 25.88322, 29.84876, 33.18449, 37.94326, 39.55208, 35.84804, 41.50167,
                 33.24588, 35.71353, 41.86831, 26.53296, 40.95675, 34.14026, 37.96503, 41.83494,
                 30.56075, 37.99969, 44.49413, 39.89654, 40.72090, 36.41778, 46.13874, 45.20830,
                 45.27624, 54.37569)
# Hacer un gráfico solo de linea
plot(nitrogeno1,ganancia1,type="l")

png

# Agregando las nombres de los ejes, el titulo de la Gráfica y los limites de los ejes
plot(nitrogeno1, ganancia1, type="l",
     col="blue", # Color de a linea
     xlab="Nitrógeno", # Nombre del eje x
     ylab="Ganancia", # Nombre del eje  y
     main="Ganancia vs Nitrógeno", # Titulo de la gráfica
     ylim=c(10,60)) # Limites del eje vertical

png

# Agregando las nombres de los ejes, el titulo de la gráfica y los limites de los ejes
# Agregando circulos a los puntos de los datos sobre la gráfica
plot(nitrogeno1, ganancia1,
     type="overplotted",pch=1, #Agregar puntos de los datos
     col="blue", # Color de a linea
     xlab="Nitrógeno", # Nombre del eje x
     ylab="Ganancia", # Nombre del eje  y
     main="Ganancia vs Nitrógeno", # Titulo de la gráfica
     ylim=c(10,60)) # Limites del eje vertical
Warning message in plot.xy(xy, type, ...):
“plot type 'overplotted' will be truncated to first character”

png

url <- "https://github.com/JoseRZapata/Data_analysis_notebooks/raw/main/data/datasets/eBayAuctions.xls"
download.file(url, destfile = "eBayAuctions.xls", mode = "wb")
# Importar libreria
library(readxl)

# Leer archivo de excel
ebay <-read_excel('eBayAuctions.xls',sheet=1)
class(ebay) # Tipos de datos del dataframe
str(ebay) #Estructura de los datos
tail(ebay) # filas finales del archivo
  1. 'tbl_df'
  2. 'tbl'
  3. 'data.frame'
tibble [1,972 × 8] (S3: tbl_df/tbl/data.frame)
 $ Category    : chr [1:1972] "Music/Movie/Game" "Music/Movie/Game" "Music/Movie/Game" "Music/Movie/Game" ...
 $ currency    : chr [1:1972] "US" "US" "US" "US" ...
 $ sellerRating: num [1:1972] 3249 3249 3249 3249 3249 ...
 $ Duration    : num [1:1972] 5 5 5 5 5 5 5 5 5 5 ...
 $ endDay      : chr [1:1972] "Mon" "Mon" "Mon" "Mon" ...
 $ ClosePrice  : num [1:1972] 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 ...
 $ OpenPrice   : num [1:1972] 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 ...
 $ Competitive?: num [1:1972] 0 0 0 0 0 0 0 0 0 0 ...
A tibble: 6 × 8
CategorycurrencysellerRatingDurationendDayClosePriceOpenPriceCompetitive?
<chr><chr><dbl><dbl><chr><dbl><dbl><dbl>
AutomotiveUS1427Sat521.55200.001
AutomotiveUS29925Sun359.95359.950
AutomotiveUS215Sat610.00300.001
AutomotiveUS14005Mon549.00549.000
AutomotiveUS577Fri820.00650.001
AutomotiveUS1457Sat999.00999.000
# Procesamiento de datos para obtener nuevos datos
ebayPerCurr <- split(ebay, ebay$currency) # Separar por moneda
endPricePerDay <- lapply(ebayPerCurr, function(curr) split(curr$ClosePrice, curr$endDay))  # En cada moneda, separar por dias
meanPricesUS <- sapply(endPricePerDay$US, mean) # Precio medio de cierre por US
meanPricesEUR <- sapply(endPricePerDay$EUR, mean) # Precio medio de cierre por EUR
meanPricesUS[is.na(meanPricesUS)] <- mean(meanPricesUS, na.rm = T)
rango <- range(meanPricesUS, meanPricesEUR) # Obtener el rango a representar
# Varias gráficas en un solo plot
plot(meanPricesUS, type = "o", axes = F, ann = F, col = "blue", ylim = rango) # grafico de lineas
lines(meanPricesEUR, type = "o", col = "red") #sobreponer gráfico de lineas
axis(1, at = 1:length(meanPricesUS), lab = names(meanPricesUS))# Rango y nombre del eje
axis(2, at = 3*0:rango[2], las = 1) # Rango del eje
title(main = 'Precio de cierre según día', xlab = 'Día', ylab = 'Precio final')# Nombres Ejes y Titulo
legend("bottomright", c("$","€"), col=c("blue","red"), lty=c(1,1)) # Etiquetas

png

Boxplot

plot(iris$Petal.Length ~ iris$Species)

png

# Agregando el titulo, el nombre del eje vertical y el subtitulo
boxplot(iris$Petal.Length ~ iris$Species)
title(main = 'IRIS', ylab = 'Longitud pétalo', sub = 'Análisis de pétalo por familia')

png

Grafico de Barras

barplot(sapply(endPricePerDay$EUR, length), col = rainbow(7))
title(main='Número de operaciones por día')

png

url <- "https://github.com/JoseRZapata/Data_analysis_notebooks/raw/main/data/datasets/results.csv"
download.file(url, destfile = "results.csv", mode = "wb")

# Leer los datos
results <- read.csv('results.csv')
accuracy <- aggregate(Accuracy ~ Algorithm, results, mean)
precision <- aggregate(Precision ~ Algorithm, results, mean)

valMedios <- matrix(c(precision$Precision, accuracy$Accuracy), nrow=6, ncol=2)
rownames(valMedios) <- accuracy$Algorithm

barplot(valMedios, beside=T, horiz = T, col = cm.colors(6), legend.text=T, names.arg = c('Accuracy', 'Precision'))

png

Grafico de Torta

opPorCategoria <- aggregate(ClosePrice ~ Category, ebay, length)[1:8,]# Datos de gráfica
colores <- topo.colors(length(opPorCategoria$Category))# Crear listado de colores

pie(opPorCategoria$ClosePrice, labels=opPorCategoria$ClosePrice, col = colores, main='Productos por categoría')
legend("bottom", "Categoría", opPorCategoria$Category, cex=0.6, fill = colores, ncol = 4) # Agregar etiquetas

png

Histogramas

url <- "https://github.com/JoseRZapata/Data_analysis_notebooks/raw/main/data/datasets/covertype.csv"
download.file(url, destfile = "covertype.csv", mode = "wb")

# Cargar dataset
covertype <- read.csv('covertype.csv')
class(covertype)
str(covertype)
head(covertype)

‘data.frame’

'data.frame': 581012 obs. of  13 variables:
 $ elevation      : int  2596 2590 2804 2785 2595 2579 2606 2605 2617 2612 ...
 $ aspect         : int  51 56 139 155 45 132 45 49 45 59 ...
 $ slope          : int  3 2 9 18 2 6 7 4 9 10 ...
 $ horz_dist_hydro: int  258 212 268 242 153 300 270 234 240 247 ...
 $ vert_dist_hydro: int  0 -6 65 118 -1 -15 5 7 56 11 ...
 $ horiz_dist_road: int  510 390 3180 3090 391 67 633 573 666 636 ...
 $ hillshade_9am  : int  221 220 234 238 220 230 222 222 223 228 ...
 $ hillshade_noon : int  232 235 238 238 234 237 225 230 221 219 ...
 $ hillshade_3pm  : int  148 151 135 122 150 140 138 144 133 124 ...
 $ horiz_dist_fire: int  6279 6225 6121 6211 6172 6031 6256 6228 6244 6230 ...
 $ wilderness_area: int  1 1 1 1 1 1 1 1 1 1 ...
 $ soil_type      : int  29 29 12 30 29 29 29 29 29 29 ...
 $ class          : int  5 5 2 2 5 2 5 5 5 5 ...
A data.frame: 6 × 13
elevationaspectslopehorz_dist_hydrovert_dist_hydrohoriz_dist_roadhillshade_9amhillshade_noonhillshade_3pmhoriz_dist_firewilderness_areasoil_typeclass
<int><int><int><int><int><int><int><int><int><int><int><int><int>
12596513258051022123214862791295
22590562212-639022023515162251295
32804139926865318023423813561211122
4278515518242118309023823812262111302
52595452153-139122023415061721295
625791326300-156723023714060311292
# Gráfica de histograma
hist(covertype$elevation,
     main='Elevación del terreno',# Titulo
     xlab='Metros', # Nombre Eje X
     breaks = 12, # Numero de divisiones del histograma
     col = rainbow(12)) #Colores usados para las barras

png

# Los histogramas son objetos
histograma <- hist(covertype$elevation, breaks=100, main='Elevación del terreno', xlab='Metros')
histograma # Podemos ver la información generada
# Y usarla para personalizar el resultado
$breaks
  [1] 1840 1860 1880 1900 1920 1940 1960 1980 2000 2020 2040 2060 2080 2100 2120
 [16] 2140 2160 2180 2200 2220 2240 2260 2280 2300 2320 2340 2360 2380 2400 2420
 [31] 2440 2460 2480 2500 2520 2540 2560 2580 2600 2620 2640 2660 2680 2700 2720
 [46] 2740 2760 2780 2800 2820 2840 2860 2880 2900 2920 2940 2960 2980 3000 3020
 [61] 3040 3060 3080 3100 3120 3140 3160 3180 3200 3220 3240 3260 3280 3300 3320
 [76] 3340 3360 3380 3400 3420 3440 3460 3480 3500 3520 3540 3560 3580 3600 3620
 [91] 3640 3660 3680 3700 3720 3740 3760 3780 3800 3820 3840 3860

$counts
  [1]     2    26    65   116   183   232   306   343   482   620   687   787
 [13]   880   994  1076  1011  1049  1125  1238  1212  1364  1565  1843  2118
 [25]  2273  2191  2190  2389  2596  2423  2625  2520  2673  3344  4103  4512
 [37]  4844  5547  5822  5790  5898  6298  7056  8500  8446  9589  9839  9957
 [49] 10583 11276 12162 12711 14037 15895 17480 19518 20545 19790 19171 18911
 [61] 17668 16612 16286 16474 16778 16687 16628 17347 17173 15891 14863 12724
 [73] 10764  8163  6471  5936  5649  4647  3532  2271  1644   881   585   511
 [85]   445   237   243   168   139   103    90    70    67   106    52    41
 [97]    45    39    51    64    39

$density
  [1] 1.721135e-07 2.237475e-06 5.593688e-06 9.982582e-06 1.574838e-05
  [6] 1.996516e-05 2.633336e-05 2.951746e-05 4.147935e-05 5.335518e-05
 [11] 5.912098e-05 6.772666e-05 7.572993e-05 8.554040e-05 9.259705e-05
 [16] 8.700337e-05 9.027352e-05 9.681384e-05 1.065382e-04 1.043008e-04
 [21] 1.173814e-04 1.346788e-04 1.586026e-04 1.822682e-04 1.956070e-04
 [26] 1.885503e-04 1.884643e-04 2.055896e-04 2.234033e-04 2.085155e-04
 [31] 2.258989e-04 2.168630e-04 2.300297e-04 2.877737e-04 3.530908e-04
 [36] 3.882880e-04 4.168589e-04 4.773567e-04 5.010224e-04 4.982685e-04
 [41] 5.075627e-04 5.419854e-04 6.072164e-04 7.314823e-04 7.268352e-04
 [46] 8.251981e-04 8.467123e-04 8.568670e-04 9.107385e-04 9.703758e-04
 [51] 1.046622e-03 1.093867e-03 1.207978e-03 1.367872e-03 1.504272e-03
 [56] 1.679655e-03 1.768036e-03 1.703063e-03 1.649794e-03 1.627419e-03
 [61] 1.520451e-03 1.429575e-03 1.401520e-03 1.417699e-03 1.443860e-03
 [66] 1.436029e-03 1.430952e-03 1.492826e-03 1.477852e-03 1.367528e-03
 [71] 1.279061e-03 1.094986e-03 9.263148e-04 7.024812e-04 5.568732e-04
 [76] 5.108328e-04 4.861345e-04 3.999057e-04 3.039524e-04 1.954349e-04
 [81] 1.414773e-04 7.581599e-05 5.034319e-05 4.397500e-05 3.829525e-05
 [86] 2.039545e-05 2.091179e-05 1.445753e-05 1.196189e-05 8.863844e-06
 [91] 7.745107e-06 6.023972e-06 5.765802e-06 9.122015e-06 4.474951e-06
 [96] 3.528326e-06 3.872553e-06 3.356213e-06 4.388894e-06 5.507632e-06
[101] 3.356213e-06

$mids
  [1] 1850 1870 1890 1910 1930 1950 1970 1990 2010 2030 2050 2070 2090 2110 2130
 [16] 2150 2170 2190 2210 2230 2250 2270 2290 2310 2330 2350 2370 2390 2410 2430
 [31] 2450 2470 2490 2510 2530 2550 2570 2590 2610 2630 2650 2670 2690 2710 2730
 [46] 2750 2770 2790 2810 2830 2850 2870 2890 2910 2930 2950 2970 2990 3010 3030
 [61] 3050 3070 3090 3110 3130 3150 3170 3190 3210 3230 3250 3270 3290 3310 3330
 [76] 3350 3370 3390 3410 3430 3450 3470 3490 3510 3530 3550 3570 3590 3610 3630
 [91] 3650 3670 3690 3710 3730 3750 3770 3790 3810 3830 3850

$xname
[1] "covertype$elevation"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"

png

plot(histograma, #tipo de plot histograma
     col=ifelse(histograma$breaks < 2500, 'green', ifelse(histograma$breaks > 3000, "red", "blue")), #Colores
     main='Elevación del terreno', # Titulo
     xlab='Metros')# Nombre del eje x

png

Gráficas de densidad (kde)

plot(density(covertype$elevation, adjust=5), col='black', lwd=3)

png

plot(density(rnorm(1000), adjust=3), col='blue', lwd=4, main='Distribución normal', xlab='Valores')

png

# histograma y gráfica de densidad (kde)
hist(covertype$elevation, prob=T, col="grey", main='Elevación del terreno', xlab='Metros')
lines(density(covertype$elevation, adjust=5), col='black', lwd=3)

png

Multiplots

Se pueden crear multiplots usando la función layout() o par()

layout()

Se pueden crear multiplots usando la función layout(), se debe creaar un amatriz que definira como seran las posiciones de las gráficas

# Dividir el canvas según la matriz
# Canvas de 2 x 2
# Cuatro gráficas según el numero en que queden los números
matrix(c(1,2,3,4), 2, 2, byrow =TRUE) # Matriz de 2 por 2
A matrix: 2 × 2 of type dbl
12
34
matrix(c(1,2),2,1 , byrow = TRUE) # Matriz 2x1
A matrix: 2 × 1 of type dbl
1
2
layout(matrix(c(1,2),2,1 , byrow = TRUE))
hist(ebay$Duration, main='Duración subasta',xlab='Dias')
barplot(sapply(endPricePerDay$EUR, length), col = rainbow(7))
title(main='Operaciones por dia')

png

par()

# Composición usando matriz nXm de gráficas
prev <- par(mfrow=c(2,2)) # se define la distribución de 2x2 en este caso
plot(iris$Sepal.Length,iris$Sepal.Width,col=iris$Species)
plot(iris$Petal.Length,iris$Petal.Width,col=iris$Species)
plot(iris$Sepal.Length,iris$Petal.Width,col=iris$Species)
plot(iris$Petal.Length,iris$Sepal.Width,col=iris$Species)
par(prev)

png

Guardar gráficas

Se pueden grabar en formato png, jpeg y pdf, con las funciónes png(), jpg() y pdf(), la estructura es:

png()
#plots a realizar
dev.off()
# histograma y gráfica de densidad (kde)
library(ggplot2)
png('AnalisisSubastas.png') #Nombre del archivo png
hist(covertype$elevation, prob=T, col="grey", main='Elevación del terreno', xlab='Metros')
lines(density(covertype$elevation, adjust=5), col='black', lwd=3)
dev.off() #Grabar archivo

png: 2


visualizacion con ggplot2

ggplot2 tiene varias ventajas:

  • Especificación de las gráficas en un alto nivel de abstracción
  • Muy flexible
  • Se pueden usar temas para pulir el aspecto de las gráficas
  • Sistema de gráficos completo y maduro
  • Muchos usuarios, lista de correo activa
  • Muchas ayuda en línea disponible (StackOverflow, etc.)

ggplot2 no es ideal para :

  • Gráficos interactivos -Gráficos de teoría de gráficas (Nodos de gráficos)
  • Gráficos tridimensionales (3D)

Un buen resumen de ggplot2 se encuentra en https://www.rstudio.com/wp-content/uploads/2015/03/ggplot2-cheatsheet.pdf


Gramática de las gráficas

ggplot2 se basa en la gramática de los gráficos, la idea de que puede construir cada gráfico a partir de los mismos componentes: un conjunto de datos, un conjunto de marcas geom-visuales que representan puntos de datos y un sistema de coordenadas. Para mostrar valores de datos, asigne variables en el conjunto de datos a las propiedades estéticas del tamaño, el color y las ubicaciones x , y.

ggplot2 se basa en la gramática de los gráficos, que establece un paradigma para la visualización de datos en capas:

grammar layers

# importar ggplot2
library(ggplot2)

La sintaxis general cuando se usa ggplot2 es:

ggplot(data = <default data set>,
       aes(x = <default x axis variable>,
           y = <default y axis variable>,
           ... <other default aesthetic mappings>),
       ... <other plot defaults>) +

       geom_<geom type>(aes(size = <size variable for this geom>,
                      ... <other aesthetic mappings>),
                  data = <data for this point geom>,
                  stat = <statistic string or function>,
                  position = <position string or function>,
                  color = <"fixed color specification">,
                  <other arguments, possibly passed to the _stat_ function) +

  scale_<aesthetic>_<type>(name = <"scale label">,
                     breaks = <where to put tick marks>,
                     labels = <labels for tick marks>,
                     ... <other options for the scale>) +

  theme(plot.background = element_rect(fill = "gray"),
        ... <other theme elements>)

library(data.table)
# Importar datos para dibujar
url <- "https://github.com/JoseRZapata/Data_analysis_notebooks/raw/main/data/datasets/state_real_estate_data.csv"
download.file(url, destfile = "state_real_estate_data.csv", mode = "wb")
df <- fread('state_real_estate_data.csv')
head(df) # primeros datos del dataframe
A data.table: 6 × 9
StateregionDateHome.ValueStructure.CostLand.ValueLand.Share..Pct.Home.Price.IndexLand.Price.Index
<chr><chr><int><int><int><int><dbl><dbl><dbl>
AKWest201012249521605996435228.61.4811.552
AKWest201022255111602526525928.91.4841.576
AKWest200932258201637916202927.51.4861.494
AKWest200942249941617876320728.11.4811.524
AKWest200742345901554007919033.81.5441.885
AKWest200812337141574587625632.61.5381.817
tail(df) # Últimos datos del dataframe
A data.table: 6 × 9
StateregionDateHome.ValueStructure.CostLand.ValueLand.Share..Pct.Home.Price.IndexLand.Price.Index
<chr><chr><int><int><int><int><dbl><dbl><dbl>
DCNA2009263036114826848209276.52.4092.802
DCNA2009363210314807448402976.62.4152.817
DCNA2011467646316545651100775.52.5853.025
DCNA2012169023416670152353275.82.6373.107
DCNA2012270564516797853766676.22.6963.198
DCNA2012372251416928955322576.62.7613.299
str(df) # estructura del data frame
Classes ‘data.table’ and 'data.frame': 7803 obs. of  9 variables:
 $ State           : chr  "AK" "AK" "AK" "AK" ...
 $ region          : chr  "West" "West" "West" "West" ...
 $ Date            : int  20101 20102 20093 20094 20074 20081 20082 20083 20084 20091 ...
 $ Home.Value      : int  224952 225511 225820 224994 234590 233714 232999 232164 231039 229395 ...
 $ Structure.Cost  : int  160599 160252 163791 161787 155400 157458 160092 162704 164739 165424 ...
 $ Land.Value      : int  64352 65259 62029 63207 79190 76256 72906 69460 66299 63971 ...
 $ Land.Share..Pct.: num  28.6 28.9 27.5 28.1 33.8 32.6 31.3 29.9 28.7 27.9 ...
 $ Home.Price.Index: num  1.48 1.48 1.49 1.48 1.54 ...
 $ Land.Price.Index: num  1.55 1.58 1.49 1.52 1.89 ...
 - attr(*, ".internal.selfref")=<externalptr>
summary(df) #resumen general de las columnas del dataframe
    State              region               Date         Home.Value
 Length:7803        Length:7803        Min.   :19751   Min.   : 18763
 Class :character   Class :character   1st Qu.:19843   1st Qu.: 62235
 Mode  :character   Mode  :character   Median :19941   Median :108724
                                       Mean   :19939   Mean   :135313
                                       3rd Qu.:20033   3rd Qu.:172030
                                       Max.   :20131   Max.   :862885
 Structure.Cost     Land.Value     Land.Share..Pct. Home.Price.Index
 Min.   : 17825   Min.   :   938   Min.   : 5.00    Min.   :0.1350
 1st Qu.: 53776   1st Qu.:  4178   1st Qu.: 5.00    1st Qu.:0.4550
 Median : 88352   Median :  9478   Median :10.40    Median :0.7830
 Mean   : 99534   Mean   : 35779   Mean   :18.17    Mean   :0.8695
 3rd Qu.:134871   3rd Qu.: 38631   3rd Qu.:26.30    3rd Qu.:1.2075
 Max.   :325595   Max.   :594417   Max.   :81.70    Max.   :2.8930
 Land.Price.Index
 Min.   : 0.0000
 1st Qu.: 0.0020
 Median : 0.2520
 Mean   : 0.9912
 3rd Qu.: 1.1510
 Max.   :15.4340

Usando ggplot2

Ejemplo rapido con Histogramas

¡Los histogramas son una gran manera de explorar rápidamente los datos! Tenemos un par de opciones para producir rápidamente histogramas de las columnas de un dataframe. Tenemos:

  • hist()
  • qplot()
  • ggplot()

Se diferencian principalmente en un componente principal, por cada uno de estos métodos, generalmente se compensa la facilidad de uso con la capacidad de personalizar el grafico.

¡Nota! En RStudio se debe llamar a print(plot_name) para mostrar las gráficas.

# Crear un histograma de una columna del dataframe
hist(df[['Home.Value']])

png

Usando qplot Observe el ajuste automático del tema de color y el ancho de las barras.

qplot(df[['Home.Value']])
Warning message:
“`qplot()` was deprecated in ggplot2 3.4.0.”
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

png

# Usando ggplot, se tienen muchas posibilidades de configuración, pero es un poco mas complicado
ggplot(data = df,aes(df$Home.Value))+geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

png

Entonces, ¿qué método deberíamos elegir? Por lo general, la función qplot() proporciona un buen equilibrio entre la facilidad de uso y la capacidad de personalizar, desglosemos rápidamente la sintaxis para usar qplot().

qplot

La función qplot() se puede usar para crear los tipos de gráficos más comunes. Si bien no se presenta toda la potencia de ggplot, puede crear una amplia gama de gráficos útiles. El formato es:

qplot(x, y, data=, color=, shape=, size=, alpha=, geom=, method=, formula=, facets=, xlim=, ylim= xlab=, ylab=, main=, sub=)

Cada uno de estos argumentos adicionales proporciona métodos para personalizar aún más la gráfica:

optiondescription
alphaAlpha transparency for overlapping elements expressed as a fraction between 0 (complete transparency) and 1 (complete opacity)
color, shape, size, fillAssociates the levels of variable with symbol color, shape, or size. For line plots, color associates levels of a variable with line color. For density and box plots, fill associates fill colors with a variable. Legends are drawn automatically.
dataSpecifies a data frame
facetsCreates a trellis graph by specifying conditioning variables. Its value is expressed as rowvar ~ colvar. To create trellis graphs based on a single conditioning variable, use rowvar~. or .~colvar)
geomSpecifies the geometric objects that define the graph type. The geom option is expressed as a character vector with one or more entries. geom values include "point", "smooth", "boxplot", "line", "histogram", "density", "bar", and "jitter".
main, subCharacter vectors specifying the title and subtitle
method, formulaIf geom="smooth", a loess fit line and confidence limits are added by default. When the number of observations is greater than 1,000, a more efficient smoothing algorithm is employed. Methods include "lm" for regression, "gam" for generalized additive models, and "rlm" for robust regression. The formula parameter gives the form of the fit.

For example, to add simple linear regression lines, you’d specify geom=“smooth”, method=“lm”, formula=y~x. Changing the formula to y~poly(x,2) would produce a quadratic fit. Note that the formula uses the letters x and y, not the names of the variables.

For method=“gam”, be sure to load the mgcv package. For method=“rml”, load the MASS package.

x, ySpecifies the variables placed on the horizontal and vertical axis. For univariate plots (for example, histograms), omit y
xlab, ylabCharacter vectors specifying horizontal and vertical axis labels
xlim,ylimTwo-element numeric vectors giving the minimum and maximum values for the horizontal and vertical axes, respectively

Ejemplo rápido de personalización

En el último ejemplo, acabamos de pasar una sola columna y qplot automáticamente sabía que debíamos hacer un histograma, de ahora en adelante vamos a ser un poco más formales y pasar la fuente de datos completa y luego especificar qué columnas agarrar y cómo graficarlo:

# Personalizando un poco el histograma
qplot(data=df,x=Home.Value,geom = 'histogram',xlim=c(0,500000), color='red')
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Warning message:
“Removed 94 rows containing non-finite values (`stat_bin()`).”
Warning message:
“Removed 2 rows containing missing values (`geom_bar()`).”

png


Histogramas

Repasemos cómo crear histogramas con ggplot2 . ¡Consulte el video para la explicación completa! También una nota rápida, vamos a mostrar mucho de lo que ggplot can hacer, pero no lo que debes hacer.

Datos

Usaremos el conjunto de datos de película que viene con ggplot:

# Solo instalar una vez este paquete
install.packages("ggplot2movies")
Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)
library(ggplot2) # Importar ggplot2
library(ggplot2movies) # Importar la base dee datos de movies
df <- movies <- movies[sample(nrow(movies), 1000), ] # Solo tomar 1000 peliculas
head(df) # Solo ver las primeras filas
A tibble: 6 × 24
titleyearlengthbudgetratingvotesr1r2r3r4r9r10mpaaActionAnimationComedyDramaDocumentaryRomanceShort
<chr><int><int><int><dbl><int><dbl><dbl><dbl><dbl><dbl><dbl><chr><int><int><int><int><int><int><int>
Ninth Configuration, The198099NA6.98314.54.54.54.514.534.50011000
Charly1968103NA7.29314.54.54.54.514.514.50001000
Cumple, El200280NA6.6124.50.00.00.00.044.50001000
Hijo de la novia, El2001123NA7.719334.54.54.54.524.534.5R0011000
Bager200319NA5.050.00.00.00.00.00.00001001
Uomo dalla pelle dura, L'197183NA2.81514.54.54.514.50.04.50001000

qplot()

qplot(rating,data=df,geom='histogram',binwidth=0.1,alpha=0.8)

png

ggplot()

# ggplot(data, aesthetics)
pl <- ggplot(df,aes(x=rating))
# Agregar Histogram Geometry
pl + geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

png

Agregando Color

pl <- ggplot(df,aes(x=rating))
# Modificando el tamaño de los bins, el color de las lineas y el relleno
pl + geom_histogram(binwidth=0.1,color='red',fill='pink')

png

Agregando Etiquetas

Agregar el nombre de los ejes y el titulo de la gráfica, aplica para todos las graficas de ggplot

pl <- ggplot(df,aes(x=rating))
pl + geom_histogram(binwidth=0.1,color='red',fill='pink') + xlab('Puntaje de las películas')+ ylab('Frecuencia') + ggtitle('Puntaje de las Peliculas')

png

Cambiar la transparencia (Alpha)

pl <- ggplot(df,aes(x=rating))
#Cambiar el color de los bins y la transparencia
pl + geom_histogram(binwidth=0.1,fill='blue',alpha=0.4) + xlab('Puntaje de las Películas')+ ylab('Frecuencia')

png

Tipos de lineas (Linetypes)

Las opciones son: “blank”, “solid”, “dashed”, “dotted”, “dotdash”, “longdash”, and “twodash”.

pl <- ggplot(df,aes(x=rating))
# cambiar las lineas a punteadas
pl + geom_histogram(binwidth=0.1,color='blue',fill='pink',linetype='dotted') + xlab('Puntaje de las Películas')+ ylab('Frecuencia')

png

Estetica Avanzada

Podemos agregar un argumento aes() al geom_histogram para algunas características más avanzadas.

# Agregando etiquetas
pl <- ggplot(df,aes(x=rating))
#Modificando el relleno que depende del valor de la frecuencia de datos
pl + geom_histogram(binwidth=0.1,aes(fill=..count..)) + xlab('Puntaje de las Películas')+ ylab('Frecuencia')
Warning message:
“The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
ℹ Please use `after_stat(count)` instead.”

png

Incluso se puede editar mas agregando la funcion scale_fill_gradient() al objeto ggplot:

# Agregando Etiquetas
pl <- ggplot(df,aes(x=rating))
pl2 <- pl + geom_histogram(binwidth=0.1,aes(fill=..count..)) + xlab('Puntaje de las Películas')+ ylab('Frecuencia')
# modificando los colores del gradiente
# scale_fill_gradient('Label',low=color1,high=color2)
pl2 + scale_fill_gradient('Count',low='blue',high='red')+ xlab('Puntaje de las Películas')+ ylab('Frecuencia')

png

# modificando los colores del gradiente
# scale_fill_gradient('Label',low=color1,high=color2)
pl2 + scale_fill_gradient('Count',low='darkgreen',high='lightblue')+ xlab('Puntaje de las Películas')+ ylab('Frecuencia')

png

Agregar la grafica de estimacion de densidad

kernel density estimation plot

# Agregar etiquetas
pl <- ggplot(df,aes(x=rating))
# Agregar el kde de color rojo
pl + geom_histogram(aes(y=..density..)) + geom_density(color='red')
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

png

Scatterplots

Los diagramas de dispersión nos permiten ubicar puntos que nos permiten ver posibles correlaciones entre dos características de un conjunto de datos.

# Importar la librería
library('ggplot2')
# usar la base de datos mtcar
df <- mtcars
head(df) # ver las primeras filas
A data.frame: 6 × 11
mpgcyldisphpdratwtqsecvsamgearcarb
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
Mazda RX421.061601103.902.62016.460144
Mazda RX4 Wag21.061601103.902.87517.020144
Datsun 71022.84108933.852.32018.611141
Hornet 4 Drive21.462581103.083.21519.441031
Hornet Sportabout18.783601753.153.44017.020032
Valiant18.162251052.763.46020.221031

qplot()

qplot(wt,mpg,data=df)

png

Agregando una tercera Caracteristica

Podemos agregar una tercera característica agregando un degradado de color en cada punto, o cambiando el tamaño de cada punto según su valor de esta tercera característica. Por ejemplo:

# Cambiando el color de los puntos
qplot(wt,mpg,data=df,color=cyl)

png

# Cambiando el tamaño de los puntos
qplot(wt,mpg,data=df,size=cyl)

png

Cambiando el tamaño y el color

qplot(wt,mpg,data=df,size=cyl,color=cyl)

png

# Mostrar 4 características se puede volver difícil de leer
qplot(wt,mpg,data=df,size=cyl,color=hp,alpha=0.6)

png

ggplot()


pl <- ggplot(data=df,aes(x = wt,y=mpg))
pl + geom_point()

png

Agregando una tercera caracteristica


pl <- ggplot(data=df,aes(x = wt,y=mpg))
pl + geom_point(aes(color=cyl))

png

# agregar colores diferentes dependiendo del numero de cilindros
pl <- ggplot(data=df,aes(x = wt,y=mpg))
pl + geom_point(aes(color=factor(cyl)))

png

# El tamaño de los puntos depende del numero de cyl
pl <- ggplot(data=df,aes(x = wt,y=mpg))
pl + geom_point(aes(size=factor(cyl)))
Warning message:
“Using size for a discrete variable is not advised.”

png

# Usando formas diferentes
pl <- ggplot(data=df,aes(x = wt,y=mpg))
pl + geom_point(aes(shape=factor(cyl)))

png

# Combinando formas y colores
pl <- ggplot(data=df,aes(x = wt,y=mpg))
pl + geom_point(aes(shape=factor(cyl),color=factor(cyl)),size=4,alpha=0.6)

png

Escalas de gradientes

pl + geom_point(aes(colour = hp),size=4) + scale_colour_gradient(high='red',low = "blue")

png

Barplots

Es una forma útil de mostrar el numero de ocurrencias de difrentes categorias. En ggplot2, hay dos tipos de gráficos de barras, determinados por lo que se asigna a la altura de la barra. Por defecto, geom_bar usa stat = "count" que hace que la altura de la barra sea igual al número de casos en cada grupo (o si se proporciona el peso estético, la suma de los pesos). Si desea que las alturas de las barras representen valores en los datos, use stat = "identity" y asigne una variable a la estética.

No hay una manera realmente simple y agradable de hacer esto con qplot, por lo que nos saltaremos el uso a ggplot.

Veamos cómo podemos crearlos utilizando el conjunto de datos de mpg de la dataset mtcars .

# Importar librería
library(ggplot2)
# Counts (o suma de los pesos)
g <- ggplot(mpg, aes(class))
# Numero de carros en cada clase:
g + geom_bar()

png

# Los gráficos de barras se apilan automáticamente cuando se colocan varias barras
# en el mismo lugar
g + geom_bar(aes(fill = drv))

png

Se pueden poner Una encia de la otra o una al lado de la otra, observar bien los valores del eje vertical

g + geom_bar(aes(fill = drv), position = "fill")

png

# Ponerlas una al lado del otra
g + geom_bar(aes(fill = drv), position = "dodge")

png

Boxplots

Boxplots son una forma conveniente de representar gráficamente grupos de datos numéricos a través de sus cuartiles. Los diagramas de caja también pueden tener líneas que se extienden verticalmente desde las cajas (bigotes) que indican variabilidad fuera de los cuartiles superior e inferior. Los valores atípicos se pueden trazar como puntos individuales.

#Importar librería
library(ggplot2)
# Cargar dataframe
df <- mtcars
# Primeras filas del dataset
head(df)
A data.frame: 6 × 11
mpgcyldisphpdratwtqsecvsamgearcarb
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
Mazda RX421.061601103.902.62016.460144
Mazda RX4 Wag21.061601103.902.87517.020144
Datsun 71022.84108933.852.32018.611141
Hornet 4 Drive21.462581103.083.21519.441031
Hornet Sportabout18.783601753.153.44017.020032
Valiant18.162251052.763.46020.221031

qplot()

qplot(factor(cyl), mpg, data = mtcars, geom = "boxplot")

png

ggplot()

pl <- ggplot(mtcars, aes(factor(cyl), mpg))
pl + geom_boxplot()

png

# Boxplot Horizontales
pl + geom_boxplot() + coord_flip()

png

# Cambiar el color del relleno
pl + geom_boxplot(aes(fill = factor(cyl)))

png

# Cambiar el color del relleno y el color de las lineas
pl + geom_boxplot(fill = "grey", color = "blue")

png

Graficar 2 variables con ggplot2

Ejemplos de cómo puede comparar dos variables de un conjunto de datos. Para estos ejemplos, necesitará el control total de ggplot en lugar de usar qplot(), pero hay un ejemplo rápido de lo que qplot es capaz de hacer.

# importar librería
library(ggplot2)
df <- movies #Importar la base de datos de las peliculas

qplot()

qplot(x=year, y=rating, data = df, geom = "density2d")

png

ggplot()

# Crear la gráfica ggplot
pl <- ggplot(movies,aes(x = year,y=rating))

Grafica de cuadriculas (2 bin chart)

pl + geom_bin2d()

png

# Controlar el tamaño de las cuadriculas
pl + geom_bin2d(binwidth=c(2,1))

png

Diagrama de densidad en 2D

pl + geom_density2d()

png

Gráfica hexagonal 2D

pl + geom_hex()
Warning message:
“Computation failed in `stat_binhex()`
Caused by error in `compute_group()`:
! The package "hexbin" is required for `stat_binhex()`”

png

# Cambiar los colores por un gradiente
pl + geom_hex() + scale_fill_gradient(high='red',low='blue')
Warning message:
“Computation failed in `stat_binhex()`
Caused by error in `compute_group()`:
! The package "hexbin" is required for `stat_binhex()`”

png

Manejo de las Coordenadas con ggplot2

Aprender cómo manejar las coordenadas nos permitirá dimensionar nuestras gráficas correctamente.

Gráfico Básico y Datos

library(ggplot2)
pl <- ggplot(mpg,aes(x=displ,y=hwy)) + geom_point()
pl

png

Configurar los limites de x , y

Puede usar + scale_x_continuous y scale_y_continuous con un argumento adicional de limits = c(low, high) para establecer la escala. Una forma a veces más agradable de hacer esto es agregar + coord_cartesian() con los argumentos en vectores xlim y ylim

# Definiendo los limites de los ejes
pl + coord_cartesian(xlim=c(1,4),ylim=c(15,30))

png

Proporciones de aspecto

Puede usar el método coord_fixed() para cambiar la relación de aspecto de un gráfico (el valor predeterminado es 1: 1).

# La relación del aspecto se expresa como y / x
pl + coord_fixed(ratio = 1/3)

png

Facets (Multiplots)

Los facets nos permitirá ubicar varias gráficas una al lado de la otra, estas gráficas generalmente están relacionadas por el mismo conjunto de datos. La mejor manera de configurar una cuadrícula de facets es usar facet_grid (), la parte principal de esta función es el uso del argumento del facet:

Una fórmula con las filas (de la pantalla tabular) en el LHS y las columnas (de la pantalla tabular) en el RHS; el punto en la fórmula se utiliza para indicar que no debe haber facets en esta dimensión (ya sea fila o columna). La fórmula también se puede proporcionar como un string en lugar de un objeto de una fórmula clásica.

help(facet_grid)
p <- ggplot(mpg, aes(displ, cty)) + geom_point()
# una sola fila y columnas con los valores de cyl
p + facet_grid(. ~ cyl)

png

# Una sola columna y varias filas con los valores de drv
p + facet_grid(drv ~ .)

png

# gráficas de Columnas y filas
p + facet_grid(drv ~ cyl)

png

En la documentacion puede encontrar mas opciones

Temas

Hay muchos temas incorporados en ggplot y puede usarlos de dos maneras, indicando antes de graficar para establecer el tema:

theme_set (theme_bw())

o agregándolos a la grafica directamente: my_plot + theme_bw()

También hay una gran libreria llamada ggthemes que agrega incluso más temas incorporados para ggplot. También se pueden personalizar los temas.

Temas incorporados ( Built-in-Themes)

# importar librería
library(ggplot2)
# base de datos mtcars
df <- mtcars
head(df) # primeras filas
A data.frame: 6 × 11
mpgcyldisphpdratwtqsecvsamgearcarb
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
Mazda RX421.061601103.902.62016.460144
Mazda RX4 Wag21.061601103.902.87517.020144
Datsun 71022.84108933.852.32018.611141
Hornet 4 Drive21.462581103.083.21519.441031
Hornet Sportabout18.783601753.153.44017.020032
Valiant18.162251052.763.46020.221031
# gráfica de mpg vs hp
pl <- ggplot(df,aes(x=mpg,y=hp)) + geom_point()
print(pl) # recordar que asi se debe escribir en R studio para ver la gráfica

png

# Tema blanco y negro
pl + theme_bw()

png

# Tema Clásico
pl + theme_classic()

png

# Tema oscuro
pl + theme_dark()

png

pl + theme_get()

png

# Tem de color claro
pl + theme_light()

png

pl + theme_linedraw()

png

# Tema minimalista
pl + theme_minimal()

png

# Tema vació (Extra minimalista)
pl + theme_void()

png

ggthemes

Aquí hay un enlace a la documentación para ggthemes.

# Solo instalar una vez el paquete
install.packages("ggthemes")
library(ggthemes)
Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)
pl + theme_excel()

png

pl + theme_economist()

png

pl + theme_economist_white()

png

Multiplot con ggplot

Se hace usando las librerias grid y gridExtra

if(!require('grid'))
  install.packages('grid')
if(!require('gridExtra'))
  install.packages('gridExtra')

library(gridExtra)
library(grid)


pl1 <- pl + theme_excel()
pl2 <- pl + theme_economist_white()
pl3 <- pl + theme_economist()
pl4 <- pl + theme_dark()
grid.arrange(pl1, pl2,pl3,pl4, ncol = 2, top = "4 subplots con ggplot ")
Loading required package: grid

Loading required package: gridExtra

png

Gráficos avanzados

Gráficos Circulares

# https://github.com/jokergoo/circlize
if(!require('circlize'))
  install.packages('circlize')
library(circlize)

# Ejemplo simple con supuestos datos migratorios

migracion <- data.frame(Spain = c(35, 12, 67),
                        France = c(17, 13, 28),
                        Italy = c(42, 17, 32))
rownames(migracion) <- c("Finland", "Poland", "Denmark")

chordDiagram(as.matrix(migracion))
circos.clear()  # Liberación de datos asociados a la gráfica

# Gráfica direccional
par(mar=c(0,0,0,0))
chordDiagram(as.matrix(migracion),
             directional = TRUE,
             annotationTrack = "grid",
             preAllocateTracks = list(track.height = 0.2, track.height = 0.2)
)

circos.clear()  # Liberación de datos asociados a la gráfica
Loading required package: circlize

========================================
circlize version 0.4.16
CRAN page: https://cran.r-project.org/package=circlize
Github page: https://github.com/jokergoo/circlize
Documentation: https://jokergoo.github.io/circlize_book/book/

If you use it in published research, please cite:
Gu, Z. circlize implements and enhances circular visualization
  in R. Bioinformatics 2014.

This message can be suppressed by:
  suppressPackageStartupMessages(library(circlize))
========================================

png

png

gráficos de Telaraña (spider)

if(!require('fmsb'))
  install.packages('fmsb')
library('fmsb')

# Preparamos los datos de entrada
set.seed(4242)
dat <- data.frame(
  C4.5 = runif(3, 0, 1),
  SVM  = runif(3, 0, 1),
  kNN  = runif(3, 0, 1),
  ANN  = runif(3, 0, 1),
  CAR  = runif(3, 0, 1)
  )

# Cada eje tendrá una escala propia
radarchart(dat, maxmin = FALSE)

# Fijamos el máximo y mínimo para cada variable
maxmin <- data.frame(
  C4.5 = c(1, 0),
  SVM  = c(1, 0),
  kNN  = c(1, 0),
  ANN  = c(1, 0),
  CAR  = c(1, 0)
)
dat <- rbind(maxmin, dat)

# Escalas homogéneas para todas las variables
radarchart(dat, axistype = 4)

# Más/Menos segmentos de división, lo que influye en la posición del 0.00 y por tanto en la gráfica
radarchart(dat, axistype = 4, seg = 2)
radarchart(dat, axistype = 4, seg = 10)


# Personalización de tipos de línea y otros parámetros
radarchart(dat, axistype = 2,
           plty = 1:3, plwd = 2,
           pcol = c('black', 'green', 'red'),
           vlabels = names(dat)
           )
legend("bottomleft", c("precision", "accuracy", "recall"),
       col = c('black', 'green', 'red'),
       lty = 1:3, lwd = 2, ncol = 3)
Loading required package: fmsb

png

png

png

png

png

Graficas 3D

if(!require('scatterplot3d'))
  install.packages('scatterplot3d')
library('scatterplot3d')

# Representación de iris, ancho y alto de pétalo, ancho de sépalo y especie,
# en una grafica de  puntos 3D
datos <- data.frame(AnchoSepalo = iris$Sepal.Width,
                    LargoPetalo = iris$Petal.Length,
                    AnchoPetalo = iris$Petal.Width)

scatterplot3d(datos, type = "h",
              color = as.numeric(iris$Species),
              pch = 20, angle = 15)
Loading required package: scatterplot3d

png

# Secuencia de puntos en el eje X
x <- seq(-10, 10, 0.01)
y <- sin(x) # Cálculo de las posiciones
z <- cos(x)*sin(x) # en Y y Z
scatterplot3d(x, y, z,
              highlight.3d = TRUE,
              col.axis = "blue",
              col.grid = "lightblue",
              pch = 20, angle = -30)

png

# Dibujo de una superficie con lattice
if(!require('lattice'))
  install.packages('lattice')
library('lattice')

z <- matrix(rnorm(625) + 574, nrow = 25)
z <- z + seq(50, 1, length = 25)
persp(z, phi = 30, theta = 30,
      shade = 0.5, col = heat.colors(6),
      zlim = c(550,650), ticktype = "detailed",
      xlab = "X", ylab = "Y", zlab='Z',
      main = "Elevación del terreno")
Loading required package: lattice

png

# Representación de nube de puntos 3D con lattice
cloud(iris$Petal.Width ~
        iris$Petal.Length *
        iris$Sepal.Width,
      col = rainbow(3, alpha = 0.5),
      pch = 19, cex = 1.5,
      groups = iris$Species,
      auto.key = list(space="top", columns = 3, points = FALSE,
                      title="Specie", cex.title = 1.5,
                      col = rainbow(3)))

png

Referencias