# https://altair-viz.github.io/gallery/stem_and_leaf.html

import altair as alt
import numpy as np
import pandas as pd

np.random.seed(42)

# Generating random data
source = pd.DataFrame(
    {"samples": np.random.normal(50, 15, 100).astype(int).astype(str)}
)

# Splitting stem and leaf
source["stem"] = source["samples"].str[:-1]
source["leaf"] = source["samples"].str[-1]

source = source.sort_values(by=["stem", "leaf"])

# Determining leaf position
source["position"] = source.groupby("stem").cumcount().add(1)

# Creating stem and leaf plot
alt.Chart(source).mark_text(align="left", baseline="middle", dx=-5).encode(
    alt.X("position:Q", title="", axis=alt.Axis(ticks=False, labels=False, grid=False)),
    alt.Y("stem:N", title="", axis=alt.Axis(tickSize=0)),
    text="leaf:N",
).configure_axis(labelFontSize=20).configure_text(fontSize=20)
