es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo crear un histograma de valores anuales con etiquetas cada año?

Tengo una lista de años que quiero convertir en un histograma en Altair. Quiero un sólo bloque por año.

Esto es lo que puedo hacer hasta ahora:

import altair as alt
from vega_datasets import data
import pandas as pd
import pdb

alt.renderers.enable("altair<em>viewer")
my</em>years = [2010, 2011, 2011, 2015, 2012]
df = pd.DataFrame(data={"year": my<em>years})  # , parse</em>dates=["Date"])
df["year"] = pd.to<em>datetime(df["year"], format="%Y")
mychart = (
    alt.Chart(df)
    .mark</em>bar()
    .encode(
        x=alt.X(
            "year(year):Q",
            # bin=True,
            bin=alt.Bin(divide=<a href="https://i.stack.imgur.com/2x51C.png">1</a>),
            timeUnit=alt.TimeUnitParams(unit="year", step=1),
            # type="temporal",
            axis=alt.Axis(
                format="%Y",
                # tickCount="year",
                # tickMinStep=1
                # values=list(range(min(source["year"]), max(source["year"]), 1)),
            )
            # axis=alt.Axis(tickCount="year")
        ),
        y="count()",
    )
)

mychart.show()

Quiero que se parezca más a este boceto:

enter image description here

Para Y, intenté lo siguiente pero no funcionó:

y=alt.Y(field=&quot;year&quot;, aggregate=&quot;count&quot;, axis=alt.Axis(tickMinStep=1))

Como bonificación, el primer bloque debería ser el año mínimo y el último bloque debería ser el año máximo.

Ten en cuenta el código comentado, he intentado algunas formas de lograrlo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear un histograma en Altair con un bin por año, podemos usar el parámetro bin del canal de codificación X. Aquí hay un fragmento de código actualizado que produce un histograma con la misma apariencia que el modelo:

    import altair as alt
    import pandas as pd
    
    my_years = [2010, 2011, 2011, 2015, 2012]
    df = pd.DataFrame({'year': my_years})
    df['year'] = pd.to_datetime(df['year'], format='%Y')
    
    min_year = df['year'].min().year
    max_year = df['year'].max().year
    
    histogram = alt.Chart(df).mark_bar().encode(
        alt.X('year(year):O', bin=alt.Bin(maxbins=30), axis=alt.Axis(format='%Y')),
        alt.Y('count()', axis=alt.Axis(title='Count')),
    )
    
    histogram = histogram.properties(
        width=500,
        height=300,
        title=f'Histograma de Años ({min_year}-{max_year})'
    )
    
    histogram.show()
    

    Aquí hemos utilizado el tipo de datos O para el canal X para indicar que estamos trabajando con datos ordinales (es decir, categóricos). El parámetro maxbins de alt.Bin controla el número de bins en el histograma, y lo hemos establecido en 30 para asegurarnos de obtener un bin por año. También hemos agregado un título al gráfico que muestra el rango de años en los datos.

    Tenga en cuenta que hemos omitido el canal de codificación Y, ya que Altair agregará automáticamente un agregado de recuento si pasamos una cadena vacía ('') al canal Y.

    ¡Espero que esto ayude!

Comments are closed.