Создание гистограммы в 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]