Altair:如何在条形图中为没有数据的值包含一个位置

Altair: how to include a place in a bar chart for a value that has no data

我的数据如下:

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 ) )

这会生成两个条形图,如下所示:

bar charts

请注意,ColA 的数据不包含 'e' 值,因此条形图不包含这些值的任何刻度线。对于 ColA 图表,我想要 'e' 的刻度线并且那里没有条形图,因此 ColA 和 ColB 图表看起来相同并且可以轻松比较。

我该怎么做?

您可以使用 chart.resolve_scale(x='shared') 来指定您希望图表之间共享 x 尺度。例如:

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'
)

请注意,我删除了您代码中的几行无关行,例如构建索引(Altair 从数据帧中删除索引)和将数据类型转换为类别(Altair 将类别数据类型转换回字符串)。