Instalamos los siguientes paquetes:
library(lattice)
library(ggplot2)
library(latticeExtra)
library(RColorBrewer)
Ahora ejecutaremos las siguientes listas, donde especificaremos como queremos que sea nuestro ggplot, y que procederan de latticey latticeExtra, donde la librería latticeExtra deberá ser cargada después de la librería ggplot2 ya que si no lo hacemos así puede enmascarar algún layer:
#Esta será la configuración de Lattice y LatticeExtra
myTheme <- custom.theme.2(pch=19, cex=0.7, region=rev(brewer.pal(9, 'YlOrRd')),symbol=brewer.pal(n=8, name="Dark2"))
myTheme$strip.background$col = myTheme$strip.shingle$col =
myTheme$strip.border$col = 'transparent'
myArgs <- list( as.table=TRUE, between=list(x=0.5, y=0.2),
xscale.components = function(...)
modifyList(xscale.components.default(...), list(top=FALSE)),
yscale.components = function(...)
modifyList(yscale.components.default(...), list(right=FALSE)))
lattice.options(default.theme=myTheme, default.args=modifyList(
lattice.options()$default.args, myArgs))
Previamente tendremos que descargar las siguientes bases de datos, y una vez que las hemos descargado las cargaremos
#setwd("C:/Users/alber/OneDrive/Escritorio/Universidad/Asignaturas Universidad/3º año/Segundo cuatrimestre/Análisis estadístico de series económicas/Tema 3")
library(zoo)
load('aranjuez.RData')
load('navarra.RData')
load('CO2.RData')
Base de datos Aranjuez:
Para esta base de datos utilizaremos gráficos de tiempo en el eje horizontal, donde podremos representar series de tiempo múltiple con diferentes escalas y variables con la misma escala.
Lo siguiente que tenemos es un gráfico de tiempo con variables de diferentes escalas donde utilizaremos un panel para cada variable y la organizaremos la gráfica en filas de 1, donde aparecerá cada variable x respecto de y (tiempo) representada:
xyplot(aranjuez, layout = c(1, ncol(aranjuez)))
View(aranjuez)
#Aquí veremos la variable lluvia representada
lluvia<-xyplot(aranjuez$Rain)
lluvia
La función facet_free() nos permitirá ajustar cada variable de aranjuez con su rango correspondiente
autoplot(aranjuez) + facet_free()
\(-Series\) \(temporales\) \(de\) \(variables\) \(con\) \(la\) \(misma\) \(escala:\)
Utilizaremos la base de datos de Navarra, y dentro de ella utilizaremos para la siguiente representación la variable radiación solar en diferentes estaciones meteorológicas.
Lo que pretendemos hacer con este gráfico es mostrar el comportamiento de la colección como un todo, por tanto pondremos en la configuración superpose=TRUE y así las series se superponen. La transparencia suaviza los problemas de superposición y revela grupos de densidad porque las regiones con más líneas superpuestas son más oscuras.
avRad <- zoo(rowMeans(navarra, na.rm = 1), index(navarra))
pNavarra <- xyplot(navarra - avRad,
superpose = TRUE, auto.key = FALSE,
lwd = 0.5, alpha = 0.3, col = 'midnightblue')
pNavarra
El resultado obtenido es mejorable, ya que el gráfico horizontal nos muestra como varía en este caso la variable radiación solar en diferentes estaciones meteorológicas a lo largo del tiempo.
En el siguiente código muestra las variaciones de la radiación solar alrededor del promedio de tiempo con un gráfico de horizonte utilizando una fila para cada serie de tiempo.
En este caso cada panel tiene diferentes escalas y los colores en cada panel representan desviaciones del origen.
horizonplot(navarra - avRad,
layout = c(1, ncol(navarra)),
origin = 0, ## Deviations in each panel are calculated
## from this value
colorkey = TRUE,
col.regions = brewer.pal(6, "RdBu"))
El gráfico horizontal también nos servirá para ver las diferencias entre una serie de tiempo univariante y otra referencia. En este caso como ejemplo vamos a representar las temperaturas medias diarias medidas en la estación meteorológica de Aranjuez. El promedio diario a largo plazo lo calcularemos con la función ave.
Ta <- aranjuez$TempAvg
timeIndex <- index(aranjuez)
longTa <- ave(Ta, format(timeIndex, '%j')) #Ave calcula el promerio diario a largo plazo
diffTa <- (Ta - longTa)
Y ahora con la función horizonplot distinguiremos los diferentes años:
years <- unique(format(timeIndex, '%Y'))
horizonplot(diffTa, cut = list(n = 8, overlap = 0), #8 filas(8 años)
colorkey = TRUE, layout = c(1, 8),
scales = list(draw = FALSE, y = list(relation = 'same')),
origin = 0, strip.left = FALSE) +
layer(grid.text(years[panel.number()], x = 0, y = 0.1,
gp = gpar(cex = 0.8),
just = "left"))
Una alternativa a este gráfico es el gráfico de nivel donde se utilizan las partes del índice de tiempo tanto como variable independiente como condicionante. A continuación veremos la representación donde el eje y será los meses y el eje x será los diferentes días del mes.
year <- function(x)as.numeric(format(x, '%Y'))
day <- function(x)as.numeric(format(x, '%d'))
month <- function(x)as.numeric(format(x, '%m'))
myTheme <- modifyList(custom.theme(region = brewer.pal(9, 'RdBu')),
list(
strip.background = list(col = 'gray'),
panel.background = list(col = 'gray')))
maxZ <- max(abs(diffTa))
levelplot(diffTa ~ day(timeIndex) * year(timeIndex) | factor(month(timeIndex)),
at = pretty(c(-maxZ, maxZ), n = 8),
colorkey = list(height = 0.3),
layout = c(1, 12), strip = FALSE, strip.left = TRUE,
xlab = 'Day', ylab = 'Month',
par.settings = myTheme)
La función ggplot2 requerirá un data.frame donde el día, mes y año esté organizado en diferentes columnas.
df <- data.frame(Vals = diffTa,
Day = day(timeIndex),
Year = year(timeIndex),
Month = month(timeIndex))
Para representar los valores (vals del data.frame anterior) como un gráfico utilizaremos la función geom_raster.
library(scales)
#Será de 2004 a 2010 cada 2 años, el eje y será los 12 meses y el eje x será los días del mes
ggplot(data = df,
aes(fill = Vals,
x = Day,
y = Year)) +
facet_wrap(~ Month, ncol = 1, strip.position = 'left') +
scale_y_continuous(breaks = pretty_breaks()) +
scale_fill_distiller(palette = 'RdBu', direction = 1) +
geom_raster() +
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank())
\(-Gráficos\) \(interactivos:\)
Estos gráficos describen las alternativas interactivas de figuras estáticas incluidas las vistas en la sección anterior, para utilizar estos gráficos tendremos que instalar los paquetes dygraphs, highcharter, and plotl basados en la librería htmlwidgets.
\(-Diagramas:\)
Dyagraph es un paquete que proporciona facilidades para trazar series temporales. Este paquete funciona con objetos xts de series temporales. El resulto de los diagramas es un gráfico interactivo, que según movemos el ratón sobre las series de tiempo nos aparece por ejemplo en este caso la temperatura mínima, máxima y la temperatura media, también nos aparecerá la fecha donde nos encontramos en ese momento al arrastrar el ratón. Por tanto es un gráfico muy dinámico e interesante, ya que incluye varias funciones interactivas que hacen del diagrama un gráfico muy atractivo.
library(dygraphs)
dyTemp <- dygraph(aranjuez[, c("TempMin", "TempAvg", "TempMax")],
main = "Temperature in Aranjuez",
ylab = "ºC")
widgetframe::frameWidget(dyTemp)
Para personalizar el diagrama utilizaremos la función dyoptions en donde podemos encontrar varias opciones para nuestro gráfico y la función dyHighlight configura las opciones para cuando pasamos el ratón por encima del gráfico. Por ejemplo con el siguiente código lo que hace es que al pasar el ratón según por encima de que variable, esa variable se quedaría en color y las otras semitransparentes.
dyTemp %>%
dyHighlight(highlightSeriesBackgroundAlpha = 0.2,
highlightSeriesOpts = list(strokeWidth = 2)) %>%
widgetframe::frameWidget()
Una alternativa a esta gráfica es que las variables superior e inferior de una serie de tiempo tenga una región sombreada. La función dySeries acepta un vector que sea de longitud 3 que darán entrada al valor inferior, medio y superior para una serie con una región sombreada a su alrededor:
dygraph(aranjuez[, c("TempMin", "TempAvg", "TempMax")],
main = "Temperature in Aranjuez",
ylab = "ºC") %>%
dySeries(c("TempMin", "TempAvg", "TempMax"),
label = "Temperature") %>%
widgetframe::frameWidget()
\(-Highcharter:\)
El paquete Highcharter y varias funciones hc_add_series_xts y %>% hacen que el resultado de este gráfico sea interactivo y tenga la capacidad de seleccionar y hacer zoom.
library(highcharter)
library(xts)
aranjuezXTS <- as.xts(aranjuez)
highchart() %>%
hc_add_series(name = 'TempMax',
aranjuezXTS[, "TempMax"]) %>%
hc_add_series(name = 'TempMin',
aranjuezXTS[, "TempMin"]) %>%
hc_add_series(name = 'TempAvg',
aranjuezXTS[, "TempAvg"]) %>%
widgetframe::frameWidget()
\(-Plotly:\)
El paquete plotly no proporciona ninguna función específica para series de tiempo, por tanto el objeto de la serie temporal tiene que transformarse en una columna de data.frame que incluya índice de tiempo. Si el data.frame está en formato ancho (una columna por variable), cada variable se representará con una función add_lines. Si el data.frame está en formato largo sólo se requiere utilizar una vez add_lines. En el siguiente código que utilizaremos haremos una combinación de fortify, para combertir el objeto zoo en un data.frame y en un melt, y para transformar el formato de ancho a largo.
aranjuezDF <- fortify(aranjuez[,
c("TempMax",
"TempAvg",
"TempMin")],
melt = TRUE)
summary(aranjuezDF)
## Index Series Value
## Min. :2004-01-01 TempMax:2898 Min. :-12.980
## 1st Qu.:2005-12-29 TempAvg:2898 1st Qu.: 7.107
## Median :2008-01-09 TempMin:2898 Median : 13.560
## Mean :2008-01-03 Mean : 14.617
## 3rd Qu.:2010-01-03 3rd Qu.: 21.670
## Max. :2011-12-31 Max. : 41.910
## NA's :10
Ahora haremos un gráfico interactivo con la función plot_ly y que esté relacionada con la función add_lines:
library(plotly)
plot_ly(aranjuezDF) %>%
add_lines(x = ~ Index,
y = ~ Value,
color = ~ Series) %>%
widgetframe::frameWidget()
\(-El\) \(tiempo\) \(como\) \(condicionante\) \(o\) \(variable\) \(de\) \(agrupación:\)
Anteriormente vimos a mostrar la evolución temporal de múltiples series de tiempo con diferentes escalas, pero en esta sección veremos en primer lugar una matriz de dispersión que se agrupa en función del tiempo como una variable de agrupación, y segundo, un diagrama de dispersión donde el tiempo será variable de acondicionamiento utilizando la técnica de múltiplos pequeños.
\(-Scatterplot\) \(matrix:\) \(el\) \(tiempo\) \(como\) \(una\) \(variable\) \(de\) \(agrupación:\)
Las matrices de diagrama de dispersión se basan en la técnica de pequeños múltiplos: pequeñas representaciones en miniatura de imágenes múltiples que se muestran todas a la vez, lo que permite al lector comparar de forma inmediata y paralela las diferencias entre cuadros. Lo que permite una visualización de todos los diagramas de dispersión bivariados por pares dispuestos en una matriz \(p\ veces p\) para las variables \(p\) .
Esta representación gráfica se hará con la función splom y lo que representaremos en el siguiente código será la relación entre el conjunto de variables meteorológicas utilizando una paleta secuencial del catálogo ColorBrewer. El orden de colores de esta paleta se elige para mostrar los meses de verano con colores intensos y para distinguir entre la primera y segunda mitad del año con rojo y azul, respectivamente.
aranjuezDF <- as.data.frame(aranjuez)
aranjuezDF$Month <- format(index(aranjuez), '%m')
## Red-Blue palette with black added (12 colors)
colors <- c(brewer.pal(n = 11, 'RdBu'), '#000000')
## Rearrange according to months (darkest for summer)
colors <- colors[c(6:1, 12:7)]
splom(~ aranjuezDF[1:10], ## Do not include "Month"
groups = aranjuezDF$Month,
auto.key = list(space = 'right',
title = 'Month', cex.title = 1),
pscale = 0, varname.cex = 0.7, xlab = '',
par.settings = custom.theme(symbol = colors,
pch = 19),
cex = 0.3, alpha = 0.1)
La función ggplot2 de este gráfico gracias a la función ggpairs.
library(GGally)
ggpairs(aranjuezDF,
columns = 1:10, ## Do not include "Month"
upper = list(continuous = "points"),
mapping = aes(colour = Month, alpha = 0.1))
## Warning: Removed 3 rows containing missing values (geom_point).
## Warning: Removed 7 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 11 rows containing missing values (geom_point).
## Warning: Removed 14 rows containing missing values (geom_point).
## Warning: Removed 3 rows containing missing values (geom_point).
## Warning: Removed 3 rows containing non-finite values (stat_density).
## Warning: Removed 7 rows containing missing values (geom_point).
## Warning: Removed 5 rows containing missing values (geom_point).
## Warning: Removed 14 rows containing missing values (geom_point).
## Warning: Removed 3 rows containing missing values (geom_point).
## Warning: Removed 3 rows containing missing values (geom_point).
## Warning: Removed 3 rows containing missing values (geom_point).
## Warning: Removed 3 rows containing missing values (geom_point).
## Warning: Removed 17 rows containing missing values (geom_point).
## Warning: Removed 7 rows containing missing values (geom_point).
## Warning: Removed 7 rows containing missing values (geom_point).
## Warning: Removed 7 rows containing non-finite values (stat_density).
## Warning: Removed 9 rows containing missing values (geom_point).
## Warning: Removed 18 rows containing missing values (geom_point).
## Warning: Removed 7 rows containing missing values (geom_point).
## Warning: Removed 7 rows containing missing values (geom_point).
## Warning: Removed 7 rows containing missing values (geom_point).
## Warning: Removed 7 rows containing missing values (geom_point).
## Warning: Removed 17 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 5 rows containing missing values (geom_point).
## Warning: Removed 9 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing non-finite values (stat_density).
## Warning: Removed 11 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 16 rows containing missing values (geom_point).
## Warning: Removed 11 rows containing missing values (geom_point).
## Warning: Removed 14 rows containing missing values (geom_point).
## Warning: Removed 18 rows containing missing values (geom_point).
## Warning: Removed 11 rows containing missing values (geom_point).
## Warning: Removed 11 rows containing non-finite values (stat_density).
## Warning: Removed 11 rows containing missing values (geom_point).
## Warning: Removed 11 rows containing missing values (geom_point).
## Warning: Removed 11 rows containing missing values (geom_point).
## Warning: Removed 11 rows containing missing values (geom_point).
## Warning: Removed 17 rows containing missing values (geom_point).
## Warning: Removed 3 rows containing missing values (geom_point).
## Warning: Removed 7 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 11 rows containing missing values (geom_point).
## Warning: Removed 14 rows containing missing values (geom_point).
## Warning: Removed 3 rows containing missing values (geom_point).
## Warning: Removed 7 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 11 rows containing missing values (geom_point).
## Warning: Removed 14 rows containing missing values (geom_point).
## Warning: Removed 3 rows containing missing values (geom_point).
## Warning: Removed 7 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 11 rows containing missing values (geom_point).
## Warning: Removed 14 rows containing missing values (geom_point).
## Warning: Removed 3 rows containing missing values (geom_point).
## Warning: Removed 7 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 11 rows containing missing values (geom_point).
## Warning: Removed 14 rows containing missing values (geom_point).
## Warning: Removed 14 rows containing missing values (geom_point).
## Warning: Removed 17 rows containing missing values (geom_point).
## Warning: Removed 17 rows containing missing values (geom_point).
## Warning: Removed 16 rows containing missing values (geom_point).
## Warning: Removed 17 rows containing missing values (geom_point).
## Warning: Removed 14 rows containing missing values (geom_point).
## Warning: Removed 14 rows containing missing values (geom_point).
## Warning: Removed 14 rows containing missing values (geom_point).
## Warning: Removed 14 rows containing missing values (geom_point).
## Warning: Removed 14 rows containing non-finite values (stat_density).
\(-Diagrama\) \(de\) \(dispersión\) \(con\) \(el\) \(tiempo\) \(como\) \(variable\) \(condicionante:\)
Las gráficas anteriores que hemos realizado usan colores para distinguir los diferentes meses, pero ahora los diagramas de dispersión estarán separados para cada mes.
Para realizar este diagrama habrá que pasar primero el conjunto de datos del formato ancho al largo. Esto lo haríamos con la función melt que está incluida en el paquete reshape2.
library(reshape2)
aranjuezRshp <- melt(aranjuezDF,
measure.vars = c('TempMax',
'TempAvg',
'TempMin'),
variable.name = 'Statistic',
value.name = 'Temperature')
Esta matriz de paneles se puede hacer haciendo uso de la función ggplot y facet_grid. Con el siguiente código mostraremos la densidad de puntos de ambas variables y una línea ligera línea en cada panel. En este caso mostrará la temperatura máxima, media y mínima para cada mes.
ggplot(data = aranjuezRshp, aes(Radiation, Temperature)) +
facet_grid(Statistic ~ Month) +
geom_point(col = 'skyblue4', pch = 19, cex = 0.5, alpha = 0.3) +
geom_rug() +
stat_smooth(se = FALSE, method = 'loess',
col = 'indianred1', lwd = 1.2) +
theme_bw()
## Warning: Removed 10 rows containing non-finite values (stat_smooth).
## Warning: Removed 10 rows containing missing values (geom_point).
Para la versión lattice usaremos la función useOuterStrips del paquete latticeExtra. Estas funciones hacen que saque los nombres de las variables condicionantes en los márgenes inferior y superior.
useOuterStrips(
xyplot(Temperature ~ Radiation | Month * Statistic,
data = aranjuezRshp,
between = list(x = 0),
col = 'skyblue4', pch = 19,
cex = 0.5, alpha = 0.3)) +
layer({
panel.rug(..., col.line = 'indianred1',
end = 0.05, alpha = 0.6)
panel.loess(..., col = 'indianred1',
lwd = 1.5, alpha = 1)
})
\(-El\) \(tiempo\) \(como\) \(variable\) \(complementaria:\)
En este apartado veremos como el tiempo será una variable complementaria y que añade información al gráfico donde se enfrentarán varias variables. Como ejemplo haremos un gráfico sobre la evolución de la relación entre el ingreso nacional bruto (INB) y las emisiones de dióxido de carbono (\(CO_2\) ) para un conjunto de países extraídos de la base de datos de datos abiertos del Banco Mundial. Intentaremos mostrar en el gráfico la relación entre las emisiones de \(CO_2\) y el INB a lo largo de los años utilizando el tiempo como una variable complementaria.
\(-Polilíneas:\)
Nuestro primer objetivo será mostrar los datos en un diagrama de dispersión agrupando los datos por países. Los puntos de cada país estarán unidos para revelar la evolución del tiempo.
## lattice version
xyplot(GNI.capita ~ CO2.capita, data = CO2data,
xlab = "Emisiones de dióxido de carbono (toneladas per cápita)",
ylab = "GNI per capita, PPP (medido en $)",
groups = Country.Name, type = 'b')
\(-Se\) \(pueden\) \(realizar\) \(3\) \(mejoras\) \(para\) \(el\) \(resultado\) \(del\) \(gráfico:\)
1.Definir una paleta mejor para mejorar la diferencia entre países. 2.Mostrar una etiqueta con el tiempo para poder ver los años. 3.Etiquetar cada línea con el nombre del país en vez de hacer una leyenda.
\(-Elección\) \(de\) \(colores:\)
La variable Country.Name tendrá una paleta cualitativa, es decir, los primeros 5 colores de la paleta Set1 del paquete RColorBrewer. Al haber más países que colores, algún color se repetirá para completar todos los países de la variable Country.Name, pero este no será un problema que nos influya, ya que habrá una etiqueta donde ponga el nombre de cada país.
nCountries <- nlevels(CO2data$Country.Name)
pal <- brewer.pal(n = 5, 'Set1')
pal <- rep(pal, length = nCountries)
Un enfoque simple es calcular el promedio anual de la variable que se representará a lo largo del eje x (variable CO2.capita) y extraer colores de la paleta de acuerdo con el orden de este valor.
## Rango de valores promedio de CO2 per cápita
CO2mean <- aggregate(CO2.capita ~ Country.Name,
data = CO2data, FUN = mean)
palOrdered <- pal[rank(CO2mean$CO2.capita)]
myTheme <- simpleTheme(pch = 19, cex = 0.6, col = palOrdered)
## lattice version
pCO2.capita <- xyplot(GNI.capita ~ CO2.capita,
data = CO2data,
xlab = "Emisiones de dióxido de carbono (toneladas per cápita)",
ylab = "GNI per capita, PPP (medido en $)",
groups = Country.Name,
par.settings = myTheme,
type = 'b')
pCO2.capita
## versión ggplot2
gCO2.capita <- ggplot(data = CO2data,
aes(x = CO2.capita,
y = GNI.capita,
color = Country.Name)) +
geom_point() + geom_path() +
scale_color_manual(values = palOrdered, guide = FALSE) +
xlab('Emisiones de dióxido de carbono (toneladas per cápita)') +
ylab('GNI per capita, PPP (medido en $)') +
theme_bw()
\(-Etiquetas\) \(para\) \(mostrar\) \(la\) \(información\) \(del\) \(tiempo:\)
Estas etiquetas mostrarán el año para poder ver la evolución del tiempo. Utilizaremos la función panel.text que imprime en pantalla la etiqueta de los años con la combinación de +.trellis, glayer_y panel.text. y utilizando glayer_lugar de glayer(paquete) nos aseguramos de que las etiquetas se impriman debajo de las líneas.
## lattice version
pCO2.capita <- pCO2.capita +
glayer_(panel.text(...,
labels = CO2data$Year[subscripts],
pos = 2, cex = 0.5, col = 'gray'))
pCO2.capita
## versión ggplot2
gCO2.capita <- gCO2.capita + geom_text(aes(label = Year),
colour = 'gray',
size = 2.5,
hjust = 0, vjust = 0)
\(-Etiqueta\) \(con\) \(nombre\) \(de\) \(los\) \(países:\)
La solución para relacionar la curva de valor con el país será hacer una leyenda,que a veces puede parecer confusa al tener muchos elementos. Para mejorar la técnica de poner una leyenda con los países, la solución será etiquetar cada línea usando un texto cercano con la misma codificación de color. Estas etiquetas estarán al lado de las curvas y evitarán la superposición entre líneas y etiquetas. Con el paquete directlabel podremos modificar el posicionamiento para hacer frente a la superposición. La función direct.label es capaz de determinar el método adecuado para cada gráfico, aunque luego el usuario puede elegir un método personalizado o diferente. Utilizaremos el método extrem.grid para la variable CO2.capita.
library(directlabels)
## lattice version
direct.label(pCO2.capita,
method = 'extreme.grid')
## versión ggplot2
direct.label(gCO2.capita, method = 'extreme.grid')
\(-Animación\) \(en\) \(gráficos\) \(interactivos:\)
En este apartado veremos como podemos mostrar los datos a través de iteraciones y que es parecida al diagrama de movimiento publicado por Gapminder. Gapminder es una fundación independiente con sede en Estocolmo y su misión es “desacreditar mitos devastadores sobre el mundo ofreciendo acceso gratuito a una visión del mundo basada en hechos”, estos proporcionan herramientas gratuitas en línea, datos y vídeos. Imitaremos la solución Trendalyzer / Motion Chart con el paquete plotly, utilizando burbujas de viaje de diferentes colores y con un radio proporcional a los valores de la variable CO2.PPP. El paquete plotly ya lo hemos utilizado anteriormente para realizar gráficos interactivos que representan el tiempo en el eje x, además añadiremos las funciones plot_ly,add_makers y animation_slider. Las variables CO2.capita y GNI.capita las representaremos en el eje x e y.
library(plotly)
p <- plot_ly(CO2data,
x = ~CO2.capita,
y = ~GNI.capita,
sizes = c(10, 100),
marker = list(opacity = 0.7,
sizemode = 'diameter'))
CO2.PPP se codifica con los tamaños de los círculos, mientras que Country.Namese semrepresenta con colores y con etiquetas.
p <- add_markers(p,
size = ~CO2.PPP,
color = ~Country.Name,
text = ~Country.Name, hoverinfo = "text",
ids = ~Country.Name,
frame = ~Year,
showlegend = FALSE)
Finalmente, la animación se hará con la función animation_opts,donde podremos personalizar el marco y los tiempos de transición, y con la función animation_slider podremos definir el control deslizante.
p <- animation_opts(p,
frame = 1000,
transition = 800,
redraw = FALSE)
p <- animation_slider(p,
currentvalue = list(prefix = "Year "))
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors
widgetframe::frameWidget(p)
En esta gráfica interactiva tendremos un control deslizante donde cada vez que lo deslicemos aumentaran los años e iremos viendo como va cambiando la gráfica. También si pasamos por encima de la gráfica con el ratón podremos ver que país es.
\(-Agradecimientos:\)
Queremos dar las gracias al autor del artículo Oscar Perpiñán Lamigueiro por la realización del artículo original.