3 Visualización de datos con R y ggplot2

Se basa en siete componentes principales: - DATA FRAME which contains the data you’re trying to plot. - AESTHETIC MAPPINGS determine how data are mapped to color, size, etc. - The GEOMS (geometric objects) are what you see in the plot (points, lines, shapes) - FACETS are the panels used in conditional plots. - STATS are statistical transformations such as binning, quantiles, and smoothing which ggplot2 applies to the data. - SCALES show what coding an aesthetic map uses (for example, male = red, female = blue). - plots are depicted on a COORDINATE SYSTEM. When you use qplot these were taken care of for you.

g+geom_point()+geom_smooth(method="lm")+facet_grid(.~drv)

Donde g es un “objeto gráfico” de ggplot guardado como variable:

g<-ggplot(mpg,aes(displ,hwy))

El primer valor mpg es el conjunto de datos, y luego, dentro de la función “estética” aes, van como argumento las dos variables que queremos graficar. geom_point() es una capa que al estar vacía grafica un gráfico de dispersión. geom_smooth() con su argumento vacío grafica el intervalo de confianza. Pero al llevar lm como argumento, grafica una línea de regresión. facet_grid(.~drv) desagrega los datos en facetas según la variable indicada. Otros elementos, como títulos ggtitle y etiquetas ylab xlab se añaden como suma.

Ejemplos:

g+geom_point(aes(color=drv))+labs(title="Swirl Rules!")+labs(x="Displacement",y="Hwy Mileage")
g+geom_point(aes(color=drv), size=2,alpha=1/2)+geom_smooth(size=4,linetype=3,method="lm",se=FALSE)

alpha grafica los puntos del plot transparentes. linetype vuelve la línea en intermitente. se elimina el intervalo de confianza.

g+geom_point(aes(color=drv))+theme_bw(base_family="Times")

Graficar variable como factor (para que sólo aparezcan en el eje los valores presentes): factor(variable)

3.0.0.1 Gráfico con múltiples instancias según variable

Se usa la capa facet:

ggplot(iris.tidy, aes(x = Species, y = Value, col = Part)) +
  geom_jitter() +
  facet_grid(. ~ Measure)

3.1 Tipos de gráfico

Ejemplos de los distintos tipos de gráficos que se pueden hacer en R

3.1.1 Barras

geom_bar
ggplot(Tarapaca, aes(y=Nacimientos, x=Año)) + geom_bar(stat="identity")
ggplot(df2, aes(measurements, value)) + 
  geom_line(aes(colour = samples, group = samples))

Barras una sobre otra:

cyl.am <- ggplot(mtcars, aes(x = factor(cyl), fill = factor(am)))

## Add geom (position = "stack" by default)
cyl.am + 
geom_bar(position = "stack")

Barras encima de otras pero llenando el eje vertical:

## Fill - show proportion
cyl.am + 
  geom_bar(position = "fill")  

Barras lado a lado:

## Dodging - principles of similarity and proximity
cyl.am +
  geom_bar(position = "dodge") 

Barras lado a lado pero superpuestas:

ggplot(mtcars, aes(x = cyl, fill = am)) +
  geom_bar(position = "dodge")

## 2 - Define posn_d with position_dodge()
posn_d <- position_dodge(width=0.2)

## 3 - Change the position argument to posn_d
ggplot(mtcars, aes(x = cyl, fill = am)) +
  geom_bar(position = posn_d)


## 4 - Use posn_d as position and adjust alpha to 0.6
ggplot(mtcars, aes(x = cyl, fill = am)) +
  geom_bar(position = posn_d, alpha=0.6)

Para definir el color de las barras, hay que cambiar col y fill:

m <- ggplot(mtcars, aes(x = cyl,y = wt, col = am, fill = am))

De barras con porcentaje para variables categóricas o factores:

ggplot(eme2, aes(x = sexo)) + 
  geom_bar(aes(y = (..count..)/sum(..count..), fill=sexo)) +
  scale_y_continuous(labels=scales::percent) +
  geom_text(aes(y = ((..count..)/sum(..count..)), 
                label = scales::percent((..count..)/sum(..count..))), 
                stat = "count", 
                vjust = 4,
                color="white")

3.1.1.1 Barra “dinamita” (con marcas de error)

## Base layers
m <- ggplot(mtcars, aes(x = cyl, y = wt))

## Draw dynamite plot
m +
  stat_summary(fun.y = mean, geom = "bar", fill = "skyblue") +
  stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1), geom = "errorbar", width = 0.1)
## Base layers
m <- ggplot(mtcars, aes(x = cyl, y = wt))

## Set your dodge posn manually
posn.d <- position_dodge(0.9)

## Plot 3: Redraw dynamite plot
m +
  stat_summary(fun.y = mean, geom = "bar", position = posn.d) +
  stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1), geom = "errorbar", width = 0.1, position = posn.d)

Gráfico de barras con faceta:

ggplot(email, aes(x= number)) +
  geom_bar() +
  facet_wrap(.~spam)

3.1.2 Dispersión

Útil para agregar sobre boxplots.

+ geom_jitter(color="steelblue", alpha=0.3) +
    geom_boxplot(alpha=0)

3.1.3 Torta

Representa la distribución de categorías dentro de un todo.

Gráfico de torta:

## Create a stacked bar plot: wide.bar
wide.bar <- ggplot(mtcars, aes(x = 1, fill = cyl)) +
              geom_bar()

## Convert wide.bar to pie chart
wide.bar +
  coord_polar(theta = "y")

Gráfico de anillo:

## Create stacked bar plot: thin.bar
thin.bar <- ggplot(mtcars, aes(x = 1, fill = cyl)) +
              geom_bar(width = 0.1) +
              scale_x_continuous(limits = c(0.5,1.5))

## Convert thin.bar to "ring" type pie chart
thin.bar + 
  coord_polar(theta = "y")

Definir los colores:

scale_fill_manual(values=c("##320D70", "##DF1A58"))

Torta de variable categórica o factores con porcentajes:

eme_genero2_gg <- eme2 %>%
  ggplot(aes(x=1, fill=sexo)) + 
  geom_bar(position="stack",width = 0.5, aes(y = (..count..)/sum(..count..))) +
  scale_y_continuous(labels=scales::percent) +
  scale_x_continuous(limits = c(0.5,1.3)) +
  scale_fill_manual(values=c("##320D70", "##DF1A58")) +
  geom_text(aes(y = ((..count..)/sum(..count..)), 
              label = scales::percent((..count..)/sum(..count..))), 
              stat = "count", 
              vjust = -9,
              color="white") +
    theme(axis.title = element_blank(),
      axis.text = element_blank(),
      axis.ticks = element_blank(),
      rect = element_blank(),
      panel.grid = element_blank(),
      legend.title = element_blank(),
      legend.direction = "horizontal",
      legend.position = "bottom") +
    labs(title="Microemprendedores según género") +
  coord_polar(theta = "y")

Ejemplo:

eme_genero_gg <- eme2 %>%
    ggplot(aes(x = 1, sexo, fill = sexo)) +
   geom_col() +
    scale_fill_manual(values=c("##320D70", "##DF1A58")) +
    coord_polar(theta = "y") +
    theme(axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        rect = element_blank(),
        panel.grid = element_blank(),
        legend.title = element_blank(),
  legend.direction = "horizontal",
legend.position = "bottom") +
  labs(title="Microemprendedores según género")

eme_genero_gg

Ejemplo:

extranjeros_verano <- turismo %>%
    filter(periodo=="Verano") %>%
    mutate(extranjeros = case_when(nacionalidad == "Chile" ~ "Chilena",
                                   TRUE ~ "Extranjera")) %>%
    group_by(extranjeros) %>%
    summarize(cantidad = n()) %>%
    ggplot(aes(x=1, y=cantidad, fill=extranjeros)) +
    geom_col() +
    coord_polar(theta = "y", start=0, direction = -1) +
    scale_fill_discrete(name = "Nacionalidad") +
    theme(axis.text = element_blank(), axis.title = element_blank()) +
    ##geom_text(aes(x=1, y = cumsum(cantidad) - cantidad/3, label = percent(cantidad/sum(cantidad)))) +
    geom_text(aes(label = percent(cantidad/sum(cantidad), accuracy=1)), position = position_stack(vjust = 0.5)) +
    labs(subtitle="Verano")

3.1.4 Densidad

geom_density

El gráfico de densidad es una línea curva de la silueta del histograma:

ggplot(common_cyl, aes(x = city_mpg, fill = as.factor(ncyl))) +
  geom_density(alpha = .3)

La desviación estándar bw suaviza el histograma.

ggplot(truck_speeding, aes(x = hour_of_day)) +
    ## switch to density with bin width of 1.5, keep fill 
    geom_density(fill = 'steelblue', bw=1.5) +
    ## add a subtitle stating binwidth
    labs(title = 'Citations by hour', subtitle= "Gaussian kernel SD= 1.5")

Parámetros: - bw - the smoothing bandwidth to be used, see ?density for details - adjust - adjustment of the bandwidth, see density for details - kernel - kernel used for density estimation, defined as - “g” = gaussian - “r” = rectangular - “t” = triangular - “e” = epanechnikov - “b” = biweight - “c” = cosine - “o” = optcosine

3.1.5 Boxplot

ggplot(aes(x = 1, y = city_mpg)) +
  geom_boxplot()

Se puede poner 1 en el eje x para mostrar solo un boxplot.

El ancho de cada caja puede depender de la cantidad de casos:

geom_boxplot(varwidth=TRUE)

3.1.6 Curvas y modelos lineales

Agregar líneas de regresión al gráfico

geom_smooth

Curva Loess:

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() +
  geom_smooth()

Cambiar

Línea de regresión:

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() +
  geom_smooth(method="lm", se=FALSE) ## línea de regresión

Ejemplo:

ggplot(mtcars, aes(x = wt, y = mpg, col = factor(cyl))) +
  geom_point() +
  stat_smooth(method = "lm", se = FALSE) +
  stat_smooth(method = "lm", se = FALSE, aes(group=1))
myColors <- c(brewer.pal(3, "Dark2"), "black")

ggplot(mtcars, aes(x = wt, y = mpg, col = factor(cyl))) +
  geom_point() +
  stat_smooth(method = "lm", se = FALSE, span = 0.7) +
  stat_smooth(method = "loess", 
              aes(group = 1, col="All"), 
              se = FALSE, span = 0.7) +
  scale_color_manual("Cylinders", values=myColors)

3.1.7 Barras redondeadas

library(ggchicklet)

ggplot(count(mtcars, cyl), aes(x = cyl, y = n)) +
  geom_chicklet(radius = grid::unit(15, 'mm'), fill = 'skyblue') +
  theme_minimal()

3.1.9 Convertir a 3D

https://www.rayshader.com

3.1.10 Estadísticas en gráficos

Curva normal:

+ stat_function
## Plot 2: Mean and SD - the easy way
wt.cyl.am +
stat_summary(fun.data=mean_sdl, fun.args=list(mult=1), position=posn.d)


## Plot 3: Mean and 95% CI - the easy way
wt.cyl.am +
stat_summary(fun.data=mean_cl_normal, position=posn.d)


## Plot 4: Mean and SD - with T-tipped error bars - fill in ___
wt.cyl.am +
  stat_summary(geom = "point", fun.y = mean,
               position = posn.d) +
  stat_summary(geom = "errorbar", fun.data = mean_sdl,
               position = posn.d, fun.args = list(mult = 1), width = 0.1)

3.1.11 Crestas

library(ggridges)
p + geom_density_ridges()
md_speeding %>% 
    mutate(day_of_week = factor(day_of_week, levels = c("Mon","Tues","Wed","Thu","Fri","Sat","Sun") )) %>% 
    ggplot(aes( x = percentage_over_limit, y = day_of_week)) + 
    ## make ridgeline densities a bit see-through with alpha = 0.7
    geom_density_ridges(bandwidth = 3.5, alpha=0.7) +
    ## set expand values to c(0,0)
    scale_x_continuous(limits = c(0,150), expand=c(0,0)) +
    labs(subtitle = 'Guassian kernel SD = 3.5') +
    ## remove y axis ticks
    theme(axis.ticks.y=element_blank())

3.1.12 Enjambre

Alternativa al boxplot. Agrega dispersión de forma inteligente, con los puntos lo más cercanos al eje.

library(ggbeeswarm)
p + geom_beeswarm()

Muestra todos los puntos de datos y la forma de la distribución. Funciona mal con demasiados datos.

Cambiar el tamaño de los puntos:

geom_beeswarm(cex=0.5) +

3.1.13 Violín

Alternativa al boxplot. Muestra la distirbución de forma simétrica.

geom_violin()

Funciona bien con muchos datos, pero no muestra cada dato individualmente.

geom_violin(bw = 2.5) +

3.1.14 Líneas

geom_line
ggplot(economics, aes(x = date, y = unemploy/pop)) +
geom_line()
ggplot(fish.tidy, aes(x = Year, y = Capture, color=Species)) + geom_line()
ggplot(ChickWeight, aes(x = Time, y = weight, col=Diet)) +
  geom_line(aes(group = Chick), alpha=0.3) +
  geom_smooth(lwd=2, se=FALSE)

Seis mapas de líneas horizontalmente:

ggplot(barley, aes(x=year, y=yield, col=variety, group=variety)) +
geom_line() +
facet_wrap( ~ site, nrow= 1)

Planos de líneas de promedios con desviación estándar como barritas transparentes:

## Create overlapping ribbon plot from scratch
ggplot(barley, aes(year, yield, col= site, group=site, fill=site)) +
stat_summary(fun.y=mean, geom="line") +
stat_summary(fun.data=mean_sdl, fun.args=list(mult=1), geom="ribbon", col=NA, alpha=0.1)

3.1.15 Histograma

geom_histogram

A mayor binwidth, más gruesas las líneas. bins es el número de barras. center hace que la barra central esté en un punto determinado.

ggplot(mtcars, aes(x = mpg)) +
  geom_histogram(aes(y=..density..), binwidth=1, bins=40, fill="##377EB8")
ggplot(adult, aes(SRAGE_P, fill=factor(RBMI))) + geom_histogram(binwidth=1)
qplot(var1,data=datos,fill=var2)

Con color

qplot(var1,var2,data=datos,facets=.~var3)

Tres histogramas horizontalmente, divididos por variable 3.

qplot(var1,data=datos,facets=var2~.,binwidth=2)

Tres histogramas, uno encima del otro.

Polígono de frecuencias:

ggplot(mtcars, aes(mpg, color=cyl)) +
  geom_freqpoly(binwidth=1)

Alfombra de casos:

+ geom_rug

3.1.16 Dumbell

ggplot(first_last, aes(x = series, y = viewers, color = episode)) +
  geom_point() + ## keep
  geom_line(aes(group = series)) + ## keep
  coord_flip() ## keep

3.1.17 Mapas de calor

geom_tile
## Create color palette
myColors <- brewer.pal(9, "Reds")

## Build the heat map from scratch
ggplot(barley, aes(x = year, y = variety, fill = yield)) +
  geom_tile() + ## Geom layer
  facet_wrap( ~ site, ncol = 1) + ## Facet layer
  scale_fill_gradientn(colors = myColors) ## Adjust colors

3.1.18 Splom (scatterplot matrix)

pairs(datos)
library(PerformanceAnalytics)
chart.Correlation(iris[1:4])
library(GGAlly)
ggpairs(datos[1:9])

3.1.19 Matriz de correlación

3.1.20 Coordenadas paralelas

ggparcoord(datos, columns =1:4, groupColumn=5, scale="globalminmax", order="anyClass", alphaLines=0.4)

3.1.22 Mapa de densidad

Mapa lineal de densidad, como un mapa topográfico:

geom_density_2d()

Mapa con degradado de calor:

geom_density_2d(geom="tile", aes(fill=..density..), contour=FALSE)

Mapa de círculos:

geom_density_2d(geom="point", aes(fill=..density..), n=20, contour=FALSE) + 
scale_size(range=c(0,9))

Agregar línea de medianas:

p+geom_vline(data=mu, aes(xintercept=grp.mean, color=sex),
             linetype="dashed")

3.1.23 Scatter

Permiten explorar preguntas e hipótesis iniciales, sugerir estrategias para siguientes pasos, y resumir los datos gráficamente para destacar características generales.

geom_point

Requiere especificar x e y.

ggplot(df, aes(x = wt, y = mpg)) + geom_point()

Cambiar color y forma:

b + geom_point(color = "##00AFBB", size = 2, shape = 23)

Cambiar forma de los puntos según otra variable:

b + geom_point(aes(shape = cyl))

Cambiar forma y color de los puntos según otras variables:

b + geom_point(aes(shape = cyl, color = cyl))   

Para colores personalizados: + scale_color_manual(values = c("##00AFBB", "##E7B800", "##FC4E07")

Texto del eje x: rotar y mostrar todos los valores:

+ scale_x_continuous("Año", labels = as.character(Año), breaks = Año)

Definir mínimos y máximos:

+ coord_cartesian(ylim = c(800, 5500)) ## especificar mínimos y máximos del eje y

Añadir dispersión a los puntos:

jitter can be 1) an argument in geom_point(position = 'jitter'), 2) a geom itself, geom_jitter(), or 3) a position function, position_jitter(0.1)

Ejemplo de scatter:

ggplot(Vocab, aes(x=education, y=vocabulary)) + geom_jitter(alpha=0.2, shape=1)

Ejemplo:

gD<- ggplot(Tarapaca, aes(x = Año, y = Defunciones))

gD+ geom_smooth(se=FALSE, alpha=10, size=0.5, color="##C19BDE") + ##línea de tendencia, falso para no mostrar intervalos
    geom_point(aes(size = TasaMortalidad), alpha = 0.7, color = "##8A1CDD") + ##variable graficada como "size", con color y transparencia
    scale_size(range = c(0.5, 10)) + ##rango del tamaño de círculos
    theme(axis.text.x = element_text(angle = 45, vjust = 0.5)) + ##ángulo del texto del eje x
    scale_x_continuous("Año", labels = as.character(Año), breaks = Año) + ##etiquetas del eje x
    theme(panel.grid.major = element_line(Año, color = "white"), ## líneas del fondo
          panel.grid.minor = element_blank(), ## borrar líneas menores
          panel.background = element_rect(fill = "##EDE6F2"), ## color de fondo
          legend.key = element_rect(fill = "##EDE6F2")) + ## color de fondo de leyenda
    labs(size="Tasa de mortalidad") + ##título del elemento "size"
    coord_cartesian(ylim = c(800, 5500)) ## especificar mínimos y máximos del eje y

Ejemplo de scatter con dos variables:

gX <- ggplot(Tarapaca)
gX + geom_point(aes(y=Nacimientos , x=Año, size=TasaNatalidad, colour=TasaFecundidad), alpha = 0.7, color = "##DD4814") + 
    geom_point(aes(y = Defunciones, x=Año, size=TasaMortalidad), alpha = 0.7, color = "##8A1CDD") + 
    ##geom_point(aes(y = , x=Año, size=Nacimientos), alpha = 0.7, color = "##DD4814")
    scale_size(range = c(2, 15)) + ##rango del tamaño de círculos
    theme(axis.text.x = element_text(angle = 45, vjust = 0.5)) + ##ángulo del texto del eje x
    scale_x_continuous("Año", labels = as.character(Año), breaks = Año) + ##etiquetas del eje x
    theme(panel.grid.major = element_line(Año, color = "white"), ## líneas del fondo
          panel.grid.minor = element_blank(), ## borrar líneas menores
          panel.background = element_rect(fill = "##EDE6F2"), ## color de fondo
          legend.key = element_rect(fill = "##EDE6F2")) + ## color de fondo de leyenda
    labs(size="Tasa de mortalidad") ##título del elemento "size"

Ejemplo de qplot:

qplot(wt, mpg, data = mtcars)

3.1.24 Gráficos con iconos o logotipos

Instalar iconos de símbolos como FontAwesome o IonIcons

Luego graficar con geom_text usando el código del glifo a utilizar:

geom_text(label="\uF236", size = 14, family = 'FontAwesome', col="##1C2366") +

3.1.25 Waffle

disease_counts <- who_disease %>%
    group_by(disease) %>%
    summarise(total_cases = sum(cases)) %>% 
    mutate(percent = round(total_cases/sum(total_cases)*100))

## Create an array of rounded percentages for diseases.
case_counts <- disease_counts$percent
## Name the percentage array
names(case_counts) <- disease_counts$disease

## Pass case_counts vector to the waffle function to plot
waffle(case_counts)
parts <- c(80, 30, 20, 10)
chart <- waffle(parts, rows=8)
## print(chart)

## library(extrafont)
## waffle(parts, rows=8, use_glyph="shield")

parts <- c(One=80, Two=30, Three=20, Four=10)
chart <- waffle(parts, rows=8)
## print(chart)
library(waffle)

parts <- c('TRUE' = 3, 'FALSE' = 77)
p <- waffle(parts, rows = 8, colors = c("black", "grey70"))
p

Ejemplo:

originarios_total <- read_excel("/Users/rndzvs/RStudio/Tarapacá\ R/Indígenas.xlsx",
                                sheet="Región")

originarios_total

originarios_total_tidy <- originarios_total %>%
  gather(`Pueblo originario`, Porcentaje, Aimara:`Sin pertenencia`) %>%
  mutate_if(is.character, as.factor)

originarios_total_tidy

## Explorar porcentajes de cada pueblo en total
originarios_total_tidy %>%
  group_by(`Pueblo originario`) %>%
  ##filter(`Pueblo originario`=="Aimara") %>%
  summarize(percent(Porcentaje/10))

originarios_desagregado_tidy

pueblos_originarios_vector <- c(Aimara=29.1, Diaguita=1.44, Mapuche=2.18, Quechua=3.24, `Otra etnia`=3.24, `Sin pertenencia`=62.5)

pueblos_originarios_waffle <- waffle(pueblos_originarios_vector, 
                                     rows=9, 
                                     size=2)

pueblos_originarios_waffle_gg <- pueblos_originarios_waffle + 
  labs(title="Pertenencia a pueblos originarios", 
       subtitle="Cada cuadro representa a 1 de cada 100 tarapaqueños") +
  scale_fill_manual(values=c("##1A9D75", ##aymara
                             "##69A500", ##diaguita
                             "##7370B5", ##mapuche
                             "##DB6200", ##quechua
                             "##E8348B", ##otros
                             "##AFAFAF", ##sin
                             "##FFFFFF" ##fondo
                             )) +
  tema_comparaciones2 +
  theme(legend.title = element_blank(),
        legend.position = "bottom")

pueblos_originarios_waffle_gg

3.1.27 Densidad 2D

Densidad con líneas concéntricas:

## Base layers
p <- ggplot(faithful, aes(x = waiting, y = eruptions)) +
  scale_y_continuous(limits = c(1, 5.5), expand = c(0, 0)) +
  scale_x_continuous(limits = c(40, 100), expand = c(0, 0)) +
  coord_fixed(60 / 4.5)

## 1 - Use geom_density_2d()
p + geom_density_2d()

## 2 - Use stat_density_2d() with arguments
p + stat_density_2d(aes(col = ..level..), h = c(5, 0.5))

Densidad con gradiente:

## Load in the viridis package
library(viridis)

## Add viridis color scale
ggplot(faithful, aes(x = waiting, y = eruptions)) +
  scale_y_continuous(limits = c(1, 5.5), expand = c(0,0)) +
  scale_x_continuous(limits = c(40, 100), expand = c(0,0)) +
  coord_fixed(60/4.5) +
  stat_density_2d(geom = "tile", aes(fill = ..density..), h=c(5,.5), contour = FALSE) +
  scale_fill_viridis()

3.1.28 Gráficos animados

library(gganimate)
library(tween)
library(ggplot2)

3.1.28.1 Animar según otra variable

p<- ggplot(iris, aes(x = Petal.Width, y = Petal.Length)) +
    geom_point() + ##Gráfico de dispersión común
    transition_states(Species, ##Anima los puntos según variable
                    transition_length = 2,
                    state_length = 1) + 
    ease_aes('cubic-in-out') + ##suavizar animación
    ggtitle('Now showing {closest_state}',
          subtitle = 'Frame {frame} of {nframes}') ##Título con estados de la animación

transition_states() splits up plot data by a discrete variable and animates between the different states. ease_aes() defines the velocity with which aesthetics change during an animation.

3.1.28.2 Animar transiciones de entrada y salida:

anim <- ggplot(iris, aes(x = Petal.Width, y = Petal.Length)) + 
  geom_point(aes(colour = Species), size = 2) + 
  transition_states(Species,
                    transition_length = 2,
                    state_length = 1)
anim + 
  enter_fade() + 
  exit_shrink()

enter and exit functions are used to modify the aesthetics of appearing and disappearing data so that their entrance or exit may be animated.

3.1.28.3 Agregar título

Si es transition_reveal:

labs(x = "Años", y = "Nacimientos", title="Año {as.integer(frame_along)}") +

Si es transition_states:

labs(x = "Años", y = "Nacimientos", title="Año {closest_state}") +
ggtitle('Año {closest_state}') ##título de años

3.1.28.4 Exportar:

animate(gA_anim, nframes=300, fps=24, width=750, height=675, res=150, end_pause = 30)
anim_save("Animación2.gif", animation = last_animation())

nframes es la cantidad total de cuadros de la animación fps son los cuadros por segundo de la animación end_pause son cuadros de pausa al final de la animación rewind=TRUE para rebobinar.

Ejemplo:

library(ggplot2)
library(gganimate)

p<- ggplot(iris, aes(x = Petal.Width, y = Petal.Length)) +
    geom_point() + ##Gráfico de dispersión común
    transition_states(Species, transition_length = 2, state_length = 1) + ##Anima los puntos según variable
    ease_aes('cubic-in-out') + ##suavizar animación
    ggtitle('Now showing {closest_state}',
            subtitle = 'Frame {frame} of {nframes}') ##Título con estados de la animación

animate(p, nframes=300, fps=30) 
anim_save("Animación2.gif", animation = last_animation())

https://www.datanovia.com/en/blog/gganimate-how-to-create-plots-with-beautiful-animation-in-r/##show-preceding-frames-with-gradual-falloff

Regresión: http://varianceexplained.org/files/loess.html

3.1.28.5 Gráficos de países que se van adelantando

nata<-read.csv("nata.csv", sep=";")

names(nata)[2] <- "2000"
names(nata)[3] <- "2001"
names(nata)[4] <- "2002"
names(nata)[5] <- "2003"
names(nata)[6] <- "2004"
names(nata)[7] <- "2005"
names(nata)[8] <- "2006"
names(nata)[9] <- "2007"
names(nata)[10] <- "2008"
names(nata)[11] <- "2009"
names(nata)[12] <- "2010"
names(nata)[13] <- "2011"
names(nata)[14] <- "2012"
names(nata)[15] <- "2013"
names(nata)[16] <- "2014"
names(nata)[17] <- "2015"
names(nata)[18] <- "2016"

library(ggplot2)
library(gganimate)
library(tidyverse)
library(janitor)
library(scales)


### Aplicar guía a mis datos
            
### Cambiar formato de base de datos a "long format"
nata_tidy <- nata %>% 
      mutate_at(vars(contains("20")),as.numeric) %>% ##selecionar los años 
      gather(year,value,2:18) %>% ##elegir las columnas de los años
      janitor::clean_names() %>% 
      mutate(year = as.numeric(stringr::str_sub(year,1,4)))

write_csv(nata_tidy,"nata_tidy.csv")
View(nata_tidy)
View(nata)

### We’re going to filter our dataset to retain only the top 10 countries for every given year

nata_tidy <- read_csv("nata_tidy.csv")
nata_formatted <- nata_tidy %>%
      group_by(year) %>%
      ## The * 1 makes it possible to have non-integer ranks while sliding
      mutate(rank = rank(-value),
             Value_rel = value/value[rank==1],
             Value_lbl = paste0(" ",round(value/1e9))) %>%
      group_by(region) %>% 
      filter(rank <=10) %>%
      ungroup()

View(nata_formatted)

### Gráfico seguido de animación

staticplot = ggplot(nata_formatted, aes(rank, group = region, 
                                       fill = as.factor(region), 
                                       color = as.factor(region))) +
      geom_tile(aes(y = value/2,
                    height = value,
                    width = 0.9), alpha = 0.8, color = NA) +
      geom_text(aes(y = 0, label = paste(region, " ")), vjust = 0.2, hjust = 1) +
      geom_text(aes(y=value,label = paste(round(value,digits= 1)), hjust=-0.2)) +
      coord_flip(clip = "off", expand = FALSE) +
      scale_y_continuous(labels = scales::comma) +
      scale_x_reverse() +
      guides(color = FALSE, fill = FALSE) +
      theme(axis.line=element_blank(),
            axis.text.x=element_blank(),
            axis.text.y=element_blank(),
            axis.ticks=element_blank(),
            axis.title.x=element_blank(),
            axis.title.y=element_blank(),
            legend.position="none",
            panel.background=element_blank(),
            panel.border=element_blank(),
            panel.grid.major=element_blank(),
            panel.grid.minor=element_blank(),
            panel.grid.major.x = element_line( size=.1, color="grey" ),
            panel.grid.minor.x = element_line( size=.1, color="grey" ),
            plot.background=element_blank(),
            plot.margin = margin(1,1, 1, 4, "cm"))

animacion = staticplot + transition_states(year, transition_length = 2, state_length = 4) +
      view_follow(fixed_x = TRUE)  +
      labs(title = 'Tasa de natalidad anual: {closest_state}')

animate(animacion, nframes=640, fps=30, width=400, height=400, res=100, detail=2)
anim_save("Natalidad regiones.gif", animation = last_animation())

3.1.29 Cortar datos en intervalos

## Plot object p
p <- ggplot(diamonds, aes(x = carat, y = price))

## Use cut_interval
p + geom_boxplot(aes(group = cut_interval(carat, n=10)))

## Use cut_number
p + geom_boxplot(aes(group = cut_number(carat, n=10)))

## Use cut_width
p + geom_boxplot(aes(group = cut_width(carat, width=0.25)))

3.1.30 Mapas

Graficar mapas en ggplot2

3.1.30.1 Graficar mapas de Chile

Paquete Chilemapas https://github.com/pachamaltese/chilemapas

3.1.30.2 Recortar mapa

mapa_cortado <- st_crop(mapa, 
    xmin = -20, xmax = 45,
    ymin = 30, ymax = 73)

3.1.30.3 Cambiar formato de coordenadas

Necesario cuando se usan dos mapas distintos en un solo gráfico y sus sistemas de coordenadas difieren.

Revisar el formato de coordenadas de los dos mapas:

mapa1$geometry
mapa2$geometry

Cambiar uno por el del otro:

mapa2$geometry <- st_transform(mapa2$geometry, 
    crs = 32719)

3.1.30.4 Acercarse a un mapa

mapa +
coord_sf(ylim=c(-30, -10),
         xlim=c(-80, -60))

3.1.30.5 Importar shape

El archivo .shp tiene que estar dentro de la carpeta con el resto de archivos necesarios.

mapa <- sf::st_read("Catastro_Campamentos_2019/Catastro_Campamentos_2019/Catastro_Campamentos_2019.shp")    

3.2 Figuras y capas

Agregar figuras o capas extra a un gráfico

3.2.1 Agregar capas condicionales

switch=TRUE

datos %>%
ggplot(aes(x, y)) +
    {if(switch) geom_hline(yintercept = 15)}+
    geom_point()
geom_line(data = subset(afp_cotizantes2, región=="Iquique"), size=1) +
geom_line(data = subset(afp_cotizantes2, región!="Iquique"), size=0.5, show.legend = FALSE) +

https://gist.github.com/jcheng5/3971908

3.2.2 Agregar barras de brecha:

casen %>%
    filter(region=="Región de Tarapacá") %>%
    rename(trabajan=o1) %>%
    group_by(sexo, comuna, trabajan) %>%
    summarise(cantidad=n()) %>%
    mutate(porcentaje = cantidad/sum(cantidad)) %>%
    group_by(comuna) %>%
    mutate(diferencia = porcentaje[sexo == "Mujer"] - porcentaje) %>%
    group_by(comuna, trabajan) %>%
    mutate(mujer = porcentaje[sexo == "Mujer"]) %>%
    mutate(hombre = porcentaje[sexo == "Hombre"]) %>%
    filter(trabajan=="Sí") %>%
    ##filter(!is.na(trabajan)) %>%
    ##graficar
    ggplot(aes(fct_reorder(str_wrap(comuna, 4), diferencia), porcentaje, fill=sexo)) +
    ##facet_wrap(~comuna, strip.position = "bottom") +
    geom_col(position="dodge", width=0.8) +
    geom_text(aes(label = percent(porcentaje)), position = position_dodge2(width=0.8), 
              hjust = 1.2, vjust=0.5, size=3.5, angle=90, color="white") +
    geom_linerange(aes(ymin = mujer, ymax = hombre, linetype="Brecha\nde género"), size=3, col="##DF1A57")

3.2.3 Líneas verticales grises

Agregar linea

Verticales:

theme(panel.grid.major.x = element_line(color="gray90"))

Horizontales:

theme(panel.grid.major.y = element_line(color="gray90"))

3.2.4 Poner logo en esquina del gráfico

Importar logo:

logo_tarapaca <- readPNG("logo_tarapaca_2.png")
coord_cartesian(clip="off") +
annotation_custom(grob = rasterGrob(logo_tarapaca_chico, width=unit(2,'cm'), hjust = 7, vjust=-0.3, x = unit(1,"npc"), y = unit(1,"npc")))

Ajustar hjust y vjust

Si el gráfico está horizontal:

coord_flip(clip="off") +

3.2.5 Insertar flechas en el gráfico

library(gridExtra)

 annotate(
        "segment",
        x=dates,
        xend=dates,
        y=prices-11,
        yend=prices-1,
        color="blue",
        arrow=arrow(length=unit(0.05,"npc")
        ))

Afuera del gráfico

annotate("segment", x=4.5, xend=3, y=-70, yend=-70, col="black", arrow=arrow(length=unit(0.3, "cm"))) +
scale_y_continuous(expand=c(0,0)) +
coord_cartesian(ylim = c(0, 700), clip="off") +
theme(plot.margin = unit(c(1,1,3,1), "lines"))

3.2.6 Agregar línea horizontal de promedio

geom_hline(yintercept = mean(Indcatotvalue), color="blue")

3.2.7 Graficar una única variable

ggplot(mammals[mammals$vore == "Insectivore", ], aes(x = sleep_total, fill = vore)) +
  geom_density(col = NA, alpha = 0.35) +
  scale_x_continuous(limits = c(0, 24)) +
  coord_cartesian(ylim = c(0, 0.3))

3.2.8 Insertar barras

geom_vline
geom_hline
geom_rect(data = recess,
         aes(xmin = begin, xmax = end, ymin = -Inf, ymax = +Inf),
         inherit.aes = FALSE, fill = "red", alpha = 0.2)
+ geom_vline(xintercept=0)

3.2.9 Guardar y aplicar capas

BMI_fill <- scale_fill_brewer("BMI Category", palette = "Reds")

Luego esta capa puede aplicarse con + BMI_fill

Otro ejemplo:

fix_strips <- theme(strip.text.y = element_text(angle = 0, hjust = 0, vjust = 0.1, size = 14),
                    strip.background = element_blank(),
                    legend.position = "none")

ggplot(...) + fix_strips

3.2.10 Shapes

Las figuras shape de 21 a 25 tienen borde y relleno independientes.

3.3 Texto

Operaciones que se pueden realizar sobre el texto de los gráficos

3.3.1 Insertar texto en el gráfico

annotate("text", x=2.8, y=-0.025, hjust=1, col="black", label="Menores ingresos") +
annotate("text", x=8.4, y=-0.025, hjust=0, col="black", label="Mayores ingresos") +

hjust = 1 significa que el texto se posiciona desde el borde derecho, 0 depende del borde izquierdo.

Para ponerlas fuera del gráfico:

    coord_cartesian(clip = 'off') +
    theme(plot.margin = unit(c(1,1,3,1), "lines")) + ##extender área hacia abajo

3.3.2 Texto en barras

Crear variable que calcule el porcentaje:

basura <- basura %>% ##crear variable que mide el porcenaje
    mutate(Porcentaje = (`Toneladas al año` / sum(`Toneladas al año`) * 100))
+ geom_text(aes(label = percent(Porcentaje)), 
            color="gray25", size=3, hjust = -0.2) +

Cuando son barras stack:

geom_text(aes(label = percent(porcentaje)), color="gray25", size=3, hjust = 0.5, vjust=0.5, position="stack") +

Para centrar el número en las barras:

geom_text(aes(label = percent(porcentaje)), color="gray25", size=3, hjust = 0.5, vjust=0.5, position = position_stack(vjust = 0.5)) +

Para variables categóricas o factores:

geom_text(aes(y = ((..count..)/sum(..count..)), 
            label = scales::percent((..count..)/sum(..count..))), 
            stat = "count", hjust = -0.1, size=3, color="white") +

porcentaje total de las barras stacked con datos tidy:

stat_summary(fun.y = sum, aes(label = paste0(round(..y..*100, digits=1), "%"), group = Comuna), geom = "text", vjust=-0.5, size=3, col="gray25") +

Alternativa para pegar total

geom_text(
        aes(label = stat(y)), 
        stat = 'summary', fun.y = sum, vjust = -1
    ) +

Para barras dodge con coord_flip

turismo %>%
    filter(!is.na(edad)) %>%
    group_by(edad, genero, periodo) %>%
    summarize(cantidad=n()) %>%
    ggplot(aes(edad, cantidad)) +
    geom_col(aes(fill=genero), position = "dodge") + 
    coord_flip() + 
    geom_text(aes(label = cantidad), position = position_dodge2(width=1), 
              size=3.5,
              hjust=-0.5) +
    facet_wrap(~periodo)

Para permitir que el texto se salga del margen del gráfico hay que poner clip = off y expandir el margen del gráfico con plot.margin:

coord_cartesian(clip = 'off') +
theme(plot.margin = unit(c(1,1,1,1),"cm")) ##top right bottom left

3.3.3 Mostrar texto en el gráfico según condición

Mostrar etiquetas sólo para puntos o segmentos superiores a una cantidad. Usando mutate, las etiquetas que no cumplan la función quedan en blanco, manteniendo su posición:

    ##Texto grande
    geom_text(aes(label = ifelse(Cantidad > 1000, Cantidad, "")), 
              position = position_dodge2(width=0.8), 
              size=3, color="red", hjust=1.2) +
    ##Texto chico
    geom_text(aes(label = ifelse(Cantidad < 1000, Cantidad, "")), 
              position = position_dodge2(width=0.8), 
              size=3, color="green", hjust=-0.2) +

Poner sólo los porcentajes grandes en un gráfico de barras stacked:

geom_text(aes(label = ifelse(Porcentaje > 0.12, percent(Porcentaje, accuracy = 0.1), "")), 
              ##position = position_dodge2(width=0.8),
              position = position_stack(vjust = .5),
              size=2.5, color="white") +

Para un texto más complejo (con paste, porcentaje y frecuencia)

    ##Texto grande
    geom_text(aes(label = ifelse(porcentaje > .1, paste(percent(porcentaje, accuracy = 0.1), "-", format(cantidad, big.mark=".")), "")), 
              position = position_dodge2(width=0.7), 
              size=3, color="red", hjust=1.2) +
    ##Texto chico
    geom_text(aes(label = ifelse(porcentaje < .1, paste(percent(porcentaje, accuracy = 0.1), "-", format(cantidad, big.mark=".")), "")), 
              position = position_dodge2(width=0.7), 
              size=3, color="green", hjust=-0.2) +

3.3.4 Poner valores sobre las barras

geom_text(aes(label=variabley), vjust=1.5, hjust=0.5, col="white")

Para dodge:

geom_text(aes(label = percent(var1), 
                  y = var1 + .03), 
              position = position_dodge(0.9),
              vjust = 1)

Si se trata de un factor:

geom_text(stat='count', aes(label=..count..), vjust=0.5) +

3.3.5 Repeler etiquetas de los puntos

library(ggplot2)
library(ggrepel)

x = c(0.8846, 1.1554, 0.9317, 0.9703, 0.9053, 0.9454, 1.0146, 0.9012, 
      0.9055, 1.3307)
y = c(0.9828, 1.0329, 0.931, 1.3794, 0.9273, 0.9605, 1.0259, 0.9542, 
      0.9717, 0.9357)
z= c("a", "b", "c", "d", "e", "f", 
             "g", "h", "i", "j")


df <- data.frame(x = x, y = y, z = z)
ggplot(data = df, aes(x = x, y = y)) + theme_bw() + 
geom_text_repel(aes(label = z), 
box.padding = unit(0.45, "lines")) +
geom_point(colour = "green", size = 3)
ggplot(dt, 
       aes(x = one, y = two, color = diff_cat)) +
  geom_point() +
  geom_text_repel(data = . %>% 
                    mutate(label = ifelse(diff_cat %in% c("type_1", "type_2") & abs(diff) > 2,
                                          name, "")),
                  aes(label = label), 
                  box.padding = 1,
                  show.legend = FALSE) + ##this removes the 'a' from the legend
  coord_cartesian(xlim = c(-5, 5), ylim = c(-5, 5)) +
  theme_bw()

3.3.6 Convertir etiquetas a minúscula, mayúscula, titulares, o frase

stringr::str_to_upper(string, locale = "es")

stringr::str_to_lower(string, locale = "es")

stringr::str_to_title(string, locale = "es")

stringr::str_to_sentence(string, locale = "es")

3.3.7 Poner suma de los factores sobre una barra stacked

stat_summary(fun.y = sum,                          ##pone como texto la suma de los factores en cada barra
               aes(label = ..y.., group = Año), 
               geom = "text", vjust=-0.5, size=3, col="gray25") + 

3.3.8 Ajustar cita o referencia

Horizontalmente:

plot.caption = element_text(hjust = 1.4)) +

3.3.9 Mover título y subtítulo

Horizontalmente:

plot.title = element_text(hjust = 0.3),
plot.subtitle = element_text(hjust = 0.3),

3.3.10 Buscar y reemplazar palabras de las etiquetas

## buscar y reemplazar palabras para borrarlas de las etiquetas
eme2 <- eme2 %>% 
  mutate(tramo_ingresos = str_replace(tramo_ingresos, "Entre ", "")) %>%
  mutate(tramo_ingresos = str_replace(tramo_ingresos, "y", "a"))

3.3.11 Redondear cifras

round(variable, digits=1)

Ejemplo:

geom_text(aes(label = 
                      paste0(##pegar símbolo de porcentaje
                            round(Porcentaje, digits=1),##redondear cifra
                            "%")), 
              color="white", size=3.5, position=position_stack(vjust = 0.5)) +

3.3.12 Pegar signo de porcentaje

paste0(Porcentaje,"%")

Ejemplo:

geom_text(aes(label = 
                      paste0(##pegar símbolo de porcentaje
                            round(Porcentaje, digits=1),##redondear cifra
                            "%")), 
              color="white", size=3.5, position=position_stack(vjust = 0.5)) +

3.3.13 Cambiar etiquetas del gráfico

Cambiar títulos de los ejes

+ labs(x="Título del eje x", y="Título del eje y")
titled_plot <- initial_plot + 
    labs(title = "Hell Is Other People In A Pressurized Metal Tube",
         subtitle = "Percentage of 874 air-passenger respondents who said action is very or somewhat rude",
         caption = "Source: SurveyMonkey Audience", 
         x = "", 
         y = "") 

3.3.14 Poner nombre de barras dentro de las barras

Para que el texto o etiqueta del eje y o x aparezca dentro de la barra:

En gráficos con coord_flip:

geom_text(aes(label = str_to_title(variable), y=0.02), hjust=0, size = 3.2, col="white") +
theme(axis.text.y = element_blank()) ##ocultar eje

Sin coord_flip:

geom_text(aes(label = str_to_title(variable), y=0.02), angle=90, hjust=0, size = 3.2, col="white") +
theme(axis.text.x = element_blank())

3.3.15 Calcular porcentajes

Calcular porcentaje por categorías:

group_by(gastos_forma, periodo, extranjeros) %>%
    summarise(cantidad = n()) %>%
    mutate(porcentaje = cantidad/sum(cantidad)) %>% ##Porcentaje

Calcular porcentaje respecto del total:

group_by(gastos_forma, periodo, extranjeros) %>%
    summarise(cantidad = n()) %>%
    ungroup() %>%
    mutate(porcentaje = cantidad/sum(cantidad)) %>% ##Porcentaje

Hay que agregar un ungroup.

Agregar fila con suma de totales:

adorn_totals("row") %>%

Agregar columna con suma de totales:

adorn_totals("col", name = "Total") %>%

3.3.16 Poner texto al final del gráfico de líneas

    geom_text(aes(label = ifelse(Año==2018, 
                                 str_pad(number(media, accuracy = 1, big.mark="."), 20, side="right"),
                                 "")), 
              size=3, hjust=-0.15) +

Puede que sea necesario mover la leyenda hacia la derecha:

theme(legend.box.margin=margin(c(0,0,0,10))) +

3.3.17 Formatear números

Quitar decimales a un número que por ejemplo es una media:

round(Toneladas, digits = 2)

3.3.18 Añadir texto antes o después del nombre de la variable

ggplot(aes(x = paste("texto", variable)))
scale_x_continuous(labels = function(x) paste(x, "años"),

3.3.19 Formatear una fecha

Hay que tener instalado el locale necesario, en este caso el de español. Activar el locale:

Sys.setlocale(category = "LC_TIME", locale="es_ES.UTF-8") ##Meses en español

Luego las fechas usarán meses en castellano:

format(max(covid_comuna$Fecha), "%d de %B")

3.3.20 Aumentar el tamaño de todo el texto

theme(text = element_text(size=16))

3.3.21 Cambiar tipografía

library(extrafont)

theme(plot.title = element_text(size=18, family="Bebas Kai", color="##1c2366"),

Cambiar todo el texto:

text = element_text(family="Open Sans"),

Ver tipografías instaladas:

extrafont::fonts()

3.3.22 Cambiar color de un texto según condición

Crear la condición necesaria y poner como categorías de la variable los colores a elegir:

datos %>%
mutate(Region2 = case_when(Region=="Tarapacá" ~ "##red",
    TRUE ~ "gray80"))

Luego agregar en el geom:

geom_text(aes(x=Comuna, y=-50, label = Region),
    color = datos$Region2)

3.3.23 Añadir valor o texto a las etiquetas del eje x

scale_x_discrete(labels = paste0(Region, "\n", Poblacion))

3.3.24 Ajustar etiquetas largas

Para cortar la categorías largas, por ejemplo, en la leyenda de un gráfico o las etiquetas de un eje:

datos %>%
  ggplot(aes(variable, str_wrap(variable, width = 35))) +
  geom_line()

Donde el número es los caracteres del ancho de línea.

Para aplicar desde fuera:

scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

Para mantener el orden de los factores:

str_wrap_factor <- function(x, ...) {
    levels(x) <- str_wrap(levels(x), ...)
    x
}

Y luego usar str_wrap_factor del mismo modo que str_wrap

Cortar factores:

mutate(ocupación_CIUO = str_trunc(as.character(ocupación_CIUO), 30, side="right")) %>%

Luego volver a convertir a factor.

3.4 Escalas

Manipulación de las escalas de los gráficos, que son los elementos que controlan la disposición espacial de las observaciones en el plano.

3.4.1 Ordenar grafico de barras

Ordenar las barras para que una categoría del stack vaya de mayor a menor: crear una variable con case_when que sea un valor numérico, luego sumar esos valores numéricos en summarize según los grupos.

turismo2 %>%
  mutate(orden = case_when(interés == "Es de interes" ~ "1", TRUE ~ "0")) %>%
  mutate(orden = as.numeric(orden)) %>%
  group_by(ubicación, interés, orden) %>%
  summarize(cantidad = n(),
            orden2 = sum(orden)) %>%
    ggplot(aes(fct_reorder(ubicación, orden2), porcentaje, fill=interés))

Alternativa: crear variable de orden con un subset

group_by(Region) %>%
  mutate(Orden = Valor[Grupo == "Casos"]) %>%
  ggplot(aes(fct_reorder(Region, Orden), 
             Valor, fill = Grupo)) +

3.4.2 Expandir un eje

Por ejemplo, si una línea queda muy corta en la parte superior de un gráfico de densidad. Similar a coord_cartesian

scale_y_discrete(expand = expand_scale(add = c(0.3, 5.5))) +

3.4.3 Poner comas en los ejes

scale_x_continuous(labels = scales::comma)

3.4.4 Intercambiar ejes

+ coord_flip()

Intercambiar y cortar o extender:

coord_flip(xlim=c(0, 800)) + 

3.4.5 Cambiar orden de los ejes

ggplot(aes(x = logFoldChange, y = reorder(variable, variable_de_ordenamiento)) +
    geom_point()

Invertir el orden:

ggplot(datos, aes(x=fct_rev(var1), y=...))

Reordenar ascendente:

ggplot(datos, aes(x = fct_infreq(var1), y=...

Reordenar descendente

ggplot(datos, aes(x = fct_rev(fct_infreq(variable))))

Reordenar según otra variable

ggplot(datos, aes(x= fct_reorder(variable, referencia), y=...

Según otra pero en descendiente:

mutate(Genre = fct_reorder(Genre, n, .desc = TRUE))

Reordenar manualmente:

name = factor(name, levels=c("north", "north-east", "east", "south-east", "south", "south-west", "west", "north-west")))

Reordenar según suma de los valores del eje:

  ggplot(aes(x=fct_reorder(Comuna, Porcentaje, .fun=sum, .desc=TRUE)

Util cuando son barras stacked y hay que ordenar por la suma de los factores

3.4.6 Girar etiquetas del eje x

Girar etiquetas del eje, dándole ángulo o poniéndola horizontal, por ejemplo

axis.text.x = element_text(angle = -90, hjust=0)) +

hjust justifica el texto

Girar a la derecha y justificar:

theme(axis.text.x = element_text(hjust=0, vjust=0.5, angle = -90)

3.4.7 Cambiar márgenes de elementos

theme(axis.text.x = element_text(margin = margin(t = 0)),
    axis.text.y = element_text(margin = margin(r = -5)),
    plot.subtitle = element_text(margin = margin(b = 15)))

3.4.8 Mostrar todas las etiquetas del eje x

Mostrar todas las etiquetas del eje x

scale_x_continuous("ID", labels = as.character(ID), breaks = ID)
scale_x_continuous(breaks = c(1973:1980))

3.4.9 Definir cortes del eje y

scale_y_continuous(breaks = c(10, 50, 100, 150, 200)) +

También sirve para eliminar el 0 del eje. Para combinar con logaritmo: , trans="log10"

3.4.10 Transformar escalas a logaritmo

## Transform the scale
d + scale_y_log10()
## Transform the coordinates
d + coord_trans(y="log10")

3.4.11 Agregar alfombra

Muestra los puntos exactos donde existen datos.

+ geom_rug()

3.4.12 Cambiar eje a logaritmo

Para cambiar una escala a logarítmica:

+ scale_x_log10()

3.4.13 Ampliar eje

Para que un eje empiece desde cero y así se elimine el margen o espaciado por defecto de ggplot:

expand_limits(y=0)
coord_flip(expand=FALSE)
scale_x_discrete(expand = c(0, 0)) +
scale_x_continuous(expand = c(0, 0)) + scale_y_continuous(expand = c(0, 0))

3.4.14 Insertar un nivel en blanco para una escala

Para que en la leyenda aparezca un espacio vacío entremedio.

Primero agregar el nivel blanco con \n:

previsión_t$previsión = factor(previsión_t$previsión, levels=c("Fonasa A", "Fonasa B", "Fonasa C", "Fonasa D", "Fonasa desconocido", "\n\n","Isapre", "FF.AA. y de Orden", "Ninguno (Particular)", "Otro sistema"))  

Luego definir el color blanco y determinar que no se salte el nivel al estar vacío.

scale_fill_manual(values = c(degradado1(4), "gray70",
                                 "white", ##Color del nivel en blanco
                                 degradado4(3), "gray70"),
                       drop = FALSE) + ##Determinar que el nivel en blanco no se salte

3.4.15 Escalas de series de tiempo

https://www.statworx.com/at/blog/customizing-time-and-date-scales-in-ggplot2/

Configurar el eje x cuando es fecha:

scale_x_date(breaks = seq(from = ymd('2020-03-30'), to = max(covid_comuna$Fecha), 
                            ##by=1),
                            length.out=12),
               date_labels = "%d/%B") +

La opción by=1 pone un break por fecha, y length.out pone la cantidad de breaks definidos, dispersados entre el menos y el mayor.

3.4.16 Cambiar escalas continuas

    scale_fill_viridis(option="magma", ##color
                       name = "Porcentaje \nde votantes", 
                       breaks = c(0, 25, 50, 75, 100),
                       labels=c("0%", "25%", "50%", "75%", "100%"),
                       limits=c(20,80)) +

3.4.17 Escalas

Cambiar el rango de tamaños de los puntos

+ scale_size(range = c(1, 10))

Etiquetas en la escala manualmente:

scale_y_continuous(breaks = c(300000, 1000000,5000000,10000000))

Etiquetas menores en la escala:

scale_x_continuous(breaks = c(1990, 1995, 2000, 2005, 2010, 2014, 2017),
                       minor_breaks = seq(1991, 2016, 1)) +

Secuencia de breaks en la escala:

scale_y_continuous(limits = c(0, 12000), breaks = seq(0,12000,by = 2000)

3.4.18 Escala en miles

Puntos de miles en la escala:

scale_y_continuous(labels = function(x) format(x, big.mark = ".")) +

Escala de miles

O bien:

scale_size_continuous(labels = scales::number) +

3.4.19 Escala en porcentajes

library(scales)

scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +

Pegar porcentaje en eje (si los valores ya vienen multiplicados por 100:

scale_y_continuous(labels = function(x) paste0(x, "%")) +

3.5 Colores

Operaciones que permiten controlar y modificar los colores utilizados en los gráficos.

3.5.1 Agregar más de una escala de color

https://eliocamp.github.io/ggnewscale/

3.5.2 Escalas continuas de colores (degradado)

Definir color del mínimo y máximo:

scale_fill_gradient(low = "gray90", high = color_verde) +

Definir color del mínimo, intermedio y máximo:

scale_color_gradient2(low = colorspace::darken(color_verde, 0.2), 
                            mid = colorspace::darken(color_verde, 0.4), 
                            high = "white", 
                            midpoint = 3.8) +

Opcionalmente, definir en midpoint el punto que equivale al intermedio.

3.5.3 Aplicar paleta de colores específicas a determinadas variables

cyl <- sort(unique(mpg$cyl))
ncat <- length(cyl)          ## 4 types of cylinders

## create palettes
library(RColorBrewer)
purples <- tibble(cyl, colr = brewer.pal(ncat, "Purples"))
reds    <- tibble(manufacturer = "audi", cyl, colr = brewer.pal(ncat, "Reds"))
blues   <- tibble(manufacturer = "ford", cyl, colr = brewer.pal(ncat, "Blues"))

## merge them with the data
dd_p <- dd %>% filter(!(manufacturer %in% c("audi", "ford"))) %>% left_join(purples)
dd_r <- dd %>% filter(manufacturer == "audi") %>% left_join(reds)
dd_b <- dd %>% filter(manufacturer == "ford") %>% left_join(blues)

gg_dd <- rbind(dd_p, dd_r, dd_b) %>%
        left_join(mm)

gg_dd %>% 
        ggplot(mapping = aes(x = reorder(manufacturer, mcyl), y = n, fill = colr)) + 
        geom_bar(stat = "identity", position = "fill") +
        coord_flip() +
        scale_fill_identity() 

3.5.4 Aplicar escala de color automática

Primero crear la escala de color con tantos colores como se necesiten:

degradado <- colorRampPalette(c("##DF1A57", "##AF87EB", "##1D3284"))

Luego aplicar la escala al gráfico, determinando el número de colores a usar:

scale_color_manual(values = degradado(7),
aesthetics = c("fill", "col")) +

3.5.5 Crear escala o degradado de colores

degradado <- colorRampPalette(c("##DF1A57", "##c444c4", "##6739b2", "##1D3284"), bias=0.9)

Bias es la separación de los colores en los extremos de la escala. Un bias alto (mayor a 1) hace que los colores cambien más rápido y uno bajo (cercano a 0) distribuye los colores más suavemente.

3.5.6 Previsualizar colores

Para ver un color o vector de colores:

scales::show_col("##DF1A57")

scales::show_col(c("##DF1A57", "##c444c4", "##6739b2", "##1D3284"))

scales::show_col(degradado7b(7))

3.5.7 Aclarar u oscurecer colores

colorspace::lighten("red", amount = 0.5)
scales::show_col(colorspace::lighten(color_naranjo, amount = 0.6))

3.5.8 RColorBrewer

scale_fill_brewer(palette = "Dark2") +

Para ver todas las paletas disponibles:

RColorBrewer::display.brewer.all()

Extraer colores:

colores_presidencial <- rev(brewer.pal(9, 'YlGnBu')) ##extraer paleta de colores

Luego aplicar como gradiente:

scale_fill_gradientn(colours = colores_presidencial, ##crear gradiente de colores
                         name = "Porcentaje \nde votantes", 
                         breaks = c(10, 30, 50, 70, 90)) + 

3.5.9 Crear degradados de color

Crear escala de colores entre colores específicos:

degradado1 <- colorRampPalette(c("##DF1A57", "##AF87EB", "##1D3284"))

Luego aplicar así:

scale_color_manual(values = degradado1(5)) +

Donde el número es la cantidad de colores

3.5.10 Extender escalas de colores

## Definition of a set of blue colors
blues <- brewer.pal(9, "Blues") ## from the RColorBrewer package

## 1 - Make a color range using colorRampPalette() and the set of blues
blue_range <- colorRampPalette(blues)

## 2 - Use blue_range to adjust the color of the bars, use scale_fill_manual()
ggplot(Vocab, aes(x = education, fill = vocabulary)) +
  geom_bar(position = "fill") +
  scale_fill_manual(values=blue_range(11))

3.5.11 Determinar colores para variable categórica

colores_redes<- c("Facebook"="##1877f2","WhatsApp y similares"="##25d366","Instagram"="##c32aa3","Skype"="##00aff0","Twitter"="##1da1f2","Tinder y similares"="##FF5864","Snapchat"="##fffc00","LinkedIn"="##007bb5")

Luego, dependiendo del tipo del elemento:

scale_fill_manual(values = colores_redes) + 
scale_color_manual(values = colores_redes) +

3.5.12 Más escalas de colores

3.5.12.1 Viridis

scale_color_viridis() +
scale_fill_viridis(option="magma") +

“magma”, “plasma”, and “inferno.”

discrete = TRUE

Más paletas: - https://twitter.com/wearerladies/status/1180545410974257152?s=12 - https://github.com/EmilHvitfeldt/r-color-palettes/blob/master/type-sorted-palettes.md##qualitative-color-palettes

3.5.12.2 CartoColor

https://github.com/Nowosad/rcartocolor Ver colores:

cartocolor::display_carto_all()

Usar:

scale_fill_carto_c(name = "Life expectancy: ", type = "diverging", palette = "Earth", direction = -1)

3.5.12.3 Scico

Ver colores:

scico::scico_palette_show()

Generar paleta:

paleta <- scico::scico(30, palette = 'lapaz')

Usar escala:

ggplot(volcano, aes(x = x, y = y, fill = height)) + 
  geom_raster() + 
  scale_fill_scico(palette = 'davos') 

3.5.12.4 Fishualize

devtools::install_github("nschiett/fishualize", force = TRUE)
library(fishualize)

paleta <- fish(10, option = "Ostracion_cubicus")

Ver colores: https://nschiett.github.io/fishualize/articles/overview_colors.html

scales::show_col(fishualize::fish(10, option = "Antennarius_commerson"))

Bonitas:

Oncorhynchus_tshawytscha
Bodianus_pulchellus
Antennarius_commerson
scales::show_col(fishualize::fish(10, option = "Oncorhynchus_keta"))

Ver lista de peces:

spp <- fishualize::fish_palettes()
##Escalas continuas:
scale_color_fish(option = "Hypsypops_rubicundus", direction = -1)

##Escalas discretas:
scale_color_fishd(option = "Hypsypops_rubicundus", direction = -1)

scale_color_fish(option = "Coris_gaimard", discrete = TRUE)

3.5.12.5 Ghibli

https://ewenme.github.io/ghibli/index.html

library(ghibli)
scale_colour_ghibli_d("LaputaMedium", direction = -1)

3.5.12.6 PaletteR

devtools::install_github("AndreaCirilloAC/paletter")

library(paletter)

image_path <- "path_to_your_image"
colours_vector <- create_palette(image_path = image_path,
number_of_colors =32,
type_of_variable = “categorical")

ggplot(data = mtcars, aes(x = rownames(mtcars),y = hp,color = rownames(mtcars),
                          fill = rownames(mtcars))) +
  geom_bar(stat = 'identity') +
  scale_color_manual(values = colours_vector) +
  scale_fill_manual(values=colours_vector)+

3.5.12.7 Pirate palette

yarrr::piratepal(palette = "all")

3.6 Leyendas

Manipular la leyenda, o la sección del gráfico que contiene los colores y/o etiquetas de los elementos gráficos que lo componen.

3.6.1 Crear gráfico con leyenda manual

Cuando los elementos el gráfico se hacen por capas separadas y por lo tanto no aparecen con leyenda:

cols <- c("Investigadores\nhombres"="##B077E5",
          "Investigadoras\nmujeres"="##DF1A57",
          "Total de\ninvestigadores"="##1D3284")

investigadores %>%
  rename(año=1) %>%
  ##pivot_longer(cols=c(3:4), names_to="género", values_to="valor") %>%
  ggplot(aes(año)) +
  geom_col(aes(y=total, fill="Total de\ninvestigadores")) +
  geom_line(aes(y=mujeres, col="Investigadoras\nmujeres"), size=2, alpha=0.6) +
  geom_point(aes(y=mujeres, col="Investigadoras\nmujeres"), size=4) +
  geom_line(aes(y=hombres, col="Investigadores\nhombres"), size=2, alpha=0.6) +
  geom_point(aes(y=hombres, col="Investigadores\nhombres"), size=4) +
  ##texto
  geom_text(aes(y= mujeres-3.5, label = mujeres), col="white") +
  geom_text(aes(y= hombres+3.5, label = ifelse(año!=2013, hombres, "")), col="white") +
  geom_text(aes(y= hombres+5.5, label = ifelse(año==2013, hombres, "")), col="white") +
  geom_text(aes(y= total+3, label = total)) +
  ##escalas
  scale_colour_manual(name="Error Bars", values = cols) + 
  scale_fill_manual(name="Bar", values = cols) +
  scale_x_continuous(breaks=c(2009:2017)) +
  labs(y="Cantidad de investigadores/as")

Alternativa más rápida:

geom_hline(aes(yintercept = promedio, col="Arancel promedio")) +
scale_colour_manual(name="Error Bars", values = c("Arancel promedio"="red")) + 

3.6.2 Invertir orden de leyenda

guides(fill = guide_legend(reverse = TRUE)) +

3.6.3 Orientación y ubicación de la leyenda

Ubicación de la leyenda: theme(legend.position = c(0.85, 0.85))

Mover la leyenda en relación a su ubicación por defecto:

legend.box.margin=margin(c(0,0,0,-60)) ##moverla a la izquierda

Leyenda dentro del gráfico:

theme(legend.position = c(.8,.8))

Eliminar leyenda: theme(legend.position = "none")

Añadir margen al gráfico:

theme(panel.spacing.x=unit(2, "cm"), plot.margin=unit(c(1,2,1,1), "cm"))

Eliminar todos los rectángulos: no_panels <- theme(rect = element_blank())

Poner leyenda abajo:

theme(legend.position = "bottom")

Cambiar orientación de los elementos de la leyenda:

theme(legend.direction = "horizontal")

Cambiar ubicación de leyenda:

+ theme(legend.position = "bottom",
          legend.box = "vertical") 

3.6.4 Textos de leyenda

Cambiar título de leyenda:

+ scale_fill_discrete(name = "")

Si es una combinación de geoms:

labs(fill = "Nacionalidad", col = "Nacionalidad") +

Cambiar nombre de elementos de la leyenda:

+ scale_fill_discrete(name = "Padrón electoral", labels = c("Inscritos que no votaron", "Votantes")) +

Ocultar una leyenda específica:

+ guides(col = FALSE)

O poner dentro del geom: show.legend=FALSE

3.6.5 Elementos de la leyenda

Cambiar espaciado horizontal de leyenda:

legend.spacing.x = unit(0.4, 'cm') ##NO SIRVE?

Cambiar espaciado vertical de elementos de leyenda:

legend.text = element_text(margin = margin(t=4, b = 4), size=9))

Tamaño de cuadrados de leyenda

legend.key.size = unit(1.7, 'lines')

Ajustar espacio vertical:

legend.text = element_text(margin = margin(t=10, b=10)),

Ajustar espaciado de leyendas:

legend.text = element_text(margin = margin(l = -2, r = 10), size=8))

Definir cantidad de filas en que aparecen las leyendas:

guides(fill = guide_legend(nrow = 3)) + ##cantidad de filas de la leyenda

Invertir elementos de leyenda:

guides(fill = guide_legend(reverse = TRUE))

Cambiar forma de la leyenda:

guides(colour = guide_legend(override.aes = list(shape = 15)))

Borrar el cuadrado gris de fondo de la leyenda:

theme(legend.key = element_blank())

Cambiar color de la leyenda:

guides(shape = guide_legend(override.aes = list(colour = "pink")))

3.6.6 Margen de la leyenda

theme(legend.margin = margin(20, 20, 20, 0)) + ##caja de la leyenda

3.6.7 Leyendas redondas

Cambiar una leyenda redonda de geom_line o geom_point por una cuadrada como de geom_col

guides(col = guide_legend(nrow = 3, override.aes = list(shape = 15, size=7))) +

Para que las barras tengan círculos en la leyenda: - poner fill y col en aes() - poner un geom_point de size 0, alpha 0 - show-legend F en las columnas - que los títulos coincidan en labs, y que se use o no reverse en guides de forma consistente:

theme(legend.key = element_blank(),
        legend.background = element_blank()) +
  geom_point(size=0) +
  ##guides(fill = guide_legend(override.aes = list(fill = NA, text = NA, alpha = 1))) +
  guides(col = guide_legend(reverse = TRUE,
                            override.aes = list(size=5, fill=NA, text=NA)))

Ejemplo en gráfico de líneas

ggplot(aes(fecha, valor, col=parque, fill=parque)) +
  geom_line(show.legend = FALSE) +
  geom_point(size=0, alpha=0) +
  scale_y_continuous(labels = function(x) format(x, big.mark = ".")) +
  labs(y="Visitas") +
  theme_minimal() +
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        axis.title.x = element_blank(),
        legend.text = element_text(margin = margin(t=3, b=3, r=6))) +
  guides(col = guide_legend(ncol=2,
                            override.aes = list(size=4, fill=NA, text=NA))) +
  guides(fill = guide_legend(override.aes = list(fill = NA, text = NA, alpha = 1)))

3.7 Temas y espaciado

3.7.1 Espaciado entre facetas

El espacio horizontal entre dos facetas de un gráfico, cuando el gráfico se separa en facetas con facet_wrap()

theme(panel.spacing.x=unit(2, "cm"))

3.7.2 Reducir margen de gráficos

Especialmente útil para gráficos de torta

theme(plot.margin = margin(-20, 0, -20, -0)) +

Ejemplo:

plot.margin = margin(20, ##arriba
                               -90, ##derecha
                               10, ##abajo
                               -50) ##izquierda
          )

3.7.3 Múltiples gráficos

Facetas

ggplot(comics, aes(x = align)) + 
  geom_bar() +
  facet_wrap(~ gender)
ggplot(email, aes(x= number)) +
  geom_bar() +
  facet_wrap(.~spam)
## 1 - Separate rows according to transmission type, am
p +
  facet_grid(am ~ .)
## 2 - Separate columns according to cylinders, cyl
p +
  facet_grid(. ~ cyl)
## 3 - Separate by both columns and rows 
p +
  facet_grid(am ~ cyl)

Liberar los ejes de los gráficos para que sean distintos:

facer_wrap(~ country, scales="free_y")

Eliminar cruces donde no hay datos:

p +
  facet_grid(vore ~ .,scale= "free_y", space = "free_y")

Espaciado entre facetas:

library(grid)
z + theme(panel.spacing.x=unit(2, "cm"))

Gráficos verticales

facet_wrap( ~ site, ncol = 1) + ## Facet layer

Espaciado entre facetas:

panel.spacing.y =unit(0.4, "cm")) +

Ocultar títulos de faceta:

theme(strip.background = element_blank(), strip.text = element_blank())

Facetas de lado

facet_wrap(~ str_to_title(tipo), nrow = 2, scales = "free_y", 
               strip.position="left")

Cortar textos de faceta (sin modificar los factores):

facet_wrap(~egreso, nrow=1, labeller = label_wrap_gen(width=10)) +

3.7.4 Elementos y temas

+ theme()

Dentro de la capa theme():

Especificar líneas: =element_line()

theme(
        axis.line=element_line(color="red")
)

Remover un elemento: =element_blank()

theme(
    panel.grid=element_blank()
)

Para especificar el eje afectado, se pone un punto y el eje al final del nombre del elemento, por ejemplo: axis.text.x

3.7.4.1 Elementos:

  • element_text()

  • element_rect()

  • element_line()

  • element_blank()

  • Ejes:

    • Marcas en los ejes: axis.ticks
    • Líneas de los ejes: axis.line
    • Etiquetas de los ejes: axis.text
  • Fondos:

    • panel.background
  • Rejillas:

    • panel.grid.major
    • panel.grid.minor

3.7.4.2 Cambiar texto

  • Texto de facetas: strip.text
  • Título de los ejes: axis.title
  • Números en los ejes: axis.text
plot +
  theme_minimal() +
  ## Customize the "minimal" theme with another custom "theme" call
  theme(
    text = element_text(family = "Bookman"),
    title = element_text(color = "gray25"),
    plot.caption = element_text(color = "gray30"),
    plot.subtitle = element_text(size = 12)
  )

Cambiar margen del texto:

  theme(axis.text.y = element_text(margin = margin(r = -10)),
        axis.text.x = element_text(margin = margin(b = -15))) +

Renombrar ejes:

labs(y="Cantidad de reclamos y consultas", x="Institución o vía de emisión") 

3.7.5 Combinar múltiples gráficos

Unir dos gráficos:

Si usan los mismos datos:

library(gridExtra)
basura_x2 <- grid.arrange(basura_gg, basura_p_gg, ncol=2)

Para dos gráficos distintos:

ggsave("foo.pdf", arrangeGrob(plot1, plot2))

Con cowplot:

library(cowplot)
empresas_combinado_cowplot <- plot_grid(empresas_tamaño_porc_gg, 
          empresas_trabajadores_porc_gg,
          leyenda_1,
          nrow = 3,
          align = "v",
          rel_heights = c(3, 3, 1))  

3.7.6 Ajustar espacio entre etiquetas de ejes y gráfico

Para acercar o alejar las etiquetas de las barras:

theme(axis.text.y = element_text(margin = margin(r = -3, l = 5))) +

3.7.7 Acercar leyenda al gráfico

theme(legend.margin = margin(20, 20, 20, 0)) + ##caja de la leyenda

3.7.8 Cambiar tamaño y hacer zoom en los datos

+ coord_cartesian(xlim=c(3,6))

Graficar con la misma relación entre ejes (si las unidades de medida son iguales)

+ coord_equal()

3.7.9 Guardar y aplicar temas

Guardar la configuración de elementos de la capa theme en un tema:

mi_tema <- theme(element.axis...)
plot + mi_tema

Expandir temas guardados con nuevas configuraciones:

mi_tema2 <- mi_tema + theme(element...

Ejemplo:

z +
  no_panels +
  theme(plot.background = element_rect(fill = myPink, color="black", size=3))

Elegir un tema por defecto (que se aplique a todos lo gráficos):

theme_set(mi_tema)

The arguments for theme_update() are the same as for theme(). When you call theme_update() and assign it to an object (e.g. called old), that object stores the current default theme, and the arguments update the default theme. If you want to restore the previous default theme, you can get it back by using theme_update() again. Let’s see how:_

## 2 - Update the default theme, and at the same time
## assign the old theme to the object old.
old <- theme_update(panel.background = element_blank(),
             legend.key = element_blank(),
             legend.background = element_blank(),
             strip.background = element_blank(),
             plot.background = element_rect(fill = myPink, color = "black", size = 3),
             panel.grid = element_blank(),
             axis.line = element_line(color = "red"),
             axis.ticks = element_line(color = "red"),
             strip.text = element_text(size = 16, color = myRed),
             axis.title.y = element_text(color = myRed, hjust = 0, face = "italic"),
             axis.title.x = element_text(color = myRed, hjust = 0, face = "italic"),
             axis.text = element_text(color = "black"),
             legend.position = "none")

## 3 - Display the plot z2 - new default theme used
z2

## 4 - Restore the old default theme
theme_set(old)

## Display the plot z2 - old theme restored
z2
3.7.9.0.1 Cargar temas con el paquete ggthemes
library(ggthemes)

3.8 Exportar gráficos

ggsave(file="grafico7_7_2c.jpg", plot=basura_x2, dpi="retina")

Cambiar DPI para especificar resolución

ggsave("Gráfico.png", units="in", width=5, height=4, dpi=300)

Exportar animación:

anim_save("Animación.gif", animation = last_animation())