Можете ли вы добавить метку для «отсутствующих данных» в легенду для диаграммы Альтаира? - PullRequest
2 голосов
/ 04 ноября 2019

У меня есть тепловая карта, построенная с использованием Altair, которая включает цветную полосу, но отсутствующие данные (пустые / белые) в тепловой карте не помечены на цветовой панели. Есть ли способ добавить отдельную метку в легенду (например, под цветовой шкалой), чтобы показать, как отсутствующие данные представлены на диаграмме?

Я придумала решение, которое включает слой «призрак»на вершине моей диаграммы - линейка с размером = 0 (так что линия невидима), которая окрашена столбцом, заполненным строковыми значениями «Нет данных» (см. код ниже). Это заставляет предмет легенды, но мне интересно, есть ли лучший способ. (См. Мой полный пример по ссылке здесь: график тепловых карт )

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

«Слой-призрак» добавляет пустой квадрат с надписью «Нет данных» в нижней части цветовой шкалы, но янадеюсь, есть лучший способ представить это!

1 Ответ

1 голос
/ 05 ноября 2019

К сожалению, я не знаю простого способа обработки нулей в количественном масштабе. Но вы можете обращаться с ними естественным образом в пределах номинальных масштабов;Я бы, вероятно, сгенерировал бы слой набора данных 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

enter image description here

...