弧形#

弧形标记是由中心点加上角度和径向范围定义的圆弧。弧形标记通常用于径向图,如饼图和甜甜圈图。

弧形标记属性#

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

rad_slider = alt.binding_range(min=0, max=100, step=1)
rad_var = alt.param(bind=rad_slider, value=0, name="radius")

rad2_slider = alt.binding_range(min=0, max=100, step=1)
rad_var2 = alt.param(bind=rad_slider, value=50, name="radius2")

theta_slider = alt.binding_range(min=-2 * np.pi, max=2 * np.pi)
theta_var = alt.param(bind=theta_slider, value=-0.73, name="theta_single_arc")

theta_slider2 = alt.binding_range(min=-2 * np.pi, max=2 * np.pi)
theta2_var = alt.param(bind=theta_slider, value=0.73, name="theta2_single_arc")

corner_slider = alt.binding_range(min=0, max=50, step=1)
corner_var = alt.param(bind=corner_slider, value=0, name="cornerRadius")

pad_slider = alt.binding_range(min=0, max=np.pi / 2)
pad_var = alt.param(bind=pad_slider, value=0, name="padAngle")

source = pd.DataFrame({"category": [1, 2, 3, 4, 5, 6], "value": [4, 6, 10, 3, 7, 8]})

c1 = alt.Chart(source, title="Single Arc").mark_arc(
    radius=rad_var,
    radius2=rad_var2,
    theta=theta_var,
    theta2=theta2_var,
    cornerRadius=corner_var,
    padAngle=pad_var,
)

c2 = (
    alt.Chart(source, title="Stacked Arcs")
    .mark_arc(
        radius=rad_var,
        radius2=rad_var2,
        cornerRadius=corner_var,
        padAngle=pad_var,
    )
    .encode(
        theta=alt.Theta(field="value", type="quantitative"),
        color=alt.Color(field="category", type="nominal"),
    )
)

alt.hconcat(c1.properties(width=200), c2.properties(width=200)).add_params(
    rad_var, rad_var2, theta_var, theta2_var, corner_var, pad_var
)

一个 arc 标记定义可以包含任何标准标记属性和以下特殊属性

点击显示表格

属性

类型

描述

radius

anyOf(number, ExprRef)

对于弧形标记,主(外)半径(以像素为单位)。

对于文本标记,文本相对于由 xy 属性确定的原点的极坐标径向偏移(以像素为单位)。

默认值: min(plot_width, plot_height)/2

radius2

anyOf(number, ExprRef)

弧形标记的次(内)半径(以像素为单位)。

默认值: 0

innerRadius

anyOf(number, ExprRef)

弧形标记的内半径(以像素为单位)。innerRadiusradius2 的别名。

默认值: 0

outerRadius

anyOf(number, ExprRef)

弧形标记的外半径(以像素为单位)。outerRadiusradius 的别名。

默认值: 0

theta

anyOf(number, ExprRef)

  • 对于弧形标记,如果未指定 theta2,则为弧长(以弧度为单位),否则为起始弧角。(值为 0 表示向上或“北”,数值增加时按顺时针方向进行。)

  • 对于文本标记,为极坐标角度(以弧度为单位)。

theta2

anyOf(number, ExprRef)

弧形标记的结束角度(以弧度为单位)。值为 0 表示向上或“北”,数值增加时按顺时针方向进行。

cornerRadius

anyOf(number, ExprRef)

圆角矩形或圆弧角的半径(以像素为单位)。

默认值: 0

padAngle

anyOf(number, ExprRef)

应用于弧形侧面的角度填充(以弧度为单位)。

radiusOffset

anyOf(number, ExprRef)

radius 的偏移量。

radius2Offset

anyOf(number, ExprRef)

radius2 的偏移量。

thetaOffset

anyOf(number, ExprRef)

theta 的偏移量。

theta2Offset

anyOf(number, ExprRef)

theta2 的偏移量。

示例#

我们可以通过编码 thetacolor 弧形标记来创建饼图。

import pandas as pd
import altair as alt

source = pd.DataFrame({"category": [1, 2, 3, 4, 5, 6], "value": [4, 6, 10, 3, 7, 8]})

alt.Chart(source).mark_arc().encode(
    theta=alt.Theta(field="value", type="quantitative"),
    color=alt.Color(field="category", type="nominal"),
)

innerRadius 设置为非零值将创建甜甜圈图。

import pandas as pd
import altair as alt

source = pd.DataFrame({"category": [1, 2, 3, 4, 5, 6], "value": [4, 6, 10, 3, 7, 8]})

alt.Chart(source).mark_arc(innerRadius=50).encode(
    theta=alt.Theta(field="value", type="quantitative"),
    color=alt.Color(field="category", type="nominal"),
)

您还可以添加文本层以为饼图添加标签。

import pandas as pd
import altair as alt

source = pd.DataFrame(
    {"category": ["a", "b", "c", "d", "e", "f"], "value": [4, 6, 10, 3, 7, 8]}
)

base = alt.Chart(source).encode(
    theta=alt.Theta("value:Q").stack(True),
    color=alt.Color("category:N").legend(None),
)

pie = base.mark_arc(outerRadius=120)
text = base.mark_text(radius=140, size=20).encode(
    text="category:N"
)

pie + text