为啥 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 条形图中最左边的条不尊重选择画笔位置?的主要内容,如果未能解决你的问题,请参考以下文章