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

Posted

技术标签:

【中文标题】为啥 Altair 条形图中最左边的条不尊重选择画笔位置?【英文标题】:Why does the leftmost bar in an Altair Bar Chart not respect the selection brush location?为什么 Altair 条形图中最左边的条不尊重选择画笔位置? 【发布时间】:2021-08-23 20:41:05 【问题描述】:

我根据以下代码 (generate_dataframe) 中生成的合成数据创建了一个简单的条形图。该图像有一个带有数据的顶部图表和一个允许我沿水平轴拖动选择的下部图表。似乎有一个错误:最左边的条不受我在下图中的选择运动的影响。我使用 streamlit 来显示情节。这是正在发生的事情的图像。我在图片下方列出了代码。感谢您的任何建议。

Image produced when running the code, enhanced to illustrate the issue described above.

import streamlit as st
import pandas as pd
import altair as alt
import numpy.random as random

def generate_dataframe():
    nrows = 400
    name = [ 'n' + str(i) for i in range(300) ]
    names = random.choice(name, nrows)

    centrality = random.rand(nrows)
    multiplier = random.choice([.3, 1., 300.], nrows)
    centrality *= multiplier
    df = pd.DataFrame('x':names, 'y':centrality)
    return df

df = generate_dataframe()
#----------------------------------

brush = alt.selection(type="interval", encodings=['x'])
axis = alt.Axis(labels=False)

base = alt.Chart(df, title="Base view").mark_bar().encode(
    x=alt.X('x:N', axis=axis),
    y='y:Q'
).add_selection(
    brush
).properties(
    width=850,
    height=50
)

zoomed = alt.Chart(df).mark_bar().encode(
    x=alt.X('x:N', scale=alt.Scale(domain=brush), axis=axis),
    y='y:Q'
).properties(
    width=850,
    height=400
)

chart = zoomed & base
st.altair_chart(chart)

【问题讨论】:

【参考方案1】:

Binding an interval selection to a scale's domain is currently not supported for ordinal and nominal domains. 一种解决方法是改用.transform_filter(),因此将代码更改为此,您将不再看到左侧的堆叠条:

zoomed = alt.Chart(df).mark_bar().encode(
    x=alt.X('x:N', axis=axis),
    y='y:Q'
).properties(
    width=850,
    height=400
).transform_filter(
    brush
)

【讨论】:

成功了!非常感谢!非常优雅的解决方案。 @GordonErlebacher 不客气!不要忘记用左侧的复选标记将问题标记为已解决。

以上是关于为啥 Altair 条形图中最左边的条不尊重选择画笔位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 altair.layered 图中配置条形图?

tableau利用甘特图特点画不同方向的条形图

如何在条形图的条内显示值?

在 Altair 中设置条形图上的标签格式

ggplot条形图中的恒定宽度

减少 svg 图中条形之间的间隙