我有一个柱状图,显示了一堆值,从最高到最低排序。但是我有太多的值(约100个)。我想制作一个柱状图,省略中间排名的值,只显示具有最高和最低值的条形,就像Pandas对DataFrame的默认显示方式一样,显示前20个左右的值,然后是...
,然后是最后20个左右的值。所以基本上是这样的一个图表:
X
XXX
XXXXX
XXXXX ... X
我可以随时创建一个省略这些值的DataFrame,但拥有一个视觉化呈现这种省略的形式会更好。这可行吗?
我有一个柱状图,显示了一堆值,从最高到最低排序。但是我有太多的值(约100个)。我想制作一个柱状图,省略中间排名的值,只显示具有最高和最低值的条形,就像Pandas对DataFrame的默认显示方式一样,显示前20个左右的值,然后是...
,然后是最后20个左右的值。所以基本上是这样的一个图表:
X
XXX
XXXXX
XXXXX ... X
我可以随时创建一个省略这些值的DataFrame,但拥有一个视觉化呈现这种省略的形式会更好。这可行吗?
我不知道在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"
)
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"
)