Как объединить две гистограммы в Altair с промежутком между сериями?

У меня есть следующий код для создания двух гистограмм. Первый - это центральный сценарий, который должен быть всегда виден. Второй представляет собой несколько сценариев стресса со значениями, зависящими от двух ползунков.

Моя проблема состоит в том, чтобы объединить две диаграммы, оставив пробелы между двумя сериями и сделав их видимыми в любых случаях (например, сгруппированная гистограмма).

Вот мой код:

import altair as alt
from vega_datasets import data

pvfp=Res.loc[(Res.Item=="PVFP")&(Res.annee>0)]


base = alt.Chart(pvfp, width=500, height=300).mark_bar(color="Green").encode(
    x=alt.X('annee:Q'),
    y='valeur:Q',
    tooltip="valeur:Q"
)
central = alt.Chart(pvfp.loc[(Res.TS=='Central')&(Res.TRA=='Central')], width=500, height=300).mark_bar().encode(
    x=alt.X('annee:Q'),
    y='valeur:Q',
    tooltip="valeur:Q"
)


# A slider filter
TRA_slider = alt.binding_range(min=-40, max=20, step=10,name="Sensi TRA :")
TS_slider = alt.binding_range(min=-20, max=20, step=5,name="Sensi TS : ")

slider1 = alt.selection_single(bind=TRA_slider, fields=['TRA2'],init={'TRA2': 0})
slider2 = alt.selection_single(bind=TS_slider, fields=['TS2'],init={'TS2': 0})

filter_TRA = base.add_selection(
    slider1,slider2
).transform_filter(
    slider1&slider2
).properties(title="Sensi_TRA")

central + filter_TRA

И вид диаграммы, которую я получил на данный момент:

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

Если у вас есть идеи, как это сделать, я был бы очень благодарен.

ОБНОВЛЕНИЕ. Вот воспроизводимый пример той же проблемы.

import altair as alt
import pandas as pd
from vega_datasets import data

dataset = data.population.url
source=pd.read_json(dataset)
source2=df.loc[df.year==1900]


pink_blue = alt.Scale(domain=('Male', 'Female'),
                      range=["steelblue", "salmon"])

slider = alt.binding_range(min=1900, max=2000, step=10)
select_year = alt.selection_single(name="year", fields=['year'],
                                   bind=slider, init={'year': 2000})

chart1 = alt.Chart(source).mark_bar().encode(
    x=alt.X('age:O', title=None),
    y=alt.Y('people:Q', scale=alt.Scale(domain=(0, 12000000))),
).properties(
    width=300
).add_selection(
    select_year
).transform_filter(
    select_year
)
chart2 = alt.Chart(source2).mark_bar(color="green").encode(
    x=alt.X('age:O', title=None),
    y=alt.Y('people:Q', scale=alt.Scale(domain=(0, 12000000))),
)
chart1+chart2

Как описано, я бы хотел найти способ разделить две серии и получить результат, как в примере, упомянутом @joelostblom

Надеюсь, это более ясно


person Bebio    schedule 26.02.2021    source источник
comment
Вы имеете в виду, что хотите, чтобы полосы располагались рядом друг с другом, а не располагались сверху? Если это так, вы можете следовать этому примеру altair-viz.github.io/gallery/grouped_bar_chart. html. Если нет, поясните свой вопрос и добавьте воспроизводимый пример (я не могу запустить ваш код, потому что Res не определен)   -  person joelostblom    schedule 26.02.2021
comment
Пример, который вы упомянули, - это именно то, что я хочу, но в моем случае у меня есть две разные диаграммы (одна с ползунками, другая без), а не только одна. Поэтому я не могу справиться с этим с помощью аргумента столбца, как описано в примере. Я постараюсь добавить воспроизводимый пример, если это может помочь.   -  person Bebio    schedule 26.02.2021


Ответы (1)


Вы можете сделать это с помощью комбинации bandPaddingInner и xOffset. Например:

import altair as alt
import pandas as pd
from vega_datasets import data

dataset = data.population.url
source=pd.read_json(dataset)
source2=source.loc[source.year==1900]


pink_blue = alt.Scale(domain=('Male', 'Female'),
                      range=["steelblue", "salmon"])

slider = alt.binding_range(min=1900, max=2000, step=10)
select_year = alt.selection_single(name="year", fields=['year'],
                                   bind=slider, init={'year': 2000})

chart1 = alt.Chart(source).mark_bar(
    xOffset=-3
).encode(
    x=alt.X('age:O', title=None),
    y=alt.Y('people:Q', scale=alt.Scale(domain=(0, 12000000))),
).properties(
    width=300
).add_selection(
    select_year
).transform_filter(
    select_year
)
chart2 = alt.Chart(source2).mark_bar(
    xOffset=5,
    color="green",
).encode(
    x=alt.X('age:O', title=None),
    y=alt.Y('people:Q', scale=alt.Scale(domain=(0, 12000000))),
)
(chart1+chart2).configure_scale(bandPaddingInner=0.6)

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

person jakevdp    schedule 26.02.2021