2 votes

Altair combinant plusieurs ensembles de données

J'ai découvert récemment Vega/Vega-Lite y Altair et le considère comme un véritable concurrent pour le meilleur outil de traçage python.

Ce qui me pose problème actuellement, c'est le tracé d'informations provenant de deux cadres de données dans un même graphique où un ou deux axes sont partagés.

J'ai essayé des choses comme :

plot1 = alt.Chart(df1).mark_point().encode(x = 'time:T', y = [...])[...]
plot2 = alt.Chart(df2).mark_point().encode(x = 'time:T', y = [...])[...]

et cela fonctionne, mais c'est assez maladroit et pas génial.

Je suis tombé sur l'objet LayerChart, mais la documentation ne m'a pas montré clairement comment l'utiliser correctement pour tracer des ensembles de données multiples.

  • Quelqu'un a-t-il un exemple d'un tel tableau ?
  • Que dois-je faire pour obtenir un double axe des y ?

3voto

jakevdp Points 4711

Les graphiques comportant des ensembles de données différents peuvent être superposés à l'aide de l'un des mécanismes décrits dans la section "Graphiques". Documentation Altair .

Par exemple :

import pandas as pd
import altair as alt

df1 = pd.DataFrame({
    'times': [1, 2, 3],
    'values': [1, 5, 4],
})

df2 = pd.DataFrame({
    'times': [2, 3, 4],
    'values': [4, 2, 3],
})

chart1 = alt.Chart(df1).mark_line().encode(x='times', y='values')
chart2 = alt.Chart(df2).mark_line().encode(x='times', y='values')

chart1 + chart2

enter image description here

3voto

pylang Points 12013

Réalisez un code plus DRY en séparant la logique du graphique dans une fonction, puis en itérant.

Étant donné que

import pandas as pd
import altair as alt

df0 = pd.DataFrame(dict(times=[1, 2, 3], values=[2, 2, 7]))
df1 = pd.DataFrame(dict(times=[2, 3, 5], values=[3, 9, 8]))
df2 = pd.DataFrame(dict(times=[3, 6, 8], values=[2, 6, 7]))
df3 = pd.DataFrame(dict(times=[6, 7, 9], values=[3, 2, 5]))

Code

def base_chart(df):
    """Return an Altair chart."""
    # Add lengthy chart arguments here
    base = alt.Chart(
        df,
        width=500,
        height=300,
    ).mark_line(
    ).encode(
        x="times", 
        y="values"
    )
    return base

def layer_charts(dfs, chart_func):
    """Return a layered chart."""

    return alt.layer(*[chart_func(df) for df in dfs])

Démo

layer_charts([df0, df1, df2, df3], base_chart)

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X