在多面 Altair 图表中重复轴
Repeating an axis in a faceted Altair chart
给定一个简单的多面图表,例如:
import altair as alt
data = alt.Data(values = [
{ "category" : "a", "x" : 1, "y" : 2 },
{ "category" : "a", "x" : 2, "y" : 4 },
{ "category" : "b", "x" : 1, "y" : 3 },
{ "category" : "b", "x" : 2, "y" : 5 }
])
alt.Chart(data).mark_point().encode(x = "x:Q", y = "y:Q").facet(
row = "category:O"
)
如何让每个子图表都显示 x 轴,而不是只在底部显示一次?这是为了在有很多子图表时提高可读性...
遗憾的是,使用行编码时无法使 x 轴出现在多个图表中。作为解决方法,您可以根据过滤后的数据手动绘制 vconcat 图表:
chart = alt.Chart(data).mark_point().encode(x="x:Q", y="y:Q")
alt.vconcat(
chart.transform_filter(alt.datum.category == 'a'),
chart.transform_filter(alt.datum.category == 'b')
)
为避免手动写出列值,您可以使用 Python 工具生成不同的子图表;例如,这相当于上面的:
df = pd.DataFrame.from_records([
{ "category" : "a", "x" : 1, "y" : 2 },
{ "category" : "a", "x" : 2, "y" : 4 },
{ "category" : "b", "x" : 1, "y" : 3 },
{ "category" : "b", "x" : 2, "y" : 5 }
])
chart = alt.Chart(df).mark_point().encode(x="x:Q", y="y:Q")
alt.vconcat(
*(chart.transform_filter(alt.datum.category == val)
for val in df['category'].unique())
)
这里有一个简单的重复轴的方法,有一个缺点:
import altair as alt
data = alt.Data(values = [
{ "category" : "a", "x" : 1, "y" : 2 },
{ "category" : "a", "x" : 2, "y" : 4 },
{ "category" : "b", "x" : 1, "y" : 3 },
{ "category" : "b", "x" : 2, "y" : 5 }
])
alt.Chart(data).mark_point().encode(x = "x:Q", y = "y:Q").facet(
row = "category:O"
).resolve_scale(x='independent')
但是: 如果小平面没有相同的 x 轴范围,这也会将它们解耦!据我所知,没有简单的方法可以在不使小平面独立的情况下只重复轴。但您始终可以通过调整范围来实现这一目标。
给定一个简单的多面图表,例如:
import altair as alt
data = alt.Data(values = [
{ "category" : "a", "x" : 1, "y" : 2 },
{ "category" : "a", "x" : 2, "y" : 4 },
{ "category" : "b", "x" : 1, "y" : 3 },
{ "category" : "b", "x" : 2, "y" : 5 }
])
alt.Chart(data).mark_point().encode(x = "x:Q", y = "y:Q").facet(
row = "category:O"
)
如何让每个子图表都显示 x 轴,而不是只在底部显示一次?这是为了在有很多子图表时提高可读性...
遗憾的是,使用行编码时无法使 x 轴出现在多个图表中。作为解决方法,您可以根据过滤后的数据手动绘制 vconcat 图表:
chart = alt.Chart(data).mark_point().encode(x="x:Q", y="y:Q")
alt.vconcat(
chart.transform_filter(alt.datum.category == 'a'),
chart.transform_filter(alt.datum.category == 'b')
)
为避免手动写出列值,您可以使用 Python 工具生成不同的子图表;例如,这相当于上面的:
df = pd.DataFrame.from_records([
{ "category" : "a", "x" : 1, "y" : 2 },
{ "category" : "a", "x" : 2, "y" : 4 },
{ "category" : "b", "x" : 1, "y" : 3 },
{ "category" : "b", "x" : 2, "y" : 5 }
])
chart = alt.Chart(df).mark_point().encode(x="x:Q", y="y:Q")
alt.vconcat(
*(chart.transform_filter(alt.datum.category == val)
for val in df['category'].unique())
)
这里有一个简单的重复轴的方法,有一个缺点:
import altair as alt
data = alt.Data(values = [
{ "category" : "a", "x" : 1, "y" : 2 },
{ "category" : "a", "x" : 2, "y" : 4 },
{ "category" : "b", "x" : 1, "y" : 3 },
{ "category" : "b", "x" : 2, "y" : 5 }
])
alt.Chart(data).mark_point().encode(x = "x:Q", y = "y:Q").facet(
row = "category:O"
).resolve_scale(x='independent')
但是: 如果小平面没有相同的 x 轴范围,这也会将它们解耦!据我所知,没有简单的方法可以在不使小平面独立的情况下只重复轴。但您始终可以通过调整范围来实现这一目标。