在Altair(Python)中,是否有一种方法可以省略条形图中间值?

3

我有一个柱状图,显示了一堆值,从最高到最低排序。但是我有太多的值(约100个)。我想制作一个柱状图,省略中间排名的值,只显示具有最高和最低值的条形,就像Pandas对DataFrame的默认显示方式一样,显示前20个左右的值,然后是...,然后是最后20个左右的值。所以基本上是这样的一个图表:

X
XXX
XXXXX
XXXXX ... X

我可以随时创建一个省略这些值的DataFrame,但拥有一个视觉化呈现这种省略的形式会更好。这可行吗?


一旦你删除了中间部分,就可以绘制它。期望可视化库为您执行任何数据删除都是一个相当值得怀疑的方法,无论是Altair还是其他库。 - Evgeny
2个回答

3

我不知道在Altair中直接完成它的方法,但你可以修改你的DataFrame以提供一些视觉指示来显示间断,像这样:

import pandas as pd
import altair as alt
from vega_datasets import data

raw = data.airports()
df = (raw[raw.country == "USA"]
      .groupby("state")
      .iata.count()
      .rename("number_of_airports")
      .sort_values(ascending=False).reset_index()
     )

top_bottom = pd.concat(
    (df.head(5), pd.DataFrame(data=[["...", 0]], columns=df.columns), df.tail(5)),
    ignore_index=True
)

alt.Chart(
    top_bottom.reset_index()
).mark_bar().encode(
    alt.X("state",
          sort=alt.EncodingSortField(field="index", op="sum"),
          axis=alt.Axis(labelAngle=0)
         ),
    y="number_of_airports"
)

输出: 输入图像描述


3

Altair语法没有为这种类型的图表提供干净的抽象,但您可以通过一些技巧来实现。以下是使用Altair转换显示与@foglerit答案相同的图表:

import pandas as pd
import altair as alt
from vega_datasets import data

raw = data.airports()
df = (raw[raw.country == "USA"]
      .groupby("state")
      .iata.count()
      .rename("number_of_airports")
      .sort_values(ascending=False).reset_index()
     )

alt.Chart(df).transform_window(
    rank='rank()',
    sort=[alt.SortField('number_of_airports', order='descending')]
).transform_filter(
    (alt.datum.rank <= 5) | (alt.datum.rank >= 50)
).transform_calculate(
    state="datum.rank == 50 ? '...' : datum.state",
    number_of_airports="datum.rank == 50 ? 0 : datum.number_of_airports"
).mark_bar().encode(
    alt.X("state:N",
          sort=alt.EncodingSortField(field="rank"),
          axis=alt.Axis(labelAngle=0)
         ),
    y="number_of_airports:Q"
)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接