规则线#

mark rule 将每个数据点表示为一条线段。它有两种使用方式。首先,作为一条跨越视图完整宽度或高度的线段。其次,规则线可以用于在两个位置之间绘制线段。

规则线标记属性#

点击显示代码
import altair as alt
import pandas as pd

x_slider = alt.binding_range(min=1, max=100, step=1)
x_var = alt.param(bind=x_slider, value=35, name="x")

x2_slider = alt.binding_range(min=1, max=100, step=1)
x2_var = alt.param(bind=x2_slider, value=75, name="x2")

y_slider = alt.binding_range(min=1, max=100, step=1)
y_var = alt.param(bind=y_slider, value=25, name="y")

y2_slider = alt.binding_range(min=1, max=100, step=1)
y2_var = alt.param(bind=y2_slider, value=75, name="y2")

strokeWidth_slider = alt.binding_range(min=0, max=10, step=0.5)
strokeWidth_var = alt.param(bind=strokeWidth_slider, value=2, name="strokeWidth")

strokeCap_select = alt.binding_select(options=["butt", "round", "square"])
strokeCap_var = alt.param(bind=strokeCap_select, value="butt", name="strokeCap")

strokeDash_select = alt.binding_select(
    options=[[1, 0], [8, 8], [8, 4], [4, 4], [4, 2], [2, 1], [1, 1]]
)
strokeDash_var = alt.param(bind=strokeDash_select, value=[1, 0], name="strokeDash")

alt.Chart().mark_rule(
    color="orange",
    strokeWidth=strokeWidth_var,
    strokeCap=strokeCap_var,
    strokeDash=strokeDash_var,
).encode(
    x=alt.datum(x_var, type="quantitative", scale=alt.Scale(domain=[0, 100])),
    y=alt.datum(y_var, type="quantitative", scale=alt.Scale(domain=[0, 100])),
    x2=alt.datum(x2_var),
    y2=alt.datum(y2_var),
).add_params(
    x_var,
    x2_var,
    y_var,
    y2_var,
    strokeWidth_var,
    strokeCap_var,
    strokeDash_var,
)

一个 rule 标记定义可以包含任何标准标记属性

示例#

跨越宽度/高度的规则线#

如果 rule 标记只有 y 编码,输出视图将生成跨越完整宽度的水平规则线。类似地,如果 rule 标记只有 x 编码,输出视图将生成跨越高度的垂直规则线。

我们可以使用规则线来显示不同股票的平均价格,类似于 tick 标记。

import altair as alt
from vega_datasets import data

source = data.stocks()

alt.Chart(source).mark_rule().encode(
    y="mean(price):Q",
    size=alt.value(2),
    color="symbol:N"
)

规则线标记跨越单个视图的宽度或高度这一事实使其成为有用的注释层。例如,我们可以使用规则线在价格曲线旁边显示不同股票的平均值。

import altair as alt
from vega_datasets import data

source = data.stocks()

base = alt.Chart(source).properties(width=550)
line = base.mark_line().encode(
    x="date",
    y="price",
    color="symbol"
)
rule = base.mark_rule().encode(
    y="average(price)",
    color="symbol",
    size=alt.value(2)
)

line + rule

我们也可以使用规则线标记在直方图上显示全局平均值。

import altair as alt
from vega_datasets import data

source = data.movies.url

base = alt.Chart(source)
bar = base.mark_bar().encode(
    x=alt.X("IMDB_Rating:Q").bin().axis(None),
    y="count()"
)
rule = base.mark_rule(color="red").encode(
    x="mean(IMDB_Rating):Q",
    size=alt.value(5),
)

bar + rule

范围规则线#

要控制水平/垂直规则线的跨度,可以指定 xx2 / yy2 通道。

例如,我们可以使用 yy2 来显示不同地区汽车马力的 "min""max" 值。

import altair as alt
from vega_datasets import data

source = data.cars()

alt.Chart(source).mark_rule().encode(
    x="Origin",
    y="min(Horsepower)",
    y2="max(Horsepower)",
)