2018-01-20

Rellenar área con teselas en ggplot2

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, contiene texto no reconocido como hipervínculo, o un hipervínculo no válido, los enlaces 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

    Las entradas más visitadas en 2017

    Las 10 entradas más visitadas en 2017 en las categorías de R, Excel, Access y VBA han sido:

    R

    1. Eliminar duplicados de un data frame en R
    2. Test de normalidad Shapiro–Wilk en R
    3. Calcular la moda en R usando el paquete modeest
    4. Superponer gráficos en R: distribución normal
    5. Distribución de frecuencias en R
    6. Medir el tiempo de ejecución de procesos en R
    7. Introducción al paquete igraph para R
    8. Calcular el porcentaje del total de la columna en R
    9. Cómo comparar dos data frames en R
    10. Una introducción a la minería de textos en R con El Quijote

    Excel

    1. Convertir horas en un número decimal en Excel
    2. Invertir lista en Excel
    3. Generar números aleatorios entre dos valores con decimales
    4. Omitir todos los errores de una hoja
    5. Cómo usar BUSCARV y SUMAR conjuntamente en Excel
    6. Concatenar comillas en Excel
    7. Números aleatorios de una lista o rango de opciones
    8. Pegar una lista filtrada con Excel en las celdas visibles
    9. Formato condicional que diferencia ceros y celdas vacías
    10. Calcular la duración del día y el horario de verano en Excel

    Access

    1. Cuadros combinados en cascada en Ms Access
    2. Ocultar Access al usuario salvo el formulario
    3. Cambiar programáticamente la ruta de tablas vinculadas en Access
    4. Usar un cuadro combinado para buscar al teclear en Access
    5. Crear una consulta de UNION y de UNION ALL en Ms Access
    6. Convertir texto en número conservando los decimales en Access
    7. Porcentaje del total de la columna en una consulta de Access
    8. Generar números aleatorios entre dos valores en Ms Access
    9. Consulta para generar una muestra aleatoria en Ms Access
    10. La función redondear en Access, redondeo del banquero

    VBA

    1. Importar ficheros CSV en Excel mediante VBA
    2. Sucesión de Fibonacci en Excel y VBA
    3. Cambiar origen de datos de múltiples tablas dinámicas con VBA
    4. Medir el tiempo de ejecución de subrutinas en VBA
    5. Ocultar o mostrar todas las hojas de un libro de Excel (VBA)
    6. Exportar tabla o consulta de Access como CSV
    7. Insertar un reloj en Excel usando VBA
    8. VBA: cambiar el texto a mayúsculas, minúsculas o nombre propio
    9. Mostrar u ocultar formas en Excel mediante VBA
    10. Obtener el nombre de usuario de Windows con VBA en Excel

    Entradas relacionadas

    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

    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

    Nube de datos