Цветная гистограмма Альтаира по значению не представлена - PullRequest
2 голосов
/ 03 мая 2020

Попытка раскрасить гистограмму, используя условие, основанное на значении, которое не представлено на диаграмме.

Я получил этот фрейм данных:

enter image description here

Я хотел бы закрасить полосу зеленым, если row.presented_value > row.coloring_value, иначе - красным.

Я видел примеры условий по постоянным значениям и по отображаемым значениям , но не смог заставить его работать для меня.

В коде нижеприведенный пример Я хотел бы, чтобы и foo, и bar были красного цвета.

import pandas as pd

df = pd.DataFrame({'name':['bar','foo'],
                  'presented_value':[10,20],
                  'coloring_value':[15,25]})

(alt.Chart(df, height=250, width=375).mark_bar()
 .encode(x='name', y=alt.Y('presented_value', axis=alt.Axis(orient='right')),
         color=alt.condition(alt.datum['presented_value'] > df.loc[df.name==alt.datum.x,
                                                        'coloring_value'].values[0],
        alt.value('lightgreen'),alt.value('darkred'))
        )
)

Variation 1

Изменение первого значения coloring_value на <10 оба бара будут зелеными, хотя я ожидаю, что только bar будет зеленым.

df = pd.DataFrame({'name':['bar','foo'],
                  'presented_value':[10,20],
                  'coloring_value':[5,25]})

(alt.Chart(df, height=250, width=375).mark_bar()
 .encode(x='name', y=alt.Y('presented_value', axis=alt.Axis(orient='right')),
         color=alt.condition(alt.datum['presented_value'] > df.loc[df.name==alt.datum.x,
                                                        'coloring_value'].values[0],
        alt.value('lightgreen'),alt.value('darkred'))))

Variation 2

Все еще не окрашивается правильные значения. Есть идеи, как это сделать? Заранее спасибо!

1 Ответ

2 голосов
/ 04 мая 2020

Выражения условий не могут использовать конструкции pandas; они должны соответствовать выражениям vega . Altair предоставляет для этого удобные оболочки alt.datum и alt.expr.

В вашем случае, когда вы хотите сравнить два значения в строке, лучший способ сделать это - сравнить их напрямую:

(alt.Chart(df, height=250, width=375).mark_bar()
 .encode(
    x='name',
    y=alt.Y('presented_value', axis=alt.Axis(orient='right')),
    color=alt.condition(
      alt.datum.presented_value > alt.datum.coloring_value,
      alt.value('lightgreen'),
      alt.value('darkred')
    )
  )
)

enter image description here

...