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 将类别数据类型转换回字符串)。
我的数据如下:
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 将类别数据类型转换回字符串)。