Гистограммы
Доступ к одномерным гистограммам осуществляется с помощью функции histogram
и ее изменяемого варианта histogram!
. На этой странице мы будем использовать бэкенд GR по умолчанию.
В самом простом виде гистограмма представляет собой вектор случайных чисел, отобранных из нормированного распределения единиц.
using Plots
x = randn(10^3)
histogram(x)
Количество столбцов по умолчанию определяется правилом Фридмана-Диакониса. Выбрать другие алгоритмы столбцов можно с помощью атрибута bins
, который может принимать значения типа :sqrt
или :scott
для правила Скотта. В качестве альтернативы можно передать диапазон для более точного управления количеством столбцов, их минимумом и максимумом. Например, чтобы построить 20 столбцов от --5 до +5, введите
range(-5, 5, length=21)
где к длине нужно прибавить 1, так как в длине учитывается количество границ столбцов. Наконец, можно передать и целое число, например bins=15
, но это будет лишь приближенное значение, а реальное количество столбцов может отличаться.
Нормализация
Часто желательно каким-либо образом нормализовать гистограмму. Для этого используется атрибут normalize
, и мы хотим, чтобы normalize=:pdf
(или :true
) нормализовал общую площадь столбцов к 1. Поскольку мы сделали выборку из нормализованного распределения, можно построить и его график. Конечно, можно изменить и другие общие атрибуты, такие как название, надписи осей и цвета.
p(x) = 1/sqrt(2pi) * exp(-x^2/2)
b_range = range(-5, 5, length=21)
histogram(x, label="Experimental", bins=b_range, normalize=:pdf, color=:gray)
plot!(p, label="Analytical", lw=3, color=:red)
xlims!(-5, 5)
ylims!(0, 0.4)
title!("Normal distribution, 1000 samples")
xlabel!("x")
ylabel!("P(x)")
normalize
может принимать другие значения, в том числе:
-
:probability
, которое суммирует все высоты столбцов до 1 -
:density
, которое делает площадь каждого столбца равной количеству
Взвешенные гистограммы
Другой распространенной возможностью является взвешивание значений в x
. Предположим, что x
состоит из данных, отобранных из равномерного распределения, и мы хотим взвесить значения в соответствии с экспоненциальной функцией. Мы должны передать вектор весов той же длины, что и x
. Чтобы проверить правильность взвешивания, построим график экспоненциальной функции, умноженной на коэффициент нормализации.
f_exp(x) = exp(x)/(exp(1)-1)
x = rand(10^4)
w = exp.(x)
histogram(x, label="Experimental", bins=:scott, weights=w, normalize=:pdf, color=:gray)
plot!(f_exp, label="Analytical", lw=3, color=:red)
plot!(legend=:topleft)
xlims!(0, 1.0)
ylims!(0, 1.6)
title!("Uniform distribution, weighted by exp(x)")
xlabel!("x")
ylabel!("P(x)")
Другие разновидности
-
С помощью
scatterhist
иscatterhist!
можно строить гистограммы рассеяния, где вместо столбцов используются точки. -
С помощью
stephist
иstephist!
можно строить гистограммы рассеяния, где вместо столбцов используются контуры.
p1 = histogram(x, title="Bar")
p2 = scatterhist(x, title="Scatter")
p3 = stephist(x, title="Step")
plot(p1, p2, p3, layout=(1, 3), legend=false)
Обратите внимание, что ось Y гистограммы рассеяния по умолчанию не будет начинаться с 0.
Двухмерные гистограммы
Доступ к двухмерным гистограммам осуществляется с помощью функции histogram2d
и ее изменяемого варианта histogram2d!
. Для их построения требуются два вектора x
и y
одинаковой длины.
Гистограмма строится в двух проекциях в виде тепловой карты, а не в виде трехмерных столбцов. По умолчанию используется цветовая карта :inferno
, как и для контурных графиков и тепловых карт. По умолчанию столбцы без количества вообще не строятся.
x = randn(10^4)
y = randn(10^4)
histogram2d(x, y)
Такие вещи, как пользовательские количества столбцов, веса и нормализация, работают в двух проекциях, равно как и изменение таких параметров, как цветовая карта. Однако количество столбцов должно передаваться в виде кортежей. Если, например, для столбцов передано только одно число, то предполагается, что обе оси зададут одинаковое количество столбцов. Кроме того, веса принимают только единичный вектор для значений x
.
Полное отсутствие построенных столбцов может оказаться визуально непривлекательным, особенно если используется цветовая карта с темными цветами на нижнем конце. Чтобы исправить это, используйте атрибут show_empty_bins=true
.
w = exp.(x)
histogram2d(x, y, bins=(40, 20), show_empty_bins=true,
normalize=:pdf, weights=w, color=:plasma)
title!("Normalized 2D Histogram")
xlabel!("x")
ylabel!("y")