mark_line в altair / vega-lite переупорядочивает данные, когда ось x содержит дубликаты - PullRequest
0 голосов
/ 15 ноября 2018

Я заметил, что при наличии дубликата на оси x с различными значениями на оси y порядок, в котором предоставляются данные, не учитывается. Максимальное значение связано с предыдущей точкой, а минимальное - с следующей. Это не то, что я ожидаю, например, при создании CDF (накопительной функции распределения).

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

Это задумано? Или я что-то упустил?

Ниже приведен воспроизводимый пример.

import pandas as pd
import altair as alt

df = pd.DataFrame({'x':[-1, 0, 0, 1, 2],
                   'y':[-1, 0, 1, 2, 3],
                   'index':[0, 1, 2, 3, 4]})

step = alt.Chart(df).mark_line(interpolate="step", point=True).encode(
    x='x:Q', 
    y='y:Q',
).properties(width=150, 
             height=150, 
             title="interpolate='step'")

step_after = step.mark_line(
    interpolate='step-after', 
    point=True
).properties(title="interpolate=step-after")

step_before = step.mark_line(
    interpolate='step-before', 
    point=True
).properties(title="interpolate=step-before")

sort = step.encode(
    y=alt.Y('y:Q', 
            sort=alt.EncodingSortField(field='index', 
                                       op='sum'))
).properties(title='sort by index')

expected = (step_before.properties(data=df[df.index != 1], 
                                   title='expected') + 
            alt.Chart(pd.DataFrame([{'x':0, 
                                     'y':0}])
                     ).mark_circle().encode(
                x='x:Q', y='y:Q')
           )

(step | step_before | step_after) & (sort | expected)

altair-charts Создано в 2018-11-15 пакетом prexpy

import reprexpy
print(reprexpy.SessionInfo())
#> Session info --------------------------------------------------------------------
#> Platform: Darwin-18.2.0-x86_64-i386-64bit (64-bit)
#> Python: 3.6
#> Date: 2018-11-15
#> Packages ------------------------------------------------------------------------
#> altair==2.2.2
#> pandas==0.23.4
#> reprexpy==0.2.1

Спасибо.

1 Ответ

0 голосов
/ 16 ноября 2018

Порядок строк данных, передаваемых в Altair, не сохраняется в выходных данных диаграммы, и это специально.

Если вы хотите, чтобы ваши записи данных отображались в определенном порядке, вы можете использоватьorder кодировка, чтобы явно указать это;пример из документации здесь: https://altair -viz.github.io / gallery / connected_scatterplot.html

В вашем случае, если вы передадите order="index:Q" в свой список кодировокЯ полагаю, что результат будет таким, как вы ожидали.

...