Построение мультииндексного фрейма данных с помощью Altair - PullRequest
1 голос
/ 03 октября 2019

У меня есть фрейм данных, который выглядит следующим образом:

data = {'ColA': {('A', 'A-1'): 0,
                 ('A', 'A-2'): 1,
                 ('A', 'A-3'): 1,
                 ('B', 'B-1'): 2,
                 ('B', 'B-2'): 2,
                 ('B', 'B-3'): 0,
                 ('C', 'C-1'): 1,
                 ('C', 'C-2'): 2,
                 ('C', 'C-3'): 2,
                 ('C', 'C-4'): 3},
        'ColB': {('A', 'A-1'): 3,
                 ('A', 'A-2'): 1,
                 ('A', 'A-3'): 1,
                 ('B', 'B-1'): 0,
                 ('B', 'B-2'): 2,
                 ('B', 'B-3'): 2,
                 ('C', 'C-1'): 2,
                 ('C', 'C-2'): 0,
                 ('C', 'C-3'): 3,
                 ('C', 'C-4'): 1}}

df = pd.DataFrame( data )

Значения для каждого столбца: 0, 1, 2 или 3. Эти значения также могут быть просто «U», «Q». , 'R' или 'Z' ... т.е. в них нет ничего числового.

Я хотел бы использовать Альтаир

** Первый наборГрафики

Я хотел бы получить одну столбчатую диаграмму на столбец.

Метки для оси X должны основываться на уникальных значениях в столбцах. По оси Y должно быть количество уникальных значений в столбце.

** Второй набор графиков

Как и в первом наборе, я хотел бы получить одну гистограмму на строку.

Метки для оси X должны основываться на уникальных значениях в строке. По оси Y должно быть количество уникальных значений в строке.

Это должно быть легко, но я не уверен, как это сделать.

1 Ответ

0 голосов
/ 03 октября 2019

Все API-интерфейсы Altair основаны на столбцах и игнорируют индексы, если вы не включили их явно (см. Включение данных индекса в документации Altair).

Для первого набора диаграмм (одингистограмма на столбец) вы можете сделать это:

alt.Chart(df.reset_index()).mark_bar().encode(
    alt.X(alt.repeat(), type='nominal'),
    y='count()'
).repeat(['ColA', 'ColB'])

enter image description here

Для второго набора диаграмм (одна гистограмма на строку) вы можете сделатьчто-то вроде этого:

df_transposed = df.reset_index(0, drop=True).T
alt.Chart(df_transposed).mark_bar().encode(
    alt.X(alt.repeat(), type='nominal'),
    y='count()'
).repeat(list(df_transposed.columns), columns=5)

enter image description here

Хотя это немного странная визуализация, поэтому я подозреваю, что неправильно понимаю, что вы ищете... ваши данные имеют десять строк, поэтому одна диаграмма на строку - это десять диаграмм.

...