Altair Quick Menubar#
import polars as pl
import altair as alt
# Pandas read_csv is slightly better at reading remote
penguins = pl.from_pandas(pl.read_csv("https://pos.it/palmer-penguins-github-csv", null_values="NA").to_pandas())
# Iffy to Altair condition outside the function but... for example purposes:
click_condition = alt.selection_point(fields=["species"], value="Adelie")
def get_altair_button(df, column, width=200):
# Make base encoding
base = alt.Chart(df).encode(
y=alt.Y(f"{column}:N").axis(labels=False, ticks=False, grid=False, domainWidth=0).title(None),
x=alt.value(width),
text=alt.Text(f"{column}:N")
)
buttons = base.mark_bar(cornerRadius=5, size=70).encode(
color=alt.condition(click_condition, alt.value("darkgreen"), alt.value("#f4f4f4"))
)
button_labels = (
base.mark_text(size=13, align="right", dx=-10)
.encode(
color=alt.condition(click_condition, alt.value("white"), alt.value("darkgreen"))
)
)
return (
(buttons + button_labels)
.add_params(click_condition)
.properties(view=alt.ViewConfig(strokeWidth=0))
)
get_altair_button(penguins, column="species", width=100)
# Try wider width
species_menu = get_altair_button(penguins, column="species", width=150)
fig = alt.Chart(penguins).mark_circle(opacity=0.8).encode(
x="bill_length_mm:Q",
y="body_mass_g:Q",
color=alt.Color("species:N"),
opacity=alt.condition(click_condition, alt.value(0.8), alt.value(0.1))
).properties(width=250, height=250).add_params(click_condition)
Voila#
Click around!
(species_menu | fig).resolve_scale(color="independent")