X, Y ¿Qué?

En el cápitulo 2 aprendimos como crear gráficos básicos especificando un marcador (como barras o puntos) y codificando columnas de valores de tu DataFrame a elementos del gráfico como X e Y. Altair se toma la libertad de tomar decisiones por ti cuando a detalles se refiere. Por ejemplo, si le asignas la columna Periodo a X en tu gráfico, altair asume que el eje tiene que ir desde el valor mínimo encontrado en tal columna hasta el valor máximo de Periodo. También asume que el título del eje es el nombre de la columna: Periodo. Y si especificas el tipo de datos que Periodo es (cuantitativo, ordinal, nominal o temporal) también decide como codificarlo al eje y como etiquetar los tics. Si fuera una serie de fechas altair lo exhibiria de una manera diferente a si fuera una serie de números o una serie de etiquetas.

Tomemos por ejemplo el gráfico de líneas del capítulo 2:

Primero asignamos los datos a un DataFrame:

import pandas as pd
import altair as alt
datos = pd.read_csv("../../datos/poblacion.csv")

datos.head()
Periodo Número de personas
0 1910 15160369
1 1921 14334780
2 1930 16552722
3 1940 19653552
4 1950 25791017

Ejemplo del Capítulo 2:

alt.Chart(datos).mark_line().encode(
    x = 'Periodo',
    y = 'Número de personas',
)

png

Como puedes ver altair esta leyendo la columna Periodo como una cantidad cuantitativa aunque sabemos que representa los años de 1910 a 2015. Lo fácil sería especificar el tipo de datos que cada asignación es como lo hemos hecho antes:

alt.Chart(datos).mark_line().encode(
    x = 'Periodo:T',
    y = 'Número de personas:Q',
)

png

O-oh. Le hemos dicho a altair que Periodo es una cantidad temporal pero altair no sabe a que cantidad de tiempo nos referimos, ¿segundos? ¿días? ¿nanosegundos?

Pera esto es mejor transformar nuestros datos en pandas que en altair. Pandas es una biblioteca de python muy poderosa y eficáz, si es necesario manipular tus datos se te recomienda hacerlo en pandas y no en altair.

datos['Periodo'] = pd.to_datetime(datos['Periodo'], format = '%Y')

pd.to_datetime es un método de pandas que toma una serie de datos y la transforma a una serie de fechas (oséa una serie de datos de tipo datetime), pandas hace lo mejor que pueda para deducir el formato en el que se encuentran tus datos pero si lo sabes es mejor. En este caso es ‘%Y’ porque nuestros datos son de 4 dígitos representando un año cada uno.

alt.Chart(datos).mark_line().encode(
    x = 'Periodo:T',
    y = 'Número de personas:Q',
)

png

Ahora las etiquetas de cada tic en el eje X si parecen años.

¿Qué tal si queremos modificar el titulo de cada eje? Este tipo de especificaciones son más complejas y requieren utilizar los objetos de altair, en este caso: alt.X() y alt.Y().

alt.Chart(datos).mark_line().encode(
    x = alt.X('Periodo:T', title = "Año",),
    y = alt.Y('Número de personas:Q', title = 'Población')
)

png

Utilizando los objetos de altair es como podemos modificar nuestros gráficos al gusto. Expandamos un poco más este gráfico.

alt.Chart(datos).mark_line().encode(
    x = alt.X("Periodo:T", title = "Año"),
    y = alt.Y("Número de personas:Q", title = "Población", axis = alt.Axis(format = 's')),
)

png

Aquí estamos utilizando el objeto alt.Axis() para personalizar nuestro eje Y el cual es un argumento dentro del objeto alt.Y(). Esto no es ningún problema para altair. Como altair lo que hace es traducir tu código python a Vega-lite que es una librería de JavaScript sigue las mismas convenciones en varios aspectos. En este caso, el formato 's' le indica a altair que estamos hablando en millares.

Terminemos de personalizar este gráfico con un título más apropiado.

alt.Chart(datos).mark_line().encode(
    x = alt.X("Periodo:T", title = "Año"),
    y = alt.Y("Número de personas:Q", title = "Población", axis = alt.Axis(format = 's')),
).properties(
    title = "La Población de México 1910-2015"
)

png


Algunos de ustedes tal vez esten pensando que los títulos de los ejes son un poco redundantes ya que hemos agregado un título al gráfico. Tan simple como borrarlos:

alt.Chart(datos).mark_line().encode(
    x = alt.X("Periodo:T", title = ""),
    y = alt.Y("Número de personas:Q", title = "", axis = alt.Axis(format = 's')),
).properties(
    title = "La Población de México 1910-2015"
)

png