密度#

密度转换对输入数据执行一维核密度估计,并生成一个新列,其中包含估计密度的样本。

这里是一个简单的示例,展示了来自电影数据集的 IMDB 评分分布

import altair as alt
from vega_datasets import data

alt.Chart(data.movies.url).transform_density(
    'IMDB_Rating',
    as_=['IMDB_Rating', 'density'],
).mark_area().encode(
    x="IMDB_Rating:Q",
    y='density:Q',
)

密度也可以按组计算,通过指定 groupby 参数。这里我们将上述密度计算按电影类型划分

import altair as alt
from vega_datasets import data

alt.Chart(
    data.movies.url,
    width=120,
    height=80
).transform_filter(
    'isValid(datum.Major_Genre)'
).transform_density(
    'IMDB_Rating',
    groupby=['Major_Genre'],
    as_=['IMDB_Rating', 'density'],
    extent=[1, 10],
).mark_area().encode(
    x="IMDB_Rating:Q",
    y='density:Q',
).facet(
    'Major_Genre:N',
    columns=4
)

转换选项#

transform_density() 方法基于 DensityTransform 类构建,该类具有以下选项

点击显示表格

属性

类型

描述

as

数组(FieldName)

样本值和相应密度估计的输出字段。

默认值: ["value", "density"]

bandwidth

数字

高斯核的带宽(标准差)。如果未指定或设置为零,将使用 Scott 规则从输入数据中自动估计带宽值。

counts

布尔值

一个布尔标志,指示输出值应该是概率估计(false)还是平滑计数(true)。

默认值: false

cumulative

布尔值

一个布尔标志,指示是生成密度估计(false)还是累积密度估计(true)。

默认值: false

density

字段名

执行密度估计的数据字段。

extent

数组(数字)

一个 [min, max] 范围,用于采样分布。如果未指定,则范围将由密度值字段的观察最小值和最大值决定。

groupby

数组(FieldName)

用于分组的数据字段。如果未指定,将使用包含所有数据对象的单个组。

maxsteps

数字

沿范围域采样以绘制密度的最大样本数。

默认值: 200

minsteps

数字

沿范围域采样以绘制密度的最小样本数。

默认值: 25

resolve

[‘independent’, ‘shared’]

指示如何解析多个密度的参数。如果为 "independent",则每个密度可以有自己的范围域和动态的曲线采样步数。如果为 "shared",KDE 转换将确保所有密度都在共享的域和曲线步数上定义,从而实现堆叠。

默认值: "shared"

steps

数字

沿范围域采样的精确样本数,用于绘制密度。如果指定,将覆盖 minsteps 和 maxsteps,设定精确的均匀样本数。与固定范围结合使用时可能很有用,以确保堆叠密度的样本点一致。