如何在 altair.layered 图中配置条形图?
How to configure bars in a altair.layered plot?
在使用 streamlit 的同时,我开始使用 altair 来绘制数据。在使用它时,我偶然发现了以下问题:
我想绘制一个具有以下结构的 DataFrame:
workload_df = pd.DataFrame({
'index': pd.to_datetime(['01.02.2010', '01.03.2010', '01.04.2010']),
'measure': [100, 90, 120],
'measure_max': [80, 100, 150],
})
现在我想在条形图中将度量值与 max_measure 进行比较:
measure_max_plot = alt.Chart(workload_df).mark_bar(color = 'lightgreen', text = 'measure_max').encode(
alt.X('index', title = '', axis = alt.Axis(labelAngle = -45, labelOverlap = False)),
alt.Y('measure_max', title = '')
)
measure_plot = alt.Chart(workload_df).mark_bar(text = 'measure').encode(
x = alt.X('index', title = 'X', axis = alt.Axis(labelAngle = -45, labelOverlap = False)),
y = alt.Y('measure', title = 'Y'),
color=alt.condition(
alt.datum.measure > alt.datum.measure_max,
alt.value('red'),
alt.value('steelblue')
)
)
altair_plot = alt.layer(measure_max_plot, measure_plot)
st.altair_chart(altair_plot, use_container_width=True)
我得到这样的结果:
或类似的东西:
但我希望最高的条总是在背景中,所以像这样:
谁能帮我解决这个问题?
层始终按照它们在层图中指定的顺序显示。在您的情况下,您需要 measure_plot
下面显示的部分 measure_max_plot
和上面显示的部分。您可以通过过滤和添加另一层来做到这一点:
altair_plot = alt.layer(
measure_plot.transform_filter(alt.datum.measure > alt.datum.measure_max),
measure_max_plot,
measure_plot.transform_filter(alt.datum.measure < alt.datum.measure_max)
)
在使用 streamlit 的同时,我开始使用 altair 来绘制数据。在使用它时,我偶然发现了以下问题:
我想绘制一个具有以下结构的 DataFrame:
workload_df = pd.DataFrame({
'index': pd.to_datetime(['01.02.2010', '01.03.2010', '01.04.2010']),
'measure': [100, 90, 120],
'measure_max': [80, 100, 150],
})
现在我想在条形图中将度量值与 max_measure 进行比较:
measure_max_plot = alt.Chart(workload_df).mark_bar(color = 'lightgreen', text = 'measure_max').encode(
alt.X('index', title = '', axis = alt.Axis(labelAngle = -45, labelOverlap = False)),
alt.Y('measure_max', title = '')
)
measure_plot = alt.Chart(workload_df).mark_bar(text = 'measure').encode(
x = alt.X('index', title = 'X', axis = alt.Axis(labelAngle = -45, labelOverlap = False)),
y = alt.Y('measure', title = 'Y'),
color=alt.condition(
alt.datum.measure > alt.datum.measure_max,
alt.value('red'),
alt.value('steelblue')
)
)
altair_plot = alt.layer(measure_max_plot, measure_plot)
st.altair_chart(altair_plot, use_container_width=True)
我得到这样的结果:
或类似的东西:
但我希望最高的条总是在背景中,所以像这样:
谁能帮我解决这个问题?
层始终按照它们在层图中指定的顺序显示。在您的情况下,您需要 measure_plot
下面显示的部分 measure_max_plot
和上面显示的部分。您可以通过过滤和添加另一层来做到这一点:
altair_plot = alt.layer(
measure_plot.transform_filter(alt.datum.measure > alt.datum.measure_max),
measure_max_plot,
measure_plot.transform_filter(alt.datum.measure < alt.datum.measure_max)
)