Альтаир: сделать график линии выбора интервала с двойной осью и осью даты и времени x

Я пытаюсь создать линейный график с двойной осью y с указателем даты и времени в качестве оси x с выбором интервала, пока:

#base encoding the X-axis
brush = alt.selection(type='interval', encodings=['x'])
base = alt.Chart(yData.reset_index())
base = base.encode(alt.X('{0}:T'.format(yData.index.name), 
                         axis=alt.Axis(title=yData.index.name)))

py = base.mark_line()
py = py.encode(alt.X('date:T',scale = alt.Scale(domain = brush)),
               alt.Y('plotY', axis=alt.Axis(title='ylabel1')))
py = py.properties(width = 700, height = 230)


px = base.mark_line()
px = px.encode(alt.Y('plotX1', axis=alt.Axis(title='ylabel2')))
px = px.properties(width = 700, height = 230)

upper = (py + px).resolve_scale(y='independent')

lower = upper.copy()
lower = lower.properties(height=20).add_selection(brush)

p = alt.vconcat(upper, lower).configure_concat(spacing=0)
p

Если я попытаюсь произвести p, я получаю следующую ошибку:

Javascript Error: Duplicate signal name: "selector045_x"
This usually means there's a typo in your chart specification. See the JavaScript console for the full traceback

Если я попытаюсь получить верхний, я получаю:

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

Мой фрейм данных:

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

Есть идеи, как здесь выбрать интервал?

Также я продолжаю получать эту ошибку при работе с Альтаиром, любая идея, как я могу отладить это ?? У меня нет опыта работы с java, и я использую Mac.

ИЗМЕНИТЬ

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

brush = alt.selection(type='interval', encodings=['x'])
base = alt.Chart(yData.reset_index())
base = base.encode(alt.X('{0}:T'.format(yData.index.name), 
                         axis=alt.Axis(title=yData.index.name)))

py = base.mark_line()
py = py.encode(alt.X('date:T',scale = alt.Scale(domain = brush)),
               alt.Y('plotY', axis=alt.Axis(title='ylabel1')))
py = py.properties(width = 700, height = 230).add_selection(brush)


px = base.mark_line()
px = px.encode(alt.Y('plotX1', axis=alt.Axis(title='ylabel2')))
px = px.properties(width = 700, height = 230)

upper = (py + px).resolve_scale(y='independent')

lower = upper.copy()
lower = lower.properties(height=20)

p = alt.vconcat(upper, lower).configure_concat(spacing=0)
p

Я получаю это:

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

(1) Выбор не работает

(2) И каким-то образом я получаю точную копию upper для нижнего участка.

** РЕДАКТИРОВАТЬ - это заставило его работать **

brush = alt.selection(type='interval', encodings=['x'])
base = alt.Chart(yData.reset_index())
base = base.encode(alt.X('{0}:T'.format(yData.index.name), 
                         axis=alt.Axis(title=yData.index.name)))

py = base.mark_line(color='orange')
py = py.encode(alt.X('date:T',scale = alt.Scale(domain = brush)),
               alt.Y('plotY', axis=alt.Axis(title='ylabel1')),
              )
py = py.properties(width = 700, height = 230)


px = base.mark_line()
px = px.encode(alt.X('date:T',scale = alt.Scale(domain = brush)),
               alt.Y('plotX1', axis=alt.Axis(title='ylabel2')))
px = px.properties(width = 700, height = 230)

# upper = px
upper = (py + px).resolve_scale(y='independent')
lower = px.copy()
lower = lower.properties(height=20).add_selection(brush)

p = alt.vconcat(upper, lower).configure_concat(spacing=0)
p

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


person Dravidian    schedule 16.11.2019    source источник


Ответы (1)


Вместо этого добавьте выделение только к px или py. Если вы добавите один и тот же выбор к обеим поддиаграммам в слое, это приведет к этой ошибке. Это ошибка, которую, вероятно, следует исправить в Altair.

Чтобы быть более конкретным, ваш код должен выглядеть так:

# ...
px = px.properties(width = 700, height = 230).add_selection(brush)  # add selection here
# ...
lower = lower.properties(height=20)  # not here
# ...
person jakevdp    schedule 16.11.2019
comment
Вы имеете в виду вместо lower.properties(height=20).add_selection(brush) ?? Я не мог следить .., я уже использовал scale только в одном из подзаговоров - person Dravidian; 16.11.2019
comment
Спасибо, Джейк, за ответ. Но это все еще не решило проблему. Я обновил свой вопрос относительно того же - person Dravidian; 16.11.2019
comment
Эй, я смог решить часть «реплика», изменив lower = upper.copy() на lower = px.copy(). Но выбор в lower по-прежнему не выбирается на upper графике - person Dravidian; 16.11.2019
comment
Проблема в том, что вы установили домен в пикселях, которые указаны как на нижней, так и на верхней диаграмме. Вы не можете установить масштаб поддиаграммы, используя выделение, привязанное к этой поддиаграмме (если масштаб для поля выбора изменяется в ответ на изменения в этом поле выбора, все становится немного круглым и плохо определенным). Что вам нужно сделать, так это реструктурировать диаграмму таким образом, чтобы add_selection вызывалась только в нижней диаграмме, а alt.Scale(domain=...) добавлялась только в верхнюю диаграмму. - person jakevdp; 16.11.2019