Python 3.x 是否可以根据其中一个类别的值对Altair分组条形图的列进行排序?

Python 3.x 是否可以根据其中一个类别的值对Altair分组条形图的列进行排序?,python-3.x,plot,data-visualization,altair,Python 3.x,Plot,Data Visualization,Altair,我有以下图表- 我希望能够根据我选择的任何类别(a、b或c)的值对列进行排序(而不是单个组的单个条形图-我已经知道如何进行排序),也就是说,如果愿意,可以对3个子图进行排序 我尝试使用alt.SortField和alt.EncodeSortField,它们在图表中移动了一点,但如果您更改类别以查看它们是否真正起作用,它们实际上就不起作用了 代码- 将altair导入为alt 作为pd进口熊猫 dummy=pd.数据帧({'place':['Asia'、'Nancartia'、'Africa'、

我有以下图表-

我希望能够根据我选择的任何类别(
a
b
c
)的值对列进行排序(而不是单个组的单个条形图-我已经知道如何进行排序),也就是说,如果愿意,可以对3个子图进行排序

我尝试使用
alt.SortField
alt.EncodeSortField
,它们在图表中移动了一点,但如果您更改类别以查看它们是否真正起作用,它们实际上就不起作用了

代码-

将altair导入为alt
作为pd进口熊猫
dummy=pd.数据帧({'place':['Asia'、'Nancartia'、'Africa'、'Nancartia'、'Africa'、'Nancartia'、'Asia'、'category':['a'、'a'、'b'、'c'、'c']、'value':[5,2,3,4,3,5,6,9,5])
alt.Chart(虚拟)。标记条()。编码(
x=alt.x(“类别”),
y='value',
column=alt.column('place:N',sort=alt.SortField(field='value',order='descending')),
颜色class='category',
)
我知道
alt.Column('place:N',sort=alt.SortField(field='value',order='descending')),
似乎不正确,因为我没有针对任何类别,所以我也尝试了
x=alt.x('category',sort=alt.SortField(field='c',order='descending'),
,但它也不起作用

预期输出(假设降序)——

  • 若我想按“c”排序,那个么中间的列应该是第一列,然后是左列,最后是右列
  • 它似乎已经被“b”订购了
  • 若我想按“a”排序,那个么右列应该是第一列,然后是左列,最后是中间列

这有点复杂,但您可以通过一系列转换来实现:

  • a选择要排序的值
  • a使用
    argmax
    将所需值加入每个组
  • 另一个calculate transform可拉出此结果中要排序的特定字段
它看起来是这样的,首先按
“c”
排序:

然后按
“a”
排序:


这有点复杂,但您可以通过一系列转换来实现:

  • a选择要排序的值
  • a使用
    argmax
    将所需值加入每个组
  • 另一个calculate transform可拉出此结果中要排序的特定字段
它看起来是这样的,首先按
“c”
排序:

然后按
“a”
排序:


哇……非常感谢,杰克。但我必须问,你认为我应该读些什么才能自己想出这些解决方案和想法?事实证明,此解决方案适用于此虚拟数据,但在我的实际数据集中,它失败了,因为除了
place
category
,数据稍微涉及更多,有一个时间列-
day
,每个
place
category
都会多次出现,我需要从
day
中提取每个类别的最大值,然后执行上述操作。如果将
alt.SortField(“sort\u val”)
更改为
alt.EncodingSortField(“sort\val”,op=“max”)
,这将按匹配值的最大值排序。第一次尝试时,它不起作用,所以我玩了一下……除了你建议使用
alt.EncodingSortField(“sort\u val”,op=“max”)
,我还必须同时使用
place
day
进行分组,即
sort\u key=“argmax(key)”,groupby=['place',day']
瞧,它成功了。谢谢你帮了我大忙!!哇……非常感谢,杰克。但我必须问,你认为我应该读些什么才能自己想出这些解决方案和想法?事实证明,此解决方案适用于此虚拟数据,但在我的实际数据集中,它失败了,因为除了
place
category
,数据稍微涉及更多,有一个时间列-
day
,每个
place
category
都会多次出现,我需要从
day
中提取每个类别的最大值,然后执行上述操作。如果将
alt.SortField(“sort\u val”)
更改为
alt.EncodingSortField(“sort\val”,op=“max”)
,这将按匹配值的最大值排序。第一次尝试时,它不起作用,所以我玩了一下……除了你建议使用
alt.EncodingSortField(“sort\u val”,op=“max”)
,我还必须同时使用
place
day
进行分组,即
sort\u key=“argmax(key)”,groupby=['place',day']
瞧,它成功了。谢谢你帮了我大忙!!
import altair as alt
import pandas as pd

dummy = pd.DataFrame({'place':['Asia', 'Antarctica','Africa', 'Antarctica', 'Asia', 'Africa', 'Africa','Antarctica', 'Asia'],'category':['a','a','a','b','b','b','c','c','c'],'value':[5,2,3,4,3,5,6,9,5]})
alt.Chart(dummy).transform_calculate(
    key="datum.category == 'c'"
).transform_joinaggregate(
    sort_key="argmax(key)", groupby=['place']
).transform_calculate(
    sort_val='datum.sort_key.value'  
).mark_bar().encode(
    x=alt.X('category'),
    y='value',
    column=alt.Column('place:N', sort=alt.SortField("sort_val", order="descending")),
    color='category',
)
alt.Chart(dummy).transform_calculate(
    key="datum.category == 'a'"
).transform_joinaggregate(
    sort_key="argmax(key)", groupby=['place']
).transform_calculate(
    sort_val='datum.sort_key.value'  
).mark_bar().encode(
    x=alt.X('category'),
    y='value',
    column=alt.Column('place:N', sort=alt.SortField("sort_val", order="descending")),
    color='category',
)