可以在 Altair 上从总和 X 的降序过滤和绘制它吗?

It is possible to filter and plot it in a descending from sum X on Altair?

我尝试改编一个 的脚本来过滤前十名供应商 (proveedor_nombre),这意味着,按降序获得更多钱的供应商,但从来没有开始工作。

因为我什至不确定我做错了什么,你们有什么办法知道我可以获得想要的结果

原始代码如下:

# Monto total asignado por proveedor

proveedores_dinero = alt.Chart(df).mark_circle().encode(
    x = alt.X('proveedor_nombre:N'),
    y = alt.Y('sum(monto_contrato_minimo):Q'),
)

proveedores_dinero

这里输出:

可以在 transform_window 上应用 rank 来过滤前 n 个结果。但是,缺少的验证者的圆圈将绘制在轴 x=0 上,在这种情况下,它可以通过顶部 n+1 值过滤 y 值。在下面的示例中,我绘制了 6 个可能的前 3 个证明者。

# Generate raw data
data = {
    'proveedor_nombre': ['proveedor_1', 'proveedor_2', 'proveedor_4', 'proveedor_1', 'proveedor_2', 'proveedor_3',
                         'proveedor_4', 'proveedor_1', 'proveedor_5', 'proveedor_6', 'proveedor_4', 'proveedor_5'
                        ],
    'monto_contrato_minimo': [389, 24, 80, 253, 111, 54, 345, 117, 9, 546, 678, 99]
}
df = pd.DataFrame.from_dict(data)

# Store value of top n proveedores
data_sum = df.groupby('proveedor_nombre').agg({'monto_contrato_minimo':'sum'}).sort_values(by='monto_contrato_minimo', ascending=False)

# Plot top 3 proveedor_nombre
alt.Chart(df).mark_circle().encode(
    x = alt.X('proveedor_nombre:N', sort='-y', scale=alt.Scale(domain=list(data_sum.index[:3]))),
    y = alt.Y('sum(monto_contrato_minimo):Q'),
).transform_window(
    rank='rank(monto_contrato_minimo)',
    sort=[alt.SortField('sum(monto_contrato_minimo)', order='descending')]
).transform_filter(
    (alt.datum.rank < 4)  
).transform_filter(
    (alt.datum.monto_contrato_minimo > data_sum.iloc[3][0]) 
).properties(
    width=500, height=300
)

将导致