Как заставить Альтаир отсортировать ось y по указанному полю? - PullRequest
0 голосов
/ 20 июня 2020

Может ли кто-нибудь помочь мне выяснить, как отсортировать ось Y по полю в моем наборе данных? См. Код ниже. Я хочу отсортировать ось y, которая является полем concat строк ADP (десятичное число) и именем игрока NFL. Я хочу отсортировать эту ось y с помощью ADP, который представляет собой поле под названием «OWNER Player ADP», которое я использую как плавающее, когда оно входит в фрейм данных pandas. (Я хотел, чтобы это было число с десятичной точкой). Я также создал поле под названием ADP, которое в значительной степени то же самое, но является varchar, когда оно входит в фрейм данных pandas. В любом случае я не могу получить график для сортировки оси y по любому из этих двух вариантов полей ... Я также прилагаю два скриншота текущего вывода, чтобы вы могли видеть вывод данных и вывод диаграммы . Вы можете видеть, что Аарон Роджерс находится в верхней части списка, однако у него 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 Ответ

2 голосов
/ 20 июня 2020

alt.EncodingSortField не требует кодов типов и не анализирует их на входе. Вместо

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

используйте

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