2018-01-20

Rellenar área con teselas en ggplot2

Title

Problema

Con ggplot2 queremos rellenar una región cuadrada con teselas cuadradas. El intento original del usuario que plantéo la pregunta fue:

  • Datos
set.seed(1)
library(ggplot2)
# Datos
l = 1000
a = seq(0, 1, 1 / (l - 1))
x = rep(a, each = length(a))
y = rep(a, length(a))
k = length(x)
c = sample(1:10, k, replace = TRUE)
data <- data.frame(x, y, c)
# Gráfico
ggplot(data, aes(x = x, y = y)) + geom_point(shape = 15, color = c)

Solución

  • Alternativa 1
  • Reducimos el tamaño del data frame, l = 10 en el código anterior para poder apreciar los cuadrados. Y usamos el argumento "white" como colour p para resaltar las teselas con un contorno blanco.

    ggplot(data, aes(x = x, y = y, fill = c)) + geom_tile(colour = "white")
    
  • Alternativa 2
  • Creamos manualmente una paleta, y empleamos coord_equal para generar cuadrados, forzando a que una unidad en el eje x tenga la misma longitud que una unidad en el eje y.

    colors<-c("peachpuff", "yellow", "orange", "orangered", "red", 
              "darkred","firebrick", "royalblue", "darkslategrey", "black")
    ggplot(data, aes(x = x, y = y)) +
      geom_tile(aes(fill = factor(c)), colour = "white") +
      scale_fill_manual(values = colors, name = "Colours") +
      coord_equal()
    

Notas

Para apreciar lo que sucede cuando creamos el gráfico original con geom_point, reducimos el tamaño del data frame, a 10 x 10. Lo representamos seguido de las dos alternativas propuestas.

  • Nuevo data frame
  • l = 100
    a = seq(0, 1, 1 / (l - 1))
    x = rep(a, each = length(a))
    y = rep(a, length(a))
    k = length(x)
    c = sample(1:10, k, replace = TRUE)
    data <- data.frame(x, y, c)
    
  • Gráfico original
  • ggplot(data, aes(x = x, y = y)) + geom_point(shape = 15, color = c)
    
  • Alternativa 1
  • ggplot(data, aes(x = x, y = y, fill = c)) + geom_tile(colour = "white")
    
  • Alternativa 2
  • colors<-c("peachpuff", "yellow", "orange", "orangered", "red", 
              "darkred","firebrick", "royalblue", "darkslategrey", "black")
    ggplot(data, aes(x = x, y = y)) +
      geom_tile(aes(fill = factor(c)), colour = "white") +
      scale_fill_manual(values = colors, name = "Colours") +
      coord_equal()
    

Referencias

2018-01-16

Abrir simultáneamente múltiples hipervículos en Excel


Problema

Queremos abrir simultáneamente múltiples hipervículos en Excel.

Solución

  1. Abrimos el Editor de Microsoft Visual Basic: Alt+F11.
  2. Creamos la siguiente función en un módulo.
    • Sub Abrir_Hipervinculos()
          On Error Resume Next
          Dim hl As Hyperlink
          For Each hl In Selection.Hyperlinks
              hl.Follow
          Next hl
      End Sub
      
  3. Seleccionamos el rango de celdas que contiene los enlaces y presionamos Alt+F8.
  4. Tecleamos Alt+F8 y presionamos Ejecutar.
  5. Los enlaces se abrirán en el navegador predeterminado. Si alguna celda está vacía, o contiene un hipervínculo no válido, no se abrirán y no generará error pues hemos especificado On Error Resume Next.

Entradas relacionadas

Referencias

2018-01-14

Gráfico y tabla subyacente en una misma página en R

Problema

Queremos mostrar un gráfico junto con su tabla subyacente en una misma página en R.

  • Datos y gráfico original
df <- data.frame(
  group = c("A", "A", "A", "B", "B", "B"),
  x = c(1, 2, 3, 1, 2, 3),
  y = c(2, 5, 7, 7, 5, 3)
)
library(ggplot2)
p <- ggplot(data = df, aes(
  x = x,
  y = y,
  group = group,
  color = group
)) +
  geom_line() +
  geom_point()

Solución

Empleamos el paquete gridExtra, con tableGrob creamos la tabla y con grid.arrange ordenamos los dos elementos, la tabla y el gráfico, en una misma página.

library(gridExtra)
tbl <- tableGrob(t(df), rows = NULL , theme = ttheme_minimal())
grid.arrange(p,
             tbl,
             nrow = 2,
             as.table = TRUE,
             heights = c(3, 1))

Referencias

2018-01-12

Filtrar entre dos fechas con dplyr

Problema

Queremos filtra entre dos fechas utilizando el paquete dplyr.

    Patch       Date Prod_DL
1    BVG1   9/4/2015    3.43
2   BVG11  9/11/2015    3.49
3   BVG12  9/18/2015    3.45
4   BVG13  12/6/2015    3.57
5   BVG14 12/13/2015    3.43
6   BVG15 12/20/2015    3.47
  • Datos
df <- read.table(
  text = "Patch,Date,Prod_DL
  BVG1,9/4/2015,3.43
  BVG11,9/11/2015,3.49
  BVG12,9/18/2015,3.45
  BVG13,12/6/2015,3.57
  BVG14,12/13/2015,3.43
  BVG15,12/20/2015,3.47",
  sep = ",",
  stringsAsFactors = FALSE,
  header = TRUE,
  row.names = NULL
)

Solución

  • Alternativa 1
  • Formateamos la fecha correctamente y filtramos entre las dos fechas deseadas.

    library("dplyr")
    df$Date <-as.Date(df$Date,"%m/%d/%Y")
    df %>%
      select(Patch, Date, Prod_DL) %>%
      filter(Date > "2015-09-04" & Date < "2015-09-18")
    
        Patch       Date Prod_DL
    1   BVG11 2015-09-11    3.49
    
  • Alternativa 2
  • Formateamos la fecha correctamente y empleamos la función between: 'This is a shortcut for x >= left & x <= right, implemented efficiently in C++ for local values, and translated to the appropriate SQL for remote tables.'. Por tanto es necesario ajustar las fechas pues incluye ambas fechas en los dos lados. Necesitamos usar as.Date, explicación aquí.

    df$Date <- as.Date(df$Date, "%m/%d/%Y")
    df %>% 
      select(Patch, Date, Prod_DL) %>%
      filter(between(Date, as.Date("2015-09-05"), as.Date("2015-09-17")))
    
        Patch       Date Prod_DL
    1   BVG11 2015-09-11    3.49
    

    Referencias

    2017-12-31

    Importar datos desde una URL en R

    Problema

    ¿Cómo podemos importar datos desde una URL en R? Tenemos una URL en la que hay un fichero de texto y queremos importarlo en R sin necesidad de descargarlo antes de importarlo.

    Si accedemos a esta dirección, nos aparecerá una ventana emergente indicándonos si queremosa abrirlo o guardarlo.

    http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv
    

    Solución

    Simplemente indicamos a la función correspondiente, la ruta URL. Además del paquete base, muestro dos ejemplos con dos paquetes muy populares: data.table y readr.

    • Base
    • ad <- read.csv("http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv")
      head(ad)
      
        X    TV radio newspaper sales
      1 1 230.1  37.8      69.2  22.1
      2 2  44.5  39.3      45.1  10.4
      3 3  17.2  45.9      69.3   9.3
      4 4 151.5  41.3      58.5  18.5
      5 5 180.8  10.8      58.4  12.9
      6 6   8.7  48.9      75.0   7.2
      
    • data.table
    • library(data.table)
      ad <- fread("http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv")
      head(ad)
      
      V1    TV radio newspaper sales
      1:  1 230.1  37.8      69.2  22.1
      2:  2  44.5  39.3      45.1  10.4
      3:  3  17.2  45.9      69.3   9.3
      4:  4 151.5  41.3      58.5  18.5
      5:  5 180.8  10.8      58.4  12.9
      6:  6   8.7  48.9      75.0   7.2
      
    • readr
    • library(readr)
      ad <- read_csv("http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv")
      head(ad)
      
      # A tibble: 6 x 5
           X1    TV radio newspaper sales
                
      1     1 230.1  37.8      69.2  22.1
      2     2  44.5  39.3      45.1  10.4
      3     3  17.2  45.9      69.3   9.3
      4     4 151.5  41.3      58.5  18.5
      5     5 180.8  10.8      58.4  12.9
      6     6   8.7  48.9      75.0   7.2
      

    Referencias

    2017-12-24

    Google Trends en R con gtrendsR

    Title

    Problema

    Deseamos importar y representar gráficamente en R datos de Google Trends. Como el siguiente ejempo en el que mostramos el interés en el tiempo de estos 3 términos de búsqueda.

    Solución

    Empleamos el paquete gtrendsR. Básicamente consiste de una función, gtrends, que extrae la información de Google Trends.

    library("gtrendsR")
    palabras_clave <- c("Pho", "Ramen", "Soba")
    tendencias <- gtrends(palabras_clave, time = "all")
    plot(tendencias)
    
  • Especificando la categoría y usando ggplot2
  • Abajo, en la sección notas, más información sobre los argumentos.

    id <- categories[grepl("^Cooking", categories$name), ]
    tendencias_gg <- gtrends(palabras_clave, 
                             time = "all", 
                             category = as.numeric(id[, 2]))
    
    library(ggplot2)
    tendencias_gg <- tendencias_gg$interest_over_time
    ggplot(data = tendencias_gg) + geom_line(aes(x = date, y = hits, colour = keyword), size =1)+
      scale_x_date(date_breaks = "1 year", date_labels = "%Y")+
      theme_bw() 
    

    Notas

    Los principales argumentos de gtrends son:

    keyword - Las palabras clave que queremos consulta, con un máximo de 5 cada vez.
    geo - Un vector con los country_codes de los países para la consulta. Por defecto es en todo el mundo (worldwide).
    time - Una cadena de texto con el periodo de tiempo deseado. Por defecto los últimos 5 años.
    gprop - Producto de Google: web (por defecto), noticias (news), imágenes (imágenes), froogle, y youtube.
    category - El id de la categoría a consultar.

    Para consultar los countries_codes y los ids de la categoría.

    data("countries")
    head(countries)
    
     country_code           description sub_code
    1           AD              .ANDORRA         
    2           AD                 Escas    AD-04
    3           AE .UNITED ARAB EMIRATES         
    4           AE             Abu Dhabi    AE-AZ
    5           AE Ahmed Bin Rashid Port    AE-AZ
    6           AE           Al Fujayrah    AE-FU
    
    data("categories")
    head(categories)
    
                                  name   id
    1                   All categories    0
    3             Arts & Entertainment    3
    5 Celebrities & Entertainment News  184
    6               Comics & Animation  316
    8                   Animated Films 1104
    9                    Anime & Manga  317
    
    gtrends crea una lista de 6 data frames:

    names(tendencias)
    
    [1] "interest_over_time" "interest_by_region" "interest_by_dma"   
    [4] "interest_by_city"   "related_topics"     "related_queries"
    
    La función plot representa gráficamente el data frame interest_over_time.

    Referencias

    2017-12-14

    Renombrar columnas duplicadas al unir dos tablas con dplyr

    Title

    Problema

    Cuando unimos dos tablas con dplyr, las columnas duplicadas de la primera tabla recibirán por defecto el sufijo .x y las de la segunda tabla el sufijo .y. En el siguiente ejemplo, las columnas mpg.x y mpg.y. ¿Cómo podemos modificar esos sufijos?

    library("dplyr") 
    left_join(mtcars, mtcars[, c("mpg", 'cyl')], by = c("cyl")) %>% head()
    
      mpg.x cyl disp  hp drat   wt  qsec vs am gear carb mpg.y
    1    21   6  160 110  3.9 2.62 16.46  0  1    4    4  21.0
    2    21   6  160 110  3.9 2.62 16.46  0  1    4    4  21.0
    3    21   6  160 110  3.9 2.62 16.46  0  1    4    4  21.4
    4    21   6  160 110  3.9 2.62 16.46  0  1    4    4  18.1
    5    21   6  160 110  3.9 2.62 16.46  0  1    4    4  19.2
    6    21   6  160 110  3.9 2.62 16.46  0  1    4    4  17.8
    

    Solución

    Empleamos el argumento suffix, suministrando un vector de longitud 2 para las dos tablas unidas. En nuestro ejemplo, nombramos las columnas mpg_original (sufijo _original) y mpg_new (sufijo _new).

    left_join(mtcars, mtcars[,c("mpg","cyl")], 
                  by = c("cyl"), 
                  suffix = c("_original", "_new")) %>% head()
    
  • Datos
  • mpg_original cyl disp  hp drat   wt  qsec vs am gear carb mpg_new
    1           21   6  160 110  3.9 2.62 16.46  0  1    4    4    21.0
    2           21   6  160 110  3.9 2.62 16.46  0  1    4    4    21.0
    3           21   6  160 110  3.9 2.62 16.46  0  1    4    4    21.4
    4           21   6  160 110  3.9 2.62 16.46  0  1    4    4    18.1
    5           21   6  160 110  3.9 2.62 16.46  0  1    4    4    19.2
    6           21   6  160 110  3.9 2.62 16.46  0  1    4    4    17.8
    

    Referencias

    Nube de datos