Altair:设置原始颜色值会弄乱 SortField

Altair: Setting Raw Color Values Messes Up SortField

我正在尝试创建一个 Altair 条形图,其中条形图按 'count' 排序,然后将 raw color values 应用于条形图。

import pandas as pd
import altair as alt

# Dummy data
df = pd.DataFrame({'fruit': ['apple', 'orange', 'blueberry', 'pear', 'grape', 'kiwi', 'strawberry', 'lychee'],
                  'count': [2, 4, 1, 7, 9, 12, 16, 35], 
                  'label': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'],
                  'colors': ['#4c78a8', '#f58518', '#e45756', '#72b7b2', '#54a24b', '#eeca3b', '#b279a2', 
                             '#9d755d']})

def make_alt_chart(df):
    g = alt.Chart(df).encode(
        x=alt.X('count'), 
        y=alt.Y('fruit', sort=alt.SortField(field='count', order='descending'))
    ).properties(
        width=700,
        height=650,
    )
    
    bars = g.mark_bar(
        size=60,
    ).encode(
        color=alt.Color('colors', sort=alt.SortField('count', order='descending'),
                        scale=None, legend=None)
    ).properties(height=alt.Step(75))

    text = g.mark_text(
        align='center',
        baseline='middle',
        dx=28
    ).encode(
        text='label'
    ).interactive()
    
    return (bars + text)

fruits = make_alt_chart(df)

fruits

sort=alt.SortField(field='count', order='descending') 添加到 y= 可以按照我想要的方式对图表进行排序,但是当我将 color=alt.Color('colors', sort=alt.SortField('count', order='descending'), scale=None, legend=None) 添加到条形图时,y 轴上的顺序不再按 'count' 排序.

这是 运行 上述代码后水果图表的样子:

这是我想要的输出结果,但应用了自定义颜色:

如果有更简单的方法可以在 Altair 中设置自定义颜色,请告诉我。

注意:十六进制颜色值是 tableau10 方案,但去掉了粉色阴影。

我查看了这些资源,但没弄明白:

如果您查看 Javascript 控制台,您会看到渲染器正在输出此警告:

WARN Domains that should be unioned has conflicting sort properties. Sort will be set to true.

相关的 Vega-Lite issue 提出了解决方法;替换

y=alt.Y('fruit', sort=alt.SortField(field='count', order='descending'))

y=alt.Y('fruit', sort=alt.EncodingSortField(field='count', order='descending', op='sum'))

这是结果: