Altair:如何以预定义的缩放比例启动交互式标称条形图?
Altair: How to start a interactive nominal bar chart at a predefined zoom?
我正在使用 Altair 构建一个简单的垂直条形图。它有很多标称列,我在最后调用了 interactive()
,所以我可以进行缩放和平移。
如何开始缩放比例以使其只显示最左边的 10 列?
我设法只显示了前 10 列,但它阻止了我平移:
sorted_values = df.sort_values('nota', ascending=False)['CO_ESCOLA'].values
(alt.Chart(df).mark_bar()
.encode(x=alt.X("CO_ESCOLA:N",
sort=sorted_values,
scale=alt.Scale(domain=sorted_values[:10])),
y="nota:Q")
.properties(width=1000)
.interactive()
)
我不是牵牛星专家,但你的问题启发了我做一些研究。在条形图中似乎无法将其左右移动。用户选择功能可以在显示整个图形图像的同时通过更改选择的颜色来突出显示选择。如果此技术不适合您的可视化场景,您可以忽略我的回答。代码改编自this官方参考中的一个
import pandas as pd
import altair as alt
import numpy as np
import random, string
def randomname(n):
return ''.join(random.choices(string.ascii_letters, k=n))
df = pd.DataFrame({'nota':np.random.randint(0,50,(30,))})
df['CO_ESCOLA'] = df['nota'].apply(lambda x:randomname(5))
sorted_values = df.sort_values('nota', ascending=False)['CO_ESCOLA'].values
base = alt.Chart(df).mark_bar(
color='steelblue',
opacity=0.3,
).encode(
x=alt.X("CO_ESCOLA:N",
sort=sorted_values,
scale=alt.Scale(domain=sorted_values)
),
y=alt.Y("nota:Q",
)#scale=alt.Scale(domain=[0,55])
).properties(
width=1000
)
text = base.mark_text(align='center',
baseline='middle',
color='yellow',
dy=10
).encode(
text='nota:Q'
)
brush = alt.selection_interval(encodings=['x'],empty='all')# _interval
background = base.add_selection(brush)
selected = base.transform_filter(brush).mark_bar(color='steelblue')
alt.layer(background, selected, text).interactive()
在评论中,@japevdp 对我的问题给出了明确的答案:不可能在标称轴上平移。
但是在探索 Altair 的过程中,我找到了一个很好的解决方案来解决我想分享的问题。
我的问题是我的列太多了,我想显示所有列,同时还允许用户向下钻取。
设置条形大小和条形之间的步长,我创建了一个非常大的图表,笔记本自动创建了一个水平滚动条。我通常对水平滚动不屑一顾,但它允许用户分析数据的一个子集。
并且 interative()
方法仍然允许我放大 y 轴:
我认为这是一个很好的解决方案。这是代码:
(alt.Chart(df).mark_bar(size=30)
.encode(x=alt.X("CO_ESCOLA:N", sort=df.sort_values('nota_final', ascending=False)['CO_ESCOLA'].values),
y="nota_final:Q", tooltip=['nota_final'])
.properties( width=alt.Step(45))
.interactive()
)
关键点是width=30
和width=alt.step(45)
选项。
这是代码
我正在使用 Altair 构建一个简单的垂直条形图。它有很多标称列,我在最后调用了 interactive()
,所以我可以进行缩放和平移。
如何开始缩放比例以使其只显示最左边的 10 列?
我设法只显示了前 10 列,但它阻止了我平移:
sorted_values = df.sort_values('nota', ascending=False)['CO_ESCOLA'].values
(alt.Chart(df).mark_bar()
.encode(x=alt.X("CO_ESCOLA:N",
sort=sorted_values,
scale=alt.Scale(domain=sorted_values[:10])),
y="nota:Q")
.properties(width=1000)
.interactive()
)
我不是牵牛星专家,但你的问题启发了我做一些研究。在条形图中似乎无法将其左右移动。用户选择功能可以在显示整个图形图像的同时通过更改选择的颜色来突出显示选择。如果此技术不适合您的可视化场景,您可以忽略我的回答。代码改编自this官方参考中的一个
import pandas as pd
import altair as alt
import numpy as np
import random, string
def randomname(n):
return ''.join(random.choices(string.ascii_letters, k=n))
df = pd.DataFrame({'nota':np.random.randint(0,50,(30,))})
df['CO_ESCOLA'] = df['nota'].apply(lambda x:randomname(5))
sorted_values = df.sort_values('nota', ascending=False)['CO_ESCOLA'].values
base = alt.Chart(df).mark_bar(
color='steelblue',
opacity=0.3,
).encode(
x=alt.X("CO_ESCOLA:N",
sort=sorted_values,
scale=alt.Scale(domain=sorted_values)
),
y=alt.Y("nota:Q",
)#scale=alt.Scale(domain=[0,55])
).properties(
width=1000
)
text = base.mark_text(align='center',
baseline='middle',
color='yellow',
dy=10
).encode(
text='nota:Q'
)
brush = alt.selection_interval(encodings=['x'],empty='all')# _interval
background = base.add_selection(brush)
selected = base.transform_filter(brush).mark_bar(color='steelblue')
alt.layer(background, selected, text).interactive()
在评论中,@japevdp 对我的问题给出了明确的答案:不可能在标称轴上平移。
但是在探索 Altair 的过程中,我找到了一个很好的解决方案来解决我想分享的问题。
我的问题是我的列太多了,我想显示所有列,同时还允许用户向下钻取。
设置条形大小和条形之间的步长,我创建了一个非常大的图表,笔记本自动创建了一个水平滚动条。我通常对水平滚动不屑一顾,但它允许用户分析数据的一个子集。
并且 interative()
方法仍然允许我放大 y 轴:
我认为这是一个很好的解决方案。这是代码:
(alt.Chart(df).mark_bar(size=30)
.encode(x=alt.X("CO_ESCOLA:N", sort=df.sort_values('nota_final', ascending=False)['CO_ESCOLA'].values),
y="nota_final:Q", tooltip=['nota_final'])
.properties( width=alt.Step(45))
.interactive()
)
关键点是width=30
和width=alt.step(45)
选项。
这是代码