代码之家  ›  专栏  ›  技术社区  ›  jar

如何从图表代码本身中忽略或剪裁牛郎星图表中的负值?

  •  0
  • jar  · 技术社区  · 6 年前

    我不想在条形图中显示负值。主要的想法是没有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)
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   jakevdp    6 年前

    我知道只有两种方法可以在图表上隐藏数据。首先,可以设置显式缩放域并 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

        2
  •  0
  •   jar    6 年前

    transform_filter
    .transform_filter(alt.datum.b >= 0 )