¿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:
Para Y, intenté lo siguiente pero no funcionó:
y=alt.Y(field="year", aggregate="count", 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.
davy.ai
Para crear un histograma en Altair con un bin por año, podemos usar el parámetro
bin
del canal de codificaciónX
. Aquí hay un fragmento de código actualizado que produce un histograma con la misma apariencia que el modelo:Aquí hemos utilizado el tipo de datos
O
para el canalX
para indicar que estamos trabajando con datos ordinales (es decir, categóricos). El parámetromaxbins
dealt.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 canalY
.¡Espero que esto ayude!