Интервалы погрешностей — Error Bar

Интервал погрешности представляет диапазон количественных значений через сводные статистики и отображает его отрезком с необязательными концевыми чертами. В Altair он может агрегировать исходные данные или напрямую показывать уже агрегированные.

Для создания используйте mark_errorbar.

Свойства интервалов погрешностей

Определение errorbar поддерживает следующие свойства:

Нажмите, чтобы показать таблицу
СвойствоТипОписание
extentErrorBarExtent

Диапазон отрезка: "ci" — 95%-й доверительный интервал среднего, полученный бутстрэпом; "stderr" — стандартная ошибка вокруг среднего; "stdev" — стандартное отклонение вокруг среднего; "iqr" — от первого до третьего квартиля. По умолчанию: "stderr".

orientOrientation

Ориентация интервала погрешностей. Обычно определяется автоматически; при неоднозначности, когда это невозможно, можно задать явно.

coloranyOf(Color, Gradient, ExprRef)

Стандартный цвет. По умолчанию: ■ "#4682b4". Нельзя задавать в конфигурации стилей. Свойства fill и stroke имеют больший приоритет и переопределяют color.

opacitynumber

Непрозрачность примитива в диапазоне [0,1].

Кроме них, rule и ticks задают свойства примитивов отдельных частей интервала.

Агрегирование исходных данных

Если данные ещё не агрегированы, Altair агрегирует их согласно extent.

  1. Стандартная ошибка — вариант по умолчанию в Vega-Lite. Его можно явно задать через extent="stderr". Нижний и верхний отрезки показывают стандартную ошибку и по умолчанию отходят от среднего:
import altair as alt
from altair.datasets import data

source = data.barley()

error_bars = alt.Chart(source).mark_errorbar().encode(
    x=alt.X('yield:Q').scale(zero=False),
    y=alt.Y('variety:N')
)

points = alt.Chart(source).mark_point(
    filled=True,
    color="black",
).encode(
    x=alt.X("mean(yield)"),
    y=alt.Y("variety:N"),
)

error_bars + points
  1. Стандартное отклонение задаётся через extent="stdev". Нижний и верхний отрезки показывают стандартное отклонение и, как при стандартной ошибке, по умолчанию отходят от среднего:
import altair as alt
from altair.datasets import data

source = data.barley()

error_bars = alt.Chart(source).mark_errorbar(extent="stdev").encode(
    x=alt.X("yield:Q").scale(zero=False),
    y=alt.Y("variety:N"),
)

points = alt.Chart(source).mark_point(filled=True, color="black").encode(
    x=alt.X("mean(yield)"),
    y=alt.Y("variety:N"),
)

error_bars + points
  1. Межквартильный размах задаётся через extent="iqr". Отрезок идёт от первого до третьего квартиля:
import altair as alt
from altair.datasets import data

source = data.barley()

error_bars = alt.Chart(source).mark_errorbar(extent="iqr").encode(
    x=alt.X("yield:Q").scale(zero=False),
    y=alt.Y("variety:N"),
)

points = alt.Chart(source).mark_point(
    filled=True,
    color="black"
).encode(
    x=alt.X("mean(yield)"),
    y=alt.Y("variety:N"),
)

error_bars + points

Отображение агрегированных данных

  1. Данные содержат нижнюю и верхнюю границы. Можно непосредственно задать x и x2 либо y и y2, используя интервал как примитив с диапазоном:
import altair as alt
import pandas as pd

source = pd.DataFrame({
    "lower_yield": [23.1311, 23.9503, 24.7778, 21.7823],
    "upper_yield": [43.5522, 38.9775, 46.9167, 48.9732],
    "center": [32.4, 30.96667, 33.966665, 30.45],
    "variety": ["Glabron", "Manchuria", "No. 457", "No. 462"],
})

bar = alt.Chart(source).mark_errorbar().encode(
    alt.X("upper_yield:Q").scale(zero=False).title("yield"),
    alt.X2("lower_yield:Q"),
    alt.Y("variety:N"),
)

point = alt.Chart(source).mark_point(
    filled=True,
    color="black"
).encode(
    alt.X("center:Q"),
    alt.Y("variety:N")
)

point + bar
  1. Данные содержат центр и величины погрешности. Укажите x как центр, xError и xError2 как смещения от центра; либо используйте y, yError и yError2. Без x/yError2 погрешность симметрична:
import altair as alt
import pandas as pd

source = pd.DataFrame({
    "yield_error": [7.5522, 6.9775, 3.9167, 11.9732],
    "yield_center": [32.4, 30.96667, 33.966665, 30.45],
    "variety": ["Glabron", "Manchuria", "No. 457", "No. 462"],
})

bar = alt.Chart(source).mark_errorbar().encode(
    x=alt.X("yield_center:Q").scale(zero=False).title("yield"),
    xError=("yield_error:Q"),
    y=alt.Y("variety:N"),
)

point = alt.Chart(source).mark_point(
    filled=True,
    color="black"
).encode(
    alt.X("yield_center:Q"),
    alt.Y("variety:N"),
)

point + bar

Примечание: при заранее вычисленных асимметричных погрешностях одно из значений x/yError и x/yError2 должно быть положительным, а другое отрицательным.

Размерность и ориентация

Altair поддерживает одномерные и двумерные интервалы погрешностей.

Одномерный интервал показывает диапазон погрешности непрерывного поля. Ориентация автоматически определяется осью этого поля: например, поле по y создаёт вертикальный интервал:

import altair as alt
from altair.datasets import data

source = data.barley()

error_bars = alt.Chart(source).mark_errorbar().encode(
    alt.Y("yield:Q").scale(zero=False)
)

points = alt.Chart(source).mark_point(
    filled=True,
    color="black"
).encode(
    alt.Y("mean(yield)")
)

error_bars + points

Двумерные интервалы показывают погрешность непрерывного поля по категориям. Если непрерывное поле находится по x, интервалы горизонтальны; если по y — вертикальны:

import altair as alt
from altair.datasets import data

source = data.barley()

error_bars = alt.Chart(source).mark_errorbar(extent="stdev").encode(
    alt.Y("yield:Q").scale(zero=False),
    alt.X("variety:N"),
)

points = alt.Chart(source).mark_point(
    filled=True,
    color="black",
).encode(
    alt.Y("mean(yield)"),
    alt.X("variety:N"),
)

error_bars + points

Каналы цвета и непрозрачности

Внешний вид интервалов можно настроить каналами color и opacity. Здесь color равен alt.value("#4682b4"):

import altair as alt
from altair.datasets import data

source = data.barley()

error_bars = alt.Chart(source).mark_errorbar(ticks=True).encode(
    alt.X("yield:Q").scale(zero=False),
    alt.Y("variety:N"),
    color=alt.value("#4682b4"),
)

points = alt.Chart(source).mark_point(
    filled=True,
    color="black"
).encode(
    alt.X("mean(yield)"),
    alt.Y("variety:N"),
)

error_bars + points

Канал подсказки

Можно задать собственные подсказки, которые заменят стандартные:

import altair as alt
from altair.datasets import data

source = data.barley()

alt.Chart(source).mark_errorbar().encode(
    alt.X("yield:Q").scale(zero=False),
    alt.Y("variety:N"),
    tooltip="variety:N",
)