如何在 altair 分层图中添加图例

Posted

技术标签:

【中文标题】如何在 altair 分层图中添加图例【英文标题】:How to add a legend in altair layered plots 【发布时间】:2021-04-20 20:52:44 【问题描述】:

所以我有以下代码:

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],
)

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)

我已经尝试使用以下解决方案添加图例: Add legend to line & bars to Altair chart without using size/color

但总是出现奇怪的错误,或者得到一个没有任何绘图数据的图例。

谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

为了向图表添加图例,您需要一个图例将代表的编码。例如,以下是添加颜色编码以生成颜色图例的方法:

measure_max_plot = alt.Chart(workload_df).transform_calculate(
    color='"measure_max"'
).mark_bar(text = 'measure_max').encode(
    alt.X('index', title = '', axis = alt.Axis(labelAngle = -45, labelOverlap = False)),
    alt.Y('measure_max', title = ''),
    alt.Color('color:N')
)

measure_plot = alt.Chart(workload_df).transform_calculate(
  color="datum.measure > datum.measure_max ? 'bigger' : 'smaller'"
).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.Color('color:N', scale=alt.Scale(range=['red', 'lightgreen', 'steelblue']))
)
altair_plot = alt.layer(measure_max_plot, measure_plot)

请注意,默认情况下,色标在两个分层图表之间共享。可以使用Scale & guide resolution API 微调此行为。

【讨论】:

以上是关于如何在 altair 分层图中添加图例的主要内容,如果未能解决你的问题,请参考以下文章

Altair 散点图添加了不需要的线条

如何在分层热图树状图中添加聚类矩形

小时和分钟作为 Altair 图中的标签,跨越一天以上

为啥 Altair 条形图中最左边的条不尊重选择画笔位置?

Altair - 如何在不操作 DataFrame 的情况下创建分组条形图

Altair 等值线图,基于折线图选择的颜色高亮