我的数据如下:
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 图表看起来相同并且可以轻松比较。
我怎样才能做到这一点?
最佳答案
您可以使用 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 将类别数据类型转换回字符串)。
关于python - Altair:如何在条形图中包含没有数据的值的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58225652/