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',
)