在带 Altair 的条形图上使用颜色似乎可以防止 zero=False 在比例尺上产生预期效果
Using color on bar chart with Altair seems to prevent zero=False on scale from having anticipated effect
下面代码中的第一个图表(基于此:https://altair-viz.github.io/gallery/us_population_over_time_facet.html)似乎强制 Y 轴不能像预期的那样从零开始。但是第二个图表,在编码中包含颜色,似乎使 alt.Scale 中的 zero=False 不再受到尊重
编辑:忘记提及使用 Altair 4.1.0
import altair as alt
from vega_datasets import data
import pandas as pd
source = data.population.url
df = pd.read_json(source)
df = df[df["age"] <= 40]
alt.Chart(df).mark_bar().encode(
x="age:O",
y=alt.Y(
"sum(people):Q",
title="Population",
axis=alt.Axis(format="~s"),
scale=alt.Scale(zero=False),
),
facet=alt.Facet("year:O", columns=5),
).resolve_scale(y="independent").properties(
title="US Age Distribution By Year", width=90, height=80
)
alt.Chart(df).mark_bar().encode(
x="age:O",
y=alt.Y(
"sum(people):Q",
title="Population",
axis=alt.Axis(format="~s"),
scale=alt.Scale(zero=False),
),
facet=alt.Facet("year:O", columns=5),
color=alt.Color("year"),
).resolve_scale(y="independent").properties(
title="US Age Distribution By Year", width=90, height=80
)
发生这种情况是因为比例会自动调整以显示您着色所依据的变量中的所有组。如果我们查看具有堆叠颜色的单个条形图,则更容易理解:
import altair as alt
from vega_datasets import data
import pandas as pd
source = data.population.url
df = pd.read_json(source)
df = df[df["age"] <= 40]
alt.Chart(df.query('year < 1880')).mark_bar().encode(
x="age:O",
y=alt.Y(
"sum(people):Q",
axis=alt.Axis(format="~s"),
scale=alt.Scale(zero=False)),
color=alt.Color("year"))
您正在计算总和,这意味着所有年份都将在该栏中的某个位置堆叠在一起。 Altair / Vega-Lite 扩展了轴,以便在您的彩色变量中包含所有组。
如果改为按年龄着色,轴将再次扩展以包括所有彩色组,但因为它们现在不在每个条形的底部,所以轴被切到零以上。
import altair as alt
from vega_datasets import data
import pandas as pd
source = data.population.url
df = pd.read_json(source)
df = df[df["age"] <= 40]
alt.Chart(df.query('year < 1880')).mark_bar().encode(
x="age:O",
y=alt.Y(
"sum(people):Q",
axis=alt.Axis(format="~s"),
scale=alt.Scale(zero=False)),
color=alt.Color("age"))
唯一不同的是,为什么第一个图中不只显示最暗颜色的尖端并切割2M左右?我不确定我的头顶。
下面代码中的第一个图表(基于此:https://altair-viz.github.io/gallery/us_population_over_time_facet.html)似乎强制 Y 轴不能像预期的那样从零开始。但是第二个图表,在编码中包含颜色,似乎使 alt.Scale 中的 zero=False 不再受到尊重
编辑:忘记提及使用 Altair 4.1.0
import altair as alt
from vega_datasets import data
import pandas as pd
source = data.population.url
df = pd.read_json(source)
df = df[df["age"] <= 40]
alt.Chart(df).mark_bar().encode(
x="age:O",
y=alt.Y(
"sum(people):Q",
title="Population",
axis=alt.Axis(format="~s"),
scale=alt.Scale(zero=False),
),
facet=alt.Facet("year:O", columns=5),
).resolve_scale(y="independent").properties(
title="US Age Distribution By Year", width=90, height=80
)
alt.Chart(df).mark_bar().encode(
x="age:O",
y=alt.Y(
"sum(people):Q",
title="Population",
axis=alt.Axis(format="~s"),
scale=alt.Scale(zero=False),
),
facet=alt.Facet("year:O", columns=5),
color=alt.Color("year"),
).resolve_scale(y="independent").properties(
title="US Age Distribution By Year", width=90, height=80
)
发生这种情况是因为比例会自动调整以显示您着色所依据的变量中的所有组。如果我们查看具有堆叠颜色的单个条形图,则更容易理解:
import altair as alt
from vega_datasets import data
import pandas as pd
source = data.population.url
df = pd.read_json(source)
df = df[df["age"] <= 40]
alt.Chart(df.query('year < 1880')).mark_bar().encode(
x="age:O",
y=alt.Y(
"sum(people):Q",
axis=alt.Axis(format="~s"),
scale=alt.Scale(zero=False)),
color=alt.Color("year"))
您正在计算总和,这意味着所有年份都将在该栏中的某个位置堆叠在一起。 Altair / Vega-Lite 扩展了轴,以便在您的彩色变量中包含所有组。
如果改为按年龄着色,轴将再次扩展以包括所有彩色组,但因为它们现在不在每个条形的底部,所以轴被切到零以上。
import altair as alt
from vega_datasets import data
import pandas as pd
source = data.population.url
df = pd.read_json(source)
df = df[df["age"] <= 40]
alt.Chart(df.query('year < 1880')).mark_bar().encode(
x="age:O",
y=alt.Y(
"sum(people):Q",
axis=alt.Axis(format="~s"),
scale=alt.Scale(zero=False)),
color=alt.Color("age"))
唯一不同的是,为什么第一个图中不只显示最暗颜色的尖端并切割2M左右?我不确定我的头顶。