根据群组统计信息对Altair绘图的各个方面进行排序

时间:2019-06-19 19:02:07

标签: python sorting facet altair

我想基于一些组统计信息(例如均值,西格玛等)来更改Altair图表的构面顺序。

在某些情况下,排序函数可能会更复杂,例如两个移动平均值之间的差异,EWMA的斜率等,因此,我也希望能够按顺序“通过”。 / p>

这是可测试的案例代码:

import pandas as pd
import numpy as np
import altair as alt

alt.renderers.enable('notebook')

# make some data to test
N = 500
df = pd.DataFrame({
    'Date Time': pd.date_range('2019-06-19', periods=N, freq='H'),
    'A':  np.random.normal(6, 1, N),
    'B': np.random.normal(5, 1, N),
    'C': np.random.normal(7, 1, N),
    'D': np.random.normal(8, 1, N)
}).melt('Date Time')

# render the chart using facets
p = alt.Chart(df).mark_point().encode(
    facet='variable',
    y='value',
    x='Date Time',
    color='variable',
)

# set some aditional properties
p.properties(width=230, height=150, columns=3).resolve_scale()

以下哪个图表会按字母顺序对构面进行排序:

enter image description here

我希望排序顺序为最大均值到最小均值:

var_order = df.groupby('variable').mean().sort_values('variable', ascending=False).index.values
var_order

产生:

array(['D', 'C', 'B', 'A'], dtype=object)

我阅读了一些文章,指出可以对x和y进行排序,但是在这种情况下,我想对面孔进行排序。

1 个答案:

答案 0 :(得分:2)

您可以在EncodingSortField编码上使用facet;例如

p = alt.Chart(df).mark_point().encode(
    y='value',
    x='Date Time',
    color='variable',
    facet=alt.Facet('variable',
        sort=alt.EncodingSortField('value', op='mean', order='descending')
    )
)

# set some aditional properties
p.properties(width=230, height=150, columns=3).resolve_scale()

chart output

对于更复杂的计算,您可以使用计算转换和/或聚合转换来计算新字段,并以此排序。