Python Altair-设置交互式图形的最小条形高度

时间:2019-05-29 14:36:22

标签: python data-visualization vega-lite altair

我目前正在生成一个交互式的堆叠条形图,可以在其中单击条形图的各个堆栈以更新其他图形。

我遇到的问题是规模问题。有时,我会有一个数据集,其中1条的读数为25,000,另一条的读数为1。

当刻度由于另一个读数而变得如此之高时,几乎看不到(更不用说单击)条目1了。

是否可以为任何条形块设置“最小”高度?我知道由于Y轴缩放,这可能很困难或很奇怪。

谢谢!

2 个答案:

答案 0 :(得分:0)

没有办法在Altair或Vega-Lite中设置最小钢筋高度,除非修改输入数据,否则可能会产生误导。

也许您可以将另一个图表与一个共享轴连接起来,并通过该轴提供交互?例如:

import pandas as pd
import altair as alt

df = pd.DataFrame({
    'x': list('ABCDE'),
    'y': [1, 2, 3, 10000, 500]
})

selector = alt.selection_single(fields=['x'])
color = alt.condition(selector, alt.value('steelblue'), alt.value('lightgray'))

base = alt.Chart(df).mark_bar().encode(
    color=color
).add_selection(
    selector
)

bars = base.encode(
    x=alt.X('x:N', axis=None),
    y='y:Q',
)

rects = base.encode(
    x='x:N'
)

alt.vconcat(bars, rects).configure_concat(spacing=0)

enter image description here

答案 1 :(得分:0)

您可以使用strokeWidth绘制边缘:

import altair as alt

import pandas as pd
df = pd.DataFrame(dict(x=["a", "b"], y=[1, 1000]))
select = alt.selection(type="single", fields=["x"], empty="none")
alt.Chart(df).mark_bar(strokeWidth=5).encode(
    y="x",
    x="y",
    fill=alt.condition(select, alt.value("red"), alt.value("blue")),
    stroke=alt.condition(select, alt.value("red"), alt.value("blue")),
).add_selection(select)

如果不想显示笔划,可以设置strokeOpacity=0.001

import altair as alt

import pandas as pd
df = pd.DataFrame(dict(x=["a", "b"], y=[1, 1000]))
select = alt.selection(type="single", fields=["x"], empty="none")
alt.Chart(df).mark_bar(strokeWidth=5, stroke="red", strokeOpacity=0.001).encode(
    y="x",
    x="y",
    fill=alt.condition(select, alt.value("red"), alt.value("blue")),
).add_selection(select).interactive()

enter image description here