如何让Altair根据指定字段对y轴进行排序?

时间:2020-06-19 21:19:20

标签: python pandas sorting graph altair

有人可以帮助我弄清楚如何通过数据集中的字段对y轴进行排序吗? 请参见下面的代码。我想对y轴进行排序,这是ADP的字符串连接字段(十进制数字)和NFL播放器名称。我想通过ADP对y轴进行排序,这是一个称为“ OWNER Player ADP”的字段,一旦它进入熊猫数据帧,我就将其转换为浮点数。 (我希望它是一个带小数点的数字) 我还创建了一个称为ADP的字段,该字段几乎是相同的,但是当它进入pandas数据帧时它是一个varchar。在任何一种情况下,我似乎都无法使图形在这两个字段的任何一个上对y轴进行排序...我还要附加当前输出的两个屏幕截图,以便可以看到数据输出和图表输出。您可以看到Aaron Rodgers在列表的顶部,但是他的ADP为48.3。我希望编号ADP最少的播放器在列表顶部...

import altair as alt
import pandas as pd
from main.views import sql_to_dataframe
#--get draft history for a specifc owner, league, and draft type
query ="""
SELECT draft_type,season,"Player Name","Player Team"
,count(*) "Times Drafted"
,cast(round(cast(SUM(pick_no) AS DECIMAL)/cast(COUNT(DISTINCT draft_id) AS DECIMAL),1) as varchar) "OWNER Player ADP"
,cast(round(cast(SUM(pick_no) AS DECIMAL)/cast(COUNT(DISTINCT draft_id) AS DECIMAL),1) as varchar) "ADP"
,concat(cast(round(cast(SUM(pick_no) AS DECIMAL)/cast(COUNT(DISTINCT draft_id) AS DECIMAL),1) as varchar),' ',"Player Team") "Player ADP"
,1 "x_axis"
FROM
mytable
GROUP BY draft_type,season,draft_type,"Player Name","Player Team"
"""
source = sql_to_dataframe(query)
source['OWNER Player ADP'] = source['OWNER Player ADP'].astype(float)
print(source.head())
base=alt.Chart(
    source,
    title="Player Average Draft Position"
).encode(
    x=alt.X('x_axis:O')
    ,y=alt.Y('Player ADP:O',sort=alt.EncodingSortField(field="OWNER Player ADP:O",order ='descending', op='min'))
    #,tooltip=['Player Team','OWNER Player ADP:O']
)
bar=base.mark_square(size=300).encode(
    color=alt.Color('Times Drafted:Q', scale=alt.Scale(scheme="darkred"))#,domain=[5,0])
    ,tooltip=['Player Team','OWNER Player ADP:O','Times Drafted:N']
)

# Configure text
text = base.mark_text(baseline='middle',color='white').encode(

    text='Times Drafted:O'
    ,tooltip=['Player Team','OWNER Player ADP:O','Times Drafted:N']
)

(bar+text).properties(width=50)#.interactive()


DataFrame and output1

Output2

1 个答案:

答案 0 :(得分:2)

alt.EncodingSortField不需要类型代码,也不会从输入中解析它们。代替

alt.EncodingSortField(field="OWNER Player ADP:O", ...)

使用

alt.EncodingSortField(field="OWNER Player ADP", ...)