Создание гистограммы в Ruby
Как создать гистограмму конкретной информации? У меня есть массив данных, например:
data = [0,1,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,5,5,6,6,6,7,7,7,7,7,8,9,9,10]
Я хочу создать гистограмму, основанную на количестве записей для 0
, 1
, 2
и т.д. Есть ли простой способ сделать это в Ruby?
Выход должен быть в ячейках и частотах в виде массивов.
Ответы
Ответ 1
Используйте этот камень - http://rubygems.org/gems/histogram
data = [0,1,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,5,5,6,6,6,7,7,7,7,7,8,9,9,10]
(bins, freqs) = data.histogram
Это создаст массив bins
, содержащий ячейки гистограммы и массив freqs
, содержащий частоты.
Драгоценный камень также поддерживает различные поведения биннинга и веса/фракции.
Надеюсь, что это поможет.
Ответ 2
Ruby Array наследует group_by
от Enumerable, что делает это красиво:
Hash[*data.group_by{ |v| v }.flat_map{ |k, v| [k, v.size] }]
Что возвращает:
{
0 => 1,
1 => 1,
2 => 5,
3 => 6,
4 => 4,
5 => 2,
6 => 3,
7 => 5,
8 => 1,
9 => 2,
10 => 1
}
Это просто хороший чистый хэш. Если вам нужен массив каждой пары бинов и частот, вы можете сократить его и использовать:
data = [0,1,2,2,3,3,3,4]
data.group_by{ |v| v }.map{ |k, v| [k, v.size] }
# => [[0, 1], [1, 1], [2, 2], [3, 3], [4, 1]]
Здесь код и group_by
работают с меньшим набором данных:
data.group_by{ |v| v }
# => {0=>[0], 1=>[1], 2=>[2, 2], 3=>[3, 3, 3], 4=>[4]}
data.group_by{ |v| v }.flat_map{ |k, v| [k, v.size] }
# => [0, 1, 1, 1, 2, 2, 3, 3, 4, 1]