Альтаир: как включить место в гистограмму для значения, которое не имеет данных - PullRequest
2 голосов
/ 03 октября 2019

У меня есть данные, которые выглядят так:

data = {'ColA': {('A', 'A-1'): 'w',
                 ('A', 'A-2'): 'w',
                 ('A', 'A-3'): 'w',
                 ('B', 'B-1'): 'q',
                 ('B', 'B-2'): 'q',
                 ('B', 'B-3'): 'r',
                 ('C', 'C-1'): 'w',
                 ('C', 'C-2'): 'q',
                 ('C', 'C-3'): 'q',
                 ('C', 'C-4'): 'r'},
        'ColB': {('A', 'A-1'): 'r',
                 ('A', 'A-2'): 'w',
                 ('A', 'A-3'): 'w',
                 ('B', 'B-1'): 'q',
                 ('B', 'B-2'): 'q',
                 ('B', 'B-3'): 'e',
                 ('C', 'C-1'): 'e',
                 ('C', 'C-2'): 'q',
                 ('C', 'C-3'): 'r',
                 ('C', 'C-4'): 'w'}}

Затем я создаю две гистограммы:

df               = pd.DataFrame(data)
df[ df.columns ] = df[ df.columns ].astype('category')
df.index         = pd.Index( [ ': '.join( x ) for x in list( df.index.to_flat_index() ) ] )

X = alt.X( alt.repeat(), type = 'nominal' )

Y_scale = alt.Scale( domain = [0, len( df.index ) ] )
Y       = alt.Y( aggregate = 'count', type = 'quantitative', scale = Y_scale )

alt.Chart( df ).mark_bar().encode( X, Y ).repeat( list( df.columns ) )

, что приводит к двум гистограммам, которые выглядят следующим образом:

гистограммы

Обратите внимание, что данные для ColA не содержат значений 'e', ​​поэтому гистограмма не содержит отметок для этих значений. Для диаграммы ColA я бы хотел поставить галочку для 'e', ​​чтобы там не было столбца, поэтому диаграммы ColA и ColB выглядят одинаково и их легко сравнить.

Как я могу это сделать

1 Ответ

2 голосов
/ 04 октября 2019

Вы можете использовать chart.resolve_scale(x='shared'), чтобы указать, что вы хотите, чтобы шкалы х были разделены между диаграммами. Например:

df = pd.DataFrame(data).reset_index(drop=True)

alt.Chart(df).mark_bar().encode(
    x=alt.X(alt.repeat(), type='nominal'),
    y=alt.Y('count():Q', scale=alt.Scale(domain=[0, len(df.index)]))
).repeat(
    list(df.columns)
).resolve_scale(
    x='shared'
)

enter image description here

Обратите внимание, что я удалил несколько посторонних строк вашего кода, таких как построение индекса (Altair удаляет индексы из фреймов данных)и преобразование dtypes в категорию (Altair преобразует dtypes категории обратно в строки).

...