Полосовая диаграмма со случайным смещением
Столбец Major Genre набора movies кодируется каналом y. В обычном представлении точки сильно перекрывались бы, затрудняя сравнение частот разных значений. Для решения используется канал yOffset со случайным смещением, или jitter. Слева смещение имеет нормальное распределение, справа — равномерное.
import altair as alt
from altair.datasets import data
source = data.movies.url
gaussian_jitter = alt.Chart(source, title='Normally distributed jitter').mark_circle(size=8).encode(
y="Major Genre:N",
x="IMDB Rating:Q",
yOffset="jitter:Q",
color=alt.Color('Major Genre:N').legend(None)
).transform_calculate(
# Generate Gaussian jitter with a Box-Muller transform
jitter="sqrt(-2*log(random()))*cos(2*PI*random())"
)
uniform_jitter = gaussian_jitter.transform_calculate(
# Generate uniform jitter
jitter='random()'
).encode(
alt.Y('Major Genre:N').axis(None)
).properties(
title='Uniformly distributed jitter'
)
(gaussian_jitter | uniform_jitter).resolve_scale(yOffset='independent')
import altair as alt
from altair.datasets import data
source = data.movies.url
gaussian_jitter = alt.Chart(source, title='Normally distributed jitter').mark_circle(size=8).encode(
y="Major Genre:N",
x="IMDB Rating:Q",
yOffset="jitter:Q",
color=alt.Color('Major Genre:N', legend=None)
).transform_calculate(
# Generate Gaussian jitter with a Box-Muller transform
jitter="sqrt(-2*log(random()))*cos(2*PI*random())"
)
uniform_jitter = gaussian_jitter.transform_calculate(
# Generate uniform jitter
jitter='random()'
).encode(
y=alt.Y('Major Genre:N', axis=None)
).properties(
title='Uniformly distributed jitter'
)
(gaussian_jitter | uniform_jitter).resolve_scale(yOffset='independent')
Подробнее в связанных разделах документации: