您可以将 "missing data" 的标签添加到 Altair 图表的图例中吗?

Can you add a label for "missing data" to a legend for an Altair chart?

我有一个使用 Altair 绘制的热图,其中包含一个颜色条,但热图中缺失的数据 (blank/white) 未标记在颜色条上。有没有办法在图例中添加单独的标签(例如在颜色条下方)以显示缺失数据在图表中的表示方式?

我想出了一个解决方案,在我的图表顶部包含一个 "ghost" 层 -- 一个大小为 0 的标尺图表(这样线条是不可见的),由一列着色填充 "No Data" 的字符串值(见下面的代码)。这会强制使用传奇物品,但我想知道是否有更好的方法。 (在 link 此处查看我的完整示例:heatmap plot)

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

# Example heatmap data
heatmap_df = pd.DataFrame([["NY",1999,1],["NY",2000,np.nan], ["MA",1999,np.nan], ["MA",2000,4]], columns = ["state","year","rate"])

# Example Legend dataframe
legend_no_data = pd.DataFrame([[1999, "No Data"]], columns = ["year", "text"])


# Example chart with "No Data" label
heatmap = alt.Chart(heatmap_df).mark_rect().encode(alt.X("year:O"), alt.Y("state:N"), alt.Color("rate:Q"))

# Chart for "No Data" legend item
vacc_legend_no_data = alt.Chart(legend_no_data).mark_line(
    size=0
).encode(
    x='year:O',
    color = alt.Color("text:N", legend = alt.Legend(title = "", symbolType = "square")))

heatmap + vacc_legend_no_data

"ghost layer" 在颜色栏底部添加了标记为 "No Data" 的空方块,但我希望有更好的方式来表示它!

不幸的是,我不知道在定量范围内处理空值的简单方法。但是您可以在标称范围内自然地处理它们;我可能会使用计算转换在图表规范中生成 Null 数据集层,以避免必须构建第二个数据框。它可能看起来像这样:

heatmap = alt.Chart(heatmap_df).mark_rect().encode(
  alt.X("year:O"),
  alt.Y("state:N"),
  alt.Color("rate:Q")
)

nulls = heatmap.transform_filter(
  "!isValid(datum.rate)"
).mark_rect(opacity=0.5).encode(
  alt.Color('rate:N', scale=alt.Scale(scheme='greys'))
)

heatmap + nulls