Как создать полоску, похожую на эту, используя vega-lite? - PullRequest
1 голос
/ 07 апреля 2020

Меня интересует возможность воссоздать этот многомерный полосовой график ниже, сгенерированный библиотекой Missing Numbers python, используя vega-lite, и я ищу несколько советов о том, как Я мог бы сделать это. Код для генерации изображения, приведенного ниже, выглядит примерно так:

>>> from quilt.data.ResidentMario import missingno_data
>>> collisions = missingno_data.nyc_collision_factors()
>>> collisions = collisions.replace("nan", np.nan)

>>> import missingno as msno
>>> %matplotlib inline
>>> msno.matrix(collisions.sample(250))


Missing Number multi dimensional strip plot

Для каждого столбца есть отметка для указанного c комбинация индекса и где данные являются нулевыми или не нулевыми.

Когда я просматриваю галерею диаграмм, созданных Altair, я вижу этот горизонтальный график, который, кажется, представляет подобного рода информация, но я не уверен, как express использовать ту же идею.

На приведенном ниже рисунке показана отметка, когда есть данные, которые соответствуют данной комбинации мощности лошадиных сил и размера цилиндра - мощность и цилиндр закодированы в каналах x и y.

Altair strip plot

Я не покажу, как бы я express тоже самое для крутого матрица нулей, и я думаю, что мне нужны некоторые указатели здесь.

Я понимаю, что могу сбросить и проиндексировать, чтобы получить индекс yy, но мне не ясно, как индекс выборки закодирован в Y канал, я не уверен, как бы я заполнил ось X с колонкой, перечисляющей нулевые / не нулевые результаты. Это то, что мне нужно сделать, прежде чем перейти к vega-lite, или же vega его поддерживает?

1 Ответ

2 голосов
/ 07 апреля 2020

Да, вы можете сделать это после изменения данных с помощью Fold Transform . С Альтаиром это выглядит примерно так:

import numpy as np
import quilt
quilt.install("ResidentMario/missingno_data")

from quilt.data.ResidentMario import missingno_data
collisions = missingno_data.nyc_collision_factors()
collisions = collisions.replace("nan", np.nan)
collisions = collisions.set_index("Unnamed: 0")
import altair as alt

alt.Chart(collisions.sample(250)).transform_window(
    index='row_number()'
).transform_fold(
    collisions.columns.to_list()
).transform_calculate(
    defined="isValid(datum.value)"
).mark_rect().encode(
    x=alt.X('key:N',
        title=None,
        sort=collisions.columns.to_list(),
        axis=alt.Axis(orient='top', labelAngle=-45)
    ),
    y=alt.Y('index:O', title=None),
    color=alt.Color('defined:N',
        legend=None,
        scale=alt.Scale(domain=["true", "false"], range=["black", "white"])
    )
).properties(
    width=800, height=400
)

enter image description here

...