Bàsic

  • Introducció

    Altair és una biblioteca declarativa de visualització estadística per a Python que ofereix una gramàtica de visualització potent i concisa per crear ràpidament una àmplia gamma de gràfics estadístics.

    Altair es basa en Vega-Lite, una gramàtica d’alt nivell per a gràfics interactius, i proporciona una API de Python senzilla que genera especificacions de Vega-Lite en format JSON.

    Entorn de treball

    Crea un projecte amb streamlit:

    uv init streamlit-basic
    cd streamlit-basic
    uv add polars streamlit

    Weather data

    Data

    A Altair, les dades es basen en data frames, que consisteix en un conjunt de columnes de dades amb nom.

    La visualització estadística comença amb data frames "tidy".

    Aquí començarem creant un data frame senzill (df) que conté la precipitació mitjana (precip) per a una ciutat i un mes determinat:

    import polars as pl
    import streamlit as st
    
    df = pl.DataFrame({
        'city': ['Seattle', 'Seattle', 'Seattle', 'New York', 'New York', 'New York', 'Chicago', 'Chicago', 'Chicago'],
        'month': ['Apr', 'Aug', 'Dec', 'Apr', 'Aug', 'Dec', 'Apr', 'Aug', 'Dec'],
        'precip': [2.68, 0.87, 5.31, 3.94, 4.13, 3.58, 3.62, 3.98, 2.56]
    })
    
    st.write(df)

    L’objecte Chart

    L’objecte fonamental a Altair és Chart, que rep un data frame com a únic argument:

    import altair as alt
    
    chart = alt.Chart(df)

    Fins ara hem definit l’objecte Chart i li hem passat el data frame senzill que hem generat més amunt. Encara no hem indicat al gràfic que faci res amb les dades.

    Marques i codificacions

    Amb un objecte gràfic, ara podem especificar com volem visualitzar les dades.

    Primer indiquem quin tipus de marca gràfica (forma geomètrica) volem utilitzar per representar les dades. Podem establir l’atribut mark de l’objecte gràfic utilitzant els mètodes Chart.mark_*.

    Per exemple, pots mostrar les dades com a punts utilitzant Chart.mark_point():

    # ...
    
    chart = alt.Chart(df).mark_point()
    
    st.altair_chart(chart)

    Aquí el renderitzat consisteix en un punt per fila del conjunt de dades, tots dibuixats un damunt de l’altre, ja que encara no hem especificat la posició d’aquests punts.

    Per separar visualment els punts, pots mapar diversos canals de codificació, o simplement canals, a camps del conjunt de dades. Per exemple, pots codificar el camp city de les dades utilitzant el canal y, que representa la posició a l’eix y dels punts.

    Per especificar-ho, utilitza el mètode encode:

    chart = alt.Chart(df).mark_point().encode(
        y='city'
    )

    El mètode encode() construeix un mapa clau-valor entre canals de codificació (com ara x, y, color, shape, size, etc.) i camps del conjunt de dades, accedits pel seu nom.

    Per als data frames, Altair determina automàticament un tipus de dada apropiat per a la columna assignada, que en aquest cas és el tipus nominal, que indica valors categorics no ordenats.

    Tot i que ara hem separat les dades per un atribut, encara tenim múltiples punts sobreposats dins de cada categoria.

    Separem-los encara més afegint un canal de codificació x, mapat al camp 'precip':

    chart = alt.Chart(df).mark_point().encode(
        x='precip',
        y='city'
    )

    El tipus de dada del camp 'precip' torna a ser inferit automàticament per Altair, i en aquest cas es tracta com a tipus quantitatiu (és a dir, un nombre real). Veiem que també s’afegeixen automàticament línies de quadrícula i títols d’eixos adequats.

    A dalt hem especificat parelles clau-valor utilitzant arguments per paraula clau (x='precip'). A més, Altair ofereix mètodes de construcció per a definicions de codificació, utilitzant la sintaxi alt.X('precip'). Aquesta alternativa és útil per proporcionar més paràmetres a una codificació, com veurem més endavant.

    chart = alt.Chart(df).mark_point().encode(
        alt.X('precip'),
        alt.Y('city')
    )

    Els dos estils per especificar codificacions es poden barrejar: x='precip', alt.Y('city') també és una entrada vàlida per a la funció encode.

    Als exemples anteriors, el tipus de dada per a cada camp s’infereix automàticament en funció del seu tipus dins del data frame.

    També pots indicar explícitament el tipus de dada a Altair anotant el nom del camp:

    Nom del campTipus de dada
    'b:N'indica un tipus nominal (dades categòriques no ordenades)
    'b:O'indica un tipus ordinal (dades ordenades per rang)
    'b:Q'indica un tipus quantitatiu (dades numèriques amb magnituds significatives)
    'b:T'indica un tipus temporal (dades de data/hora)

    Per exemple, alt.X('precip:N').

    L’anotació explícita de tipus de dades és necessària quan les dades es carreguen des d’una URL externa directament per Vega-Lite (evitant Polars completament), o quan volem utilitzar un tipus diferent del que s’ha inferit automàticament.

    ✅ Activitat

    Què creus que passarà amb el nostre gràfic anterior si tractem precip com una variable nominal o ordinal, en lloc d’una variable quantitativa? Modifica el codi anterior i comprova-ho!

    Data Transformation: Aggregation

    TODO

    Altair - Introduction