Неуклюже строить два набора сезонных данных на одном графике

У меня есть серия ежемесячных данных инвентаризации с 2017 года. У меня есть серия inventory_forecasts с декабря 2018 года.

Я пытаюсь построить данные инвентаризации на ежемесячно-сезонной основе, а затем наложить inventory_forecasts с января по декабрь 2019 года.

Фрейм данных выглядит так:

введите здесь описание изображения

Первый способ, которым я пытался сделать диаграмму, показывает все данные, которые мне нужны, но я не могу контролировать цвет линии inventory_zj. Похоже, что в его цвете преобладает color=year(date):N из alt.Chart, который я настроил. Он игнорирует color='green', который я передаю mark_line()

base = alt.Chart(inv.loc['2000':].reset_index(), title=f"usa total inventory").mark_line().encode(
    x='month',
    y="inventory",
    color="year(date):N"
)

#this ignores my 'green' color instruction, and marks it the same light blue 2019 color
joe = base.mark_line(color='green').encode(
    alt.Y('inventory_zj', scale=alt.Scale(zero=False), )
)

base+joe

введите здесь описание изображения

Я пробовал использовать систему слоев, но она вообще не работает - я не могу заставить ее отображать слой "Джо"

base = alt.Chart(inv.loc['2000':].reset_index(), title=f"usa total inventory").encode(
    x='month(date)'
)

doe = base.mark_line().encode(
    alt.Y('inventory', scale=alt.Scale(zero=False), ),
    color="year(date):N"
)


joe = base.mark_line(color="green").encode(
    alt.Y('inventory_zj', scale=alt.Scale(zero=False), ),
)



#looks identical to the first example
alt.layer(
    doe, joe
).resolve_scale(
    y='shared'
).configure_axisLeft(labelColor='black').configure_axisRight(labelColor='green',titleColor='green')

#independent shows a second y-axis (which is different from the left y-axis) but no line
alt.layer(
    doe, joe
).resolve_scale(
    y='independent'
).configure_axisLeft(labelColor='black').configure_axisRight(labelColor='green',titleColor='green')

введите здесь описание изображения

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


person user3556757    schedule 19.06.2019    source источник


Ответы (1)


Как упоминалось в Настройка визуализаций docs, есть несколько способов указать такие вещи, как цвет линии, с четко определенной иерархией: кодировки переопределяют свойства меток, которые переопределяют конфигурации верхнего уровня.

На диаграмме вы пишете base.mark_point(color='green'), где base содержит кодировку цвета, которая переопределяет свойство метки. Если вы не заимствуете слой из базы (чтобы у него не было цветовой кодировки), то линия будет зеленой, как вы и надеялись. Что-то вроде этого:

base = alt.Chart(inv.loc['2000':].reset_index(), title=f"usa total inventory")

inventory = base.mark_line().encode(
    x='month',
    y="inventory",
    color="year(date):N"
)

joe = base.mark_line(color='green').encode(
    x='month',
    y=alt.Y('inventory_zj', scale=alt.Scale(zero=False))
)

inventory + joe
person jakevdp    schedule 19.06.2019