Я думаю, что проблема, когда вы задаете значение с помощью alt.value
, заключается в том, что вы указываете значение в пикселях, начиная с вершины графика: оно не отображается на данные.
В первоначальном ответе с mark_rule
он создавал не чистую полосу, а много вертикальных полос, так что вот способ правильно построить полосу.
Первое решение - создать новый фрейм данных для полосы и расположить его поверх полос:
import altair as alt
import pandas as pd
from vega_datasets import data
weather = data('seattle_weather')
band_df = pd.DataFrame([{'x_min': weather.date.min(),
'x_max': weather.date.max(),
'y_min': 20,
'y_max': 50}])
bars = alt.Chart(weather).mark_bar().encode(
x=alt.X('date:T'),
y=alt.Y('precipitation:Q', title="Precipitation")
)
band_2 = alt.Chart(band_df).mark_rect(color='firebrick', opacity=0.3).encode(
x='x_min:T',
x2='x_max:T',
y='y_min:Q',
y2='y_max:Q'
)
alt.layer(bars, band_2)
Второй вариант, если вы не хотите / не можете создать фрейм данных, - использовать transform_calculate
и вручную указать x
и x2
в полосовой диаграмме:
bars = alt.Chart().mark_bar().encode(
x=alt.X('date:T', title='Date'),
y=alt.Y('precipitation:Q', title="Precipitation")
)
band_3 = alt.Chart().mark_rect(color='firebrick', opacity=0.3).encode(
x='min(date):T',
x2='max(date):T',
y='y_min:Q',
y2='y_max:Q'
).transform_calculate(y_min='20', y_max='50')
alt.layer(bars, band_3, data=data.seattle_weather.url)
Первоначальный ответ
Я бы сделал 2 вещи, чтобы имитировать приведенный вами пример highchart. Сначала используйте transform_calculate
, чтобы установить значения y_min
и y_max
. И во-вторых, я буду использовать mark_rule
, чтобы полоса охватывала ось X, где есть значения. (Я также добавил немного непрозрачности и изменил порядок слоев, чтобы полоса находилась за решеткой.)
import altair as alt
from vega_datasets import data
weather = data.seattle_weather.url
chart = alt.Chart().encode(
alt.X("date:T")
)
bars = chart.mark_bar().encode(
y='precipitation:Q'
)
band = chart.mark_rule(color='firebrick',
opacity=0.3).encode(
y=alt.Y('y_min:Q'),
y2=alt.Y('y_max:Q')
).transform_calculate(y_min="20",
y_max="50")
alt.layer(band, bars, data=weather)
person
FlorianGD
schedule
08.11.2018