如何在Altair图表中忽略或剪切图表代码中的负值?

问题描述 投票:0回答:1

我想在柱状图中不显示负值。主要的想法是不显示Y轴的偏移(在实际问题中,它是一个面),所以任何实现这个目标的方法都可以--也许是剪切--只是不在数据层面,最好是在图表本身。

我想到了使用 alt.Scale 却是 domain 需要你指定一个最大的限制,而问题是我并不了解,我也找不到一种方法来在程序上指定 max 的值。

您可以使用下面的演示图 -

import pandas as pd
import altair as alt

dd = pd.DataFrame({'a': [0,1,2,3,4,5], 'b': [10,14, -5, 15, 0, 5]})
a = alt.Chart().mark_bar().encode(
    x='a',
    y=alt.Y('b:Q')
)
b = alt.Chart().mark_line().transform_window(
    rolling_mean = 'mean(b)',
    frame=[-2, 0]).encode(
    x='a',
    y='rolling_mean:Q'
)
alt.layer(a, b, data=dd)
python-3.x data-visualization visualization altair vega-lite
1个回答
1
投票

据我所知,只有两种方法可以隐藏图表中的数据。首先,你可以设置一个明确的比例域,并设置 clip=True 的相关标记。

import pandas as pd
import altair as alt

dd = pd.DataFrame({'a': [0,1,2,3,4,5], 'b': [10,14, -5, 15, 0, 5]})
a = alt.Chart().mark_bar(clip=True).encode(
    x='a',
    y=alt.Y('b:Q', scale=alt.Scale(domain=[0, 16]))
)
b = alt.Chart().mark_line().transform_window(
    rolling_mean = 'mean(b)',
    frame=[-2, 0]).encode(
    x='a',
    y='rolling_mean:Q'
)
alt.layer(a, b, data=dd)

enter image description here

其次,你可以对你的数据应用过滤变换来删除数据集中的行。

import pandas as pd
import altair as alt

dd = pd.DataFrame({'a': [0,1,2,3,4,5], 'b': [10,14, -5, 15, 0, 5]})
a = alt.Chart().mark_bar().encode(
    x='a',
    y=alt.Y('b:Q', scale=alt.Scale(domain=[0, 16]))
)
b = alt.Chart().mark_line().transform_window(
    rolling_mean = 'mean(b)',
    frame=[-2, 0]).encode(
    x='a',
    y='rolling_mean:Q'
)
alt.layer(a, b, data=dd).transform_filter(alt.datum.b > 0)

enter image description here

请注意,不同的是:因为这个变换是在顶层应用的,所以它删除的行为: 两者 子面板。如果你反而只对其中一个子图应用过滤器,那么行将只从该层中删除。

import pandas as pd
import altair as alt

dd = pd.DataFrame({'a': [0,1,2,3,4,5], 'b': [10,14, -5, 15, 0, 5]})
a = alt.Chart().transform_filter(
    alt.datum.b > 0
).mark_bar().encode(
    x='a',
    y=alt.Y('b:Q', scale=alt.Scale(domain=[0, 16]))
)
b = alt.Chart().mark_line().transform_window(
    rolling_mean = 'mean(b)',
    frame=[-2, 0]).encode(
    x='a',
    y='rolling_mean:Q'
)
alt.layer(a, b, data=dd)

enter image description here


0
投票

一种方法似乎是使用 transform_filter 以下是: .transform_filter(alt.datum.b >= 0 )

© www.soinside.com 2019 - 2024. All rights reserved.