2015-04-29

Etiquetar los puntos de un diagrama de dispersión con ggplot2

Title Anteriormente vimos cómo etiquetar los puntos de un diagrama de dispersión mediante la función text del paquete graphics. En esta entrada lo haremos como ggplot2.

Problema

Tenemos un diagrama de dispersión y deseamos etiquetar puntos. Para ganar en claridad seleccionaremos solamente los 10 primeros puntos.

data <- LifeCycleSavings[1:10, ]
qplot(dpi, sr, data = data)

Solución

Utilizamos la función geom_text para etiquetar los puntos del diagrama de dispersión.

  • qplot
qplot(dpi, sr, data = data, label = rownames(data))+  
  geom_text(vjust = 1.5)
  • ggplot
p <- ggplot(data, aes(x = dpi, y = sr, label = rownames(data)))
p +  geom_point() + geom_text(vjust = 1.5)

Notas

Con el argumento vjust cambiamos la posición de la etiqueta verticalmente. Por defecto encima del punto, lo aumentamos 1.5 para situarlo debajo. Con hjust se puede cambiar la posición de la etiqueta horizontalmente.

Referencias

2015-04-27

Listas desplegables que permiten seleccionar múltiples elementos

Title

Problema

Deseamos incluir en una celda más de un elemento de una lista desplegable.

En las celdas B4 y B5 se observa como hemos incluido más de un elemento mediante la lista desplegable.

Solución

Empleamos una solución propuesta en un artículo del blog de Office de Microsoft por Debra Dalgleish.

  1. Creamos una lista desplegable basada en una lista de entradas válidas.
  2. Clic con el botón secundario del ratón sobre la hoja y clic sobre Ver código.
  3. Pegamos el siguiente código.
  4. ' Developed by Contextures Inc.
    ' www.contextures.com
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rngDV As Range
    Dim oldVal As String
    Dim newVal As String
    
    'Ejecuta el código sólo si cambia una celda 
    If Target.Count > 1 Then GoTo exitHandler
      
    Select Case Target.Column
      Case 2        'Esta línea sólo funciona para la columna B
        'Case 2, 5, 6 'Esta línea en caso de múltiples columnas
        On Error Resume Next
        'check the cell for data validation
        Set rngDV = Target.SpecialCells(xlCellTypeAllValidation)
        On Error GoTo exitHandler
        If rngDV Is Nothing Then GoTo exitHandler
        
        If Intersect(Target, rngDV) Is Nothing Then
           'No hace nada
        Else
            Application.EnableEvents = False
            newVal = Target.Value
            Application.Undo
            oldVal = Target.Value
            Target.Value = newVal
            If oldVal <> "" Then
              If newVal <> "" Then
                Target.Value = oldVal _
                  & ", " & newVal
              End If
            End If
        End If
    
    End Select
    
    exitHandler:
      Application.EnableEvents = True
    End Sub
    
    Si la lista desplegable no está en la columna B debemos cambiar una línea de código. En lugar de Case 2 pondremos el número de la columna correspondiente. Si tenemos listas desplegables en múltiples columnas escribiremos el número de las mismas seguido de comas, por ejemplo: Case 2, 5, 6.

  5. Si nuestro fichero no puede guardar macros, lo guardamos como *.xlsm

Referencias

2015-04-25

Conversor de divisas en Excel

Title En Excel es posible desarrollar sencillas aplicaciones relativamente sofisticadas con poco esfuerzo. Hace mucho tiempo construí este conversor de divisas que trata de reproducir el siguiente conversor de Oanda.

En Oanda

En Excel

Para crearlo nos valemos de una consulta web para obtener los tipos de cambio actualizados, dos listas desplegables de un rango de celdas para seleccionar las divisas y código en VBA para actualizar la consulta, convertir las divisas y poder alternarlas.

2015-04-23

Añadir interactivamente las coordenadas a un diagrama de dispersión en R

Title

Problema

Tenemos un diagrama de dispersión y deseamos añadir interactivamente las coordinadas de los puntos.

plot(sr ~ dpi, 
     LifeCycleSavings, 
     xlab = 'Real Per-Capita Disposable Income', 
     ylab = 'Aggregate Personal Savings', 
     main = 'Intercountry Life-Cycle Savings Data')

Solución

Utilizamos la función identify para etiquetar interactivamente aquellos puntos que deseamos. Con la función paste encadenamos los elementos que deseamos añadir. En este caso el país y las coordenadas.

plot(sr ~ dpi, 
     LifeCycleSavings, 
     xlab = 'Real Per-Capita Disposable Income', 
     ylab = 'Aggregate Personal Savings', 
     main = 'Intercountry Life-Cycle Savings Data')
identify(LifeCycleSavings$dpi, 
         LifeCycleSavings$sr, 
         labels = paste(row.names(LifeCycleSavings),
                        ' (', LifeCycleSavings$dpi, 
                        ', ', LifeCycleSavings$sr, ')', 
                        sep = ''), 
         n = 3) 

Notas

Se trata de un ejemplo muy similar al que vimos en Etiquetar interactivamente un diagrama de dispersión. Con el argumento cex podríamos cambiar el tamaño de fuente. Con el argumento n establecemos el número máximo de puntos que deseamos identificar. Si no lo especificamos podremos etiquetar tantos puntos como deseemos. Para terminar el proceso y que muestre los puntos señalados hasta ese momento presionamos la tecla Esc. O bien presionamos el botón Finish en las pestaña Plot de RStudio.

Referencias

2015-04-20

Muestra aleatoria de filas de un data frame en R

Title

Problema

Deseamos extraer una muestra aleatoria de filas de un data frame en R.

Solución

Emplearemos los datos incluidos en el paquete hflights. Es un data frame de 227.496 filas y 21 columnas que contiene información sobre los vuelos que parten de los aeropuertos de Houston: IAH (George Bush Intercontinental) y HOU (Houston Hobby).

require(hflights)
head(hflights)
  • Paquete base
set.seed(1)
hflights[sample(nrow(hflights), 10), ] # 10 filas
# Mostramos solamente 5 columnas:
hflights[sample(nrow(hflights), 10), 1:5]
        Year Month DayofMonth DayOfWeek DepTime
1366969 2011     3         14         1    1825
1040415 2011     3         12         6    1745
4202032 2011     9         18         7     915
2209673 2011     5         16         1    1521
4693709 2011    10         15         6    1350
3107473 2011     7         23         6    1644
4323034 2011     9         28         3    1739
5987852 2011    12         17         6     800
2206152 2011     5         18         3     736
4699698 2011    10          6         4     748
  • sqldf
require(sqldf)
sqldf("SELECT * FROM hflights ORDER BY RANDOM(*) LIMIT 10")
La desventaja con sqldf es que no podemos generar números pseudoaletorios con set.seed para obtener los mismos resultados y que sean reproducibles pues la función RANDOM de SQLITE no lo permite.

Entradas relacionadas

2015-04-18

Resaltar filas alternas en Excel

Title

Problema

Para mejorar la legibilidad deseamos diferenciar cada fila resaltando las filas alternas.

Soluciones

    1. Crear una tabla
  1. Clic en una celda del rango de celdas que deseamos convertir en tabla.
  2. En el grupo Tablas de la ficha Insertar, clic en Tabla.
  3. O bien con el método de teclado abreviado: Ctrl+T

  4. Si el rango incluye un encabezado, activamos la casilla de verificación La tabla tiene encabezados.
Si lo deseamos, podemos convertir la tabla en rango posteriormente.
  1. Clic en una celda de la tabla que deseamos convertir en rango.
  2. En el grupo Herramientas de tabla de la ficha Diseño, clic en Convertir en rango..
    2. Formato condicional

Aplicamos la siguiente regla al rengo de celdas deseado. En este caso excluimos el encabezado que formateamos manualmente.

Básicamente la fórmula evalúa si la fila es par o impar. Le aplica el formato que especificamos si es impar, es decir, si la condición es verdadera y el resto es distinto de cero.

En Excel 2007:

=RESIDUO(FILA();2)

En Excel 2010 y 2013:

=RESTO(FILA();2)

Otro ejemplo

Siguiendo el mismo razonamiento podemos hacer lo mismo usando como referencia no solamente el número de fila sino por ejemplo números o fechas correlativas.

Referencias

  • Microsoft Support
  • 2015-04-15

    Múltiples diagramas de caja usando la función plot en R

    Title En una entrada anterior representamos varios diagramas de caja simultáneamente mediante la función boxplot.

    Olvidamos mencionar que también podemos crearlos con la función plot. Le suministramos un factor y un vector numérico como argumentos x e y, y creará automáticamente un diagrama de caja.

    Dos ejemplos

    # Horizontal
    require(MASS)
    plot(UScereal$mfr, UScereal$sugar, 
            names =  c('Mills', 'Kelloggs', 'Nabisco', 'Post',
                       'Quaker Oats', 'Purina'),
            main =  'Contenido de azúcar por marca',
            col = c("beige", "blanchedalmond", "bisque1",
                    "bisque2", "bisque3", "bisque4"),
            xlab = 'Azúcar (gramos por porción)',
            horizontal = TRUE)
    
    # Vertical
    plot(factor(airquality$Month), 
         airquality$Ozone,
            main = 'Calidad del aire',
            xlab = 'mes',
            ylab = 'ozone (ppb)',
            col = 'skyblue')
    
    Como airquality$Month no es un factor, necesitamos convertirlo previamente .

    Entradas relacionadas

    Referencias

    2015-04-13

    Etiquetar interactivamente los puntos de un diagrama de dispersión en R

    Title

    Problema

    Tenemos un diagrama de dispersión y deseamos etiquetar interactivamente algunos de los puntos.

    plot(sr ~ dpi, 
         LifeCycleSavings, 
         xlab = 'Real Per-Capita Disposable Income', 
         ylab = 'Aggregate Personal Savings', 
         main = 'Intercountry Life-Cycle Savings Data')
    

    Solución

    Utilizamos la función identify para etiquetar interactivamente aquellos puntos que deseamos.

    plot(sr ~ dpi, 
         LifeCycleSavings, 
         xlab = 'Real Per-Capita Disposable Income', 
         ylab = 'Aggregate Personal Savings', 
         main = 'Intercountry Life-Cycle Savings Data')
    identify(LifeCycleSavings$dpi, 
             LifeCycleSavings$sr, 
             labels = row.names(LifeCycleSavings), 
             n = 5)
    
    Tras ejecutar el código, hacemos clic sobre o cerca de los puntos que deseamos etiquetar.

    Notas

    Con el argumento cex podríamos cambiar el tamaño de fuente. Con el argumento n establecemos el número máximo de puntos que deseamos identificar. Si no lo especificamos podremos etiquetar tantos puntos como deseemos. Para terminar el proceso y que muestre los puntos señalados hasta ese momento presionamos la tecla Esc. O bien presionamos el botón Finish en las pestaña Plot de RStudio.

    Referencias

    2015-04-10

    Consulta de actualización con los datos de otra tabla

    Title Crear una consulta de actualización con los datos de otra tabla es muy sencillo. Como ejemplo vamos a actualizar el campo PrecioUnidad de la tabla Productos de la base de datos Neptuno.

    Ejemplo

    Es necesario que los tipos de datos de ambas tablas sean compatibles. Para evitar problemas creamos una copia de la tabla Productos (ProductosActualizados) en la que modificamos los precios de los 10 primeros productos.

    1. Creamos una consulta de selección en la que unimos las dos tablas por la clave principal (IdProducto).
    2. En la pestaña Diseño, en el grupo Tipo de consulta, clic en Actualizar.
    3. Doble clic en el campo que deseamos actualizar: PrecioUnidad.
    4. En la fila Actualizar a de la consulta añadimos el campo de la tabla de origen siguiendo la sintaxis: [tabla_de_origen]![campo_de_origen].
    5. En la pestaña Diseño, en el grupo Resultados, clic en Ejecutar y confirmamos la actualización presionando Sí.
    Resultado final

    Consulta SQL

    UPDATE Productos 
    INNER JOIN ProductosActualizados 
      ON Productos.IdProducto = ProductosActualizados.IdProducto 
    SET Productos.PrecioUnidad = [ProductosActualizados]![PrecioUnidad];
    

    Entradas relacionadas

    Nube de datos