Por Jose R. Zapata
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)
> 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"))
> 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)
> 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")
> 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)
> 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="")
> 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)
> pairs(iris[1:4], main="Edgar Anderson's Iris Data", pch=21,
+ bg = c("red", "green3", "blue")[unclass(iris$Species)])
> ## 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)
> 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")
> par(opar)
# 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)
# Scatter Variable1 vs. Variable2
plot(iris$Sepal.Length, iris$Sepal.Width)
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)
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
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")
# 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
# 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”
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
- 'tbl_df'
- 'tbl'
- '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 ...
Category | currency | sellerRating | Duration | endDay | ClosePrice | OpenPrice | Competitive? |
---|---|---|---|---|---|---|---|
<chr> | <chr> | <dbl> | <dbl> | <chr> | <dbl> | <dbl> | <dbl> |
Automotive | US | 142 | 7 | Sat | 521.55 | 200.00 | 1 |
Automotive | US | 2992 | 5 | Sun | 359.95 | 359.95 | 0 |
Automotive | US | 21 | 5 | Sat | 610.00 | 300.00 | 1 |
Automotive | US | 1400 | 5 | Mon | 549.00 | 549.00 | 0 |
Automotive | US | 57 | 7 | Fri | 820.00 | 650.00 | 1 |
Automotive | US | 145 | 7 | Sat | 999.00 | 999.00 | 0 |
# 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
Boxplot
plot(iris$Petal.Length ~ iris$Species)
# 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')
Grafico de Barras
barplot(sapply(endPricePerDay$EUR, length), col = rainbow(7))
title(main='Número de operaciones por día')
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'))
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
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 ...
elevation | aspect | slope | horz_dist_hydro | vert_dist_hydro | horiz_dist_road | hillshade_9am | hillshade_noon | hillshade_3pm | horiz_dist_fire | wilderness_area | soil_type | class | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
<int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | |
1 | 2596 | 51 | 3 | 258 | 0 | 510 | 221 | 232 | 148 | 6279 | 1 | 29 | 5 |
2 | 2590 | 56 | 2 | 212 | -6 | 390 | 220 | 235 | 151 | 6225 | 1 | 29 | 5 |
3 | 2804 | 139 | 9 | 268 | 65 | 3180 | 234 | 238 | 135 | 6121 | 1 | 12 | 2 |
4 | 2785 | 155 | 18 | 242 | 118 | 3090 | 238 | 238 | 122 | 6211 | 1 | 30 | 2 |
5 | 2595 | 45 | 2 | 153 | -1 | 391 | 220 | 234 | 150 | 6172 | 1 | 29 | 5 |
6 | 2579 | 132 | 6 | 300 | -15 | 67 | 230 | 237 | 140 | 6031 | 1 | 29 | 2 |
# 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
# 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"
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
Gráficas de densidad (kde)
plot(density(covertype$elevation, adjust=5), col='black', lwd=3)
plot(density(rnorm(1000), adjust=3), col='blue', lwd=4, main='Distribución normal', xlab='Valores')
# 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)
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
1 | 2 |
3 | 4 |
matrix(c(1,2),2,1 , byrow = TRUE) # Matriz 2x1
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')
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)
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:
# 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
State | region | Date | Home.Value | Structure.Cost | Land.Value | Land.Share..Pct. | Home.Price.Index | Land.Price.Index |
---|---|---|---|---|---|---|---|---|
<chr> | <chr> | <int> | <int> | <int> | <int> | <dbl> | <dbl> | <dbl> |
AK | West | 20101 | 224952 | 160599 | 64352 | 28.6 | 1.481 | 1.552 |
AK | West | 20102 | 225511 | 160252 | 65259 | 28.9 | 1.484 | 1.576 |
AK | West | 20093 | 225820 | 163791 | 62029 | 27.5 | 1.486 | 1.494 |
AK | West | 20094 | 224994 | 161787 | 63207 | 28.1 | 1.481 | 1.524 |
AK | West | 20074 | 234590 | 155400 | 79190 | 33.8 | 1.544 | 1.885 |
AK | West | 20081 | 233714 | 157458 | 76256 | 32.6 | 1.538 | 1.817 |
tail(df) # Últimos datos del dataframe
State | region | Date | Home.Value | Structure.Cost | Land.Value | Land.Share..Pct. | Home.Price.Index | Land.Price.Index |
---|---|---|---|---|---|---|---|---|
<chr> | <chr> | <int> | <int> | <int> | <int> | <dbl> | <dbl> | <dbl> |
DC | NA | 20092 | 630361 | 148268 | 482092 | 76.5 | 2.409 | 2.802 |
DC | NA | 20093 | 632103 | 148074 | 484029 | 76.6 | 2.415 | 2.817 |
DC | NA | 20114 | 676463 | 165456 | 511007 | 75.5 | 2.585 | 3.025 |
DC | NA | 20121 | 690234 | 166701 | 523532 | 75.8 | 2.637 | 3.107 |
DC | NA | 20122 | 705645 | 167978 | 537666 | 76.2 | 2.696 | 3.198 |
DC | NA | 20123 | 722514 | 169289 | 553225 | 76.6 | 2.761 | 3.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']])
Usando qplot Observe el ajuste automático del tema de color y el ancho de las barras.
qplot(df[['Home.Value']])
Warning message:
“[1m[22m`qplot()` was deprecated in ggplot2 3.4.0.”
[1m[22m`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# Usando ggplot, se tienen muchas posibilidades de configuración, pero es un poco mas complicado
ggplot(data = df,aes(df$Home.Value))+geom_histogram()
[1m[22m`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
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:
option | description |
alpha | Alpha transparency for overlapping elements expressed as a fraction between 0 (complete transparency) and 1 (complete opacity) |
color, shape, size, fill | Associates 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. |
data | Specifies a data frame |
facets | Creates 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) |
geom | Specifies 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, sub | Character vectors specifying the title and subtitle |
method, formula | If 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, y | Specifies the variables placed on the horizontal and vertical axis. For univariate plots (for example, histograms), omit y |
xlab, ylab | Character vectors specifying horizontal and vertical axis labels |
xlim,ylim | Two-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')
[1m[22m`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Warning message:
“[1m[22mRemoved 94 rows containing non-finite values (`stat_bin()`).”
Warning message:
“[1m[22mRemoved 2 rows containing missing values (`geom_bar()`).”
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
title | year | length | budget | rating | votes | r1 | r2 | r3 | r4 | ⋯ | r9 | r10 | mpaa | Action | Animation | Comedy | Drama | Documentary | Romance | Short |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
<chr> | <int> | <int> | <int> | <dbl> | <int> | <dbl> | <dbl> | <dbl> | <dbl> | ⋯ | <dbl> | <dbl> | <chr> | <int> | <int> | <int> | <int> | <int> | <int> | <int> |
Ninth Configuration, The | 1980 | 99 | NA | 6.9 | 831 | 4.5 | 4.5 | 4.5 | 4.5 | ⋯ | 14.5 | 34.5 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | |
Charly | 1968 | 103 | NA | 7.2 | 931 | 4.5 | 4.5 | 4.5 | 4.5 | ⋯ | 14.5 | 14.5 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | |
Cumple, El | 2002 | 80 | NA | 6.6 | 12 | 4.5 | 0.0 | 0.0 | 0.0 | ⋯ | 0.0 | 44.5 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | |
Hijo de la novia, El | 2001 | 123 | NA | 7.7 | 1933 | 4.5 | 4.5 | 4.5 | 4.5 | ⋯ | 24.5 | 34.5 | R | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
Bager | 2003 | 19 | NA | 5.0 | 5 | 0.0 | 0.0 | 0.0 | 0.0 | ⋯ | 0.0 | 0.0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | |
Uomo dalla pelle dura, L' | 1971 | 83 | NA | 2.8 | 15 | 14.5 | 4.5 | 4.5 | 14.5 | ⋯ | 0.0 | 4.5 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
qplot()
qplot(rating,data=df,geom='histogram',binwidth=0.1,alpha=0.8)
ggplot()
# ggplot(data, aesthetics)
pl <- ggplot(df,aes(x=rating))
# Agregar Histogram Geometry
pl + geom_histogram()
[1m[22m`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
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')
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')
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')
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')
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:
“[1m[22mThe dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
[36mℹ[39m Please use `after_stat(count)` instead.”
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')
# 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')
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')
[1m[22m`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
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
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | |
Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
Hornet Sportabout | 18.7 | 8 | 360 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
Valiant | 18.1 | 6 | 225 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 |
qplot()
qplot(wt,mpg,data=df)
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)
# Cambiando el tamaño de los puntos
qplot(wt,mpg,data=df,size=cyl)
Cambiando el tamaño y el color
qplot(wt,mpg,data=df,size=cyl,color=cyl)
# Mostrar 4 características se puede volver difícil de leer
qplot(wt,mpg,data=df,size=cyl,color=hp,alpha=0.6)
ggplot()
pl <- ggplot(data=df,aes(x = wt,y=mpg))
pl + geom_point()
Agregando una tercera caracteristica
pl <- ggplot(data=df,aes(x = wt,y=mpg))
pl + geom_point(aes(color=cyl))
# agregar colores diferentes dependiendo del numero de cilindros
pl <- ggplot(data=df,aes(x = wt,y=mpg))
pl + geom_point(aes(color=factor(cyl)))
# 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:
“[1m[22mUsing [32msize[39m for a discrete variable is not advised.”
# Usando formas diferentes
pl <- ggplot(data=df,aes(x = wt,y=mpg))
pl + geom_point(aes(shape=factor(cyl)))
# 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)
Escalas de gradientes
pl + geom_point(aes(colour = hp),size=4) + scale_colour_gradient(high='red',low = "blue")
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()
# Los gráficos de barras se apilan automáticamente cuando se colocan varias barras
# en el mismo lugar
g + geom_bar(aes(fill = drv))
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")
# Ponerlas una al lado del otra
g + geom_bar(aes(fill = drv), position = "dodge")
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)
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | |
Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
Hornet Sportabout | 18.7 | 8 | 360 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
Valiant | 18.1 | 6 | 225 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 |
qplot()
qplot(factor(cyl), mpg, data = mtcars, geom = "boxplot")
ggplot()
pl <- ggplot(mtcars, aes(factor(cyl), mpg))
pl + geom_boxplot()
# Boxplot Horizontales
pl + geom_boxplot() + coord_flip()
# Cambiar el color del relleno
pl + geom_boxplot(aes(fill = factor(cyl)))
# Cambiar el color del relleno y el color de las lineas
pl + geom_boxplot(fill = "grey", color = "blue")
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")
ggplot()
# Crear la gráfica ggplot
pl <- ggplot(movies,aes(x = year,y=rating))
Grafica de cuadriculas (2 bin chart)
pl + geom_bin2d()
# Controlar el tamaño de las cuadriculas
pl + geom_bin2d(binwidth=c(2,1))
Diagrama de densidad en 2D
pl + geom_density2d()
Gráfica hexagonal 2D
pl + geom_hex()
Warning message:
“[1m[22mComputation failed in `stat_binhex()`
Caused by error in `compute_group()`:
[1m[22m[33m![39m The package "hexbin" is required for `stat_binhex()`”
# Cambiar los colores por un gradiente
pl + geom_hex() + scale_fill_gradient(high='red',low='blue')
Warning message:
“[1m[22mComputation failed in `stat_binhex()`
Caused by error in `compute_group()`:
[1m[22m[33m![39m The package "hexbin" is required for `stat_binhex()`”
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
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))
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)
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)
# Una sola columna y varias filas con los valores de drv
p + facet_grid(drv ~ .)
# gráficas de Columnas y filas
p + facet_grid(drv ~ cyl)
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
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | |
Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
Hornet Sportabout | 18.7 | 8 | 360 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
Valiant | 18.1 | 6 | 225 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 |
# 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
# Tema blanco y negro
pl + theme_bw()
# Tema Clásico
pl + theme_classic()
# Tema oscuro
pl + theme_dark()
pl + theme_get()
# Tem de color claro
pl + theme_light()
pl + theme_linedraw()
# Tema minimalista
pl + theme_minimal()
# Tema vació (Extra minimalista)
pl + theme_void()
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()
pl + theme_economist()
pl + theme_economist_white()
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
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))
========================================
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
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
# 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)
# 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
# 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)))