在 altair 中将比例底部颜色固定为 0

Fix scale botttom colour on 0 in altair

我正在通过以下方式生成华夫饼图(github-like activity 热图):

import altair as alt
import pandas as pd

# Import data
df = pd.read_csv("https://pastebin.com/raw/AzwJ0va4")

# Year interactive dropdown
years = list(df["year"].unique())
year_dropdown = alt.binding_select(options=years)
selection = alt.selection_single(
    fields=["year"], bind=year_dropdown, name="Year", init={"year": 2020}
)

# Plot
(
    alt.Chart(df)
    .mark_rect()
    .encode(
        x=alt.X("week:O", title="Week"),
        y=alt.Y("day(committed_on):O", title=""),
        color=alt.Color(
            "hash:Q", scale=alt.Scale(range=["transparent", "green"]), title="Commits"
        ),
        tooltip=[
            alt.Tooltip("committed_on", title="Date"),
            alt.Tooltip("day(committed_on)", title="Day"),
            alt.Tooltip("hash", title="Commits"),
        ],
    )
    .add_selection(selection)
    .transform_filter(selection)
    .properties(width=1000, height=200)
)

结果图的表现与我预期的一样,达到了 99%,但是当我 select 一年没有 activity(hash 列填充为 0)时,因为 2017,该图将用绿色方块填充,因为 0 正好锚定在刻度的中间。

如何确保 0 始终位于刻度的底部? (透明色)

您可以像设置坐标轴一样设置色标 domainscale=alt.Scale(range=["transparent", "green"], domain=[0, 16])。可以在较新版本的 VegaLite 中仅设置 domainMin,但在 Altair 中还不能。在你的情况下,无论如何设置最小值和最大值可能是一个好主意,这样所有年份的颜色解释都是一样的。