Гистограмма с использованием функции ЧАСТОТА Excel - PullRequest
2 голосов
/ 06 марта 2012

В Excel 2010 у меня есть список значений в столбце A, а размер ячейки указан в B1. Это позволяет мне создавать гистограммы с N бинами по следующей формуле:

{=FREQUENCY(A:A,(ROW(INDIRECT("1:"&CEILING((MAX(A:A)-MIN(A:A))/B1,1)))-1)*B1+MIN(A:A))}

Единственная проблема заключается в том, что мне нужно выбрать N ячеек и применить эту формулу, чтобы получить N ячеек, которые будут использоваться в качестве источника данных для моей гистограммы. Можно ли пропустить этот шаг? Например. Можно ли использовать эту формулу в одной ячейке - несколько измененной - чтобы при использовании в качестве источника данных она интерпретировалась как N ячеек, создавая красивую гистограмму с N значениями?

Спасибо.

Вот ответ, который привел меня к формуле выше.

Ответы [ 2 ]

7 голосов
/ 07 марта 2012

(Это довольно сильно отличается от метода изменения размера динамического диапазона, управляемого макросом, поэтому я использую отдельный ответ ...)

Диаграмма динамической гистограммы можетбыть построенным, помня, что «именованные диапазоны» на самом деле именуются формулами , поэтому их значения могут быть динамическими, а в некоторых случаях чрезвычайно.

Давайте начнем с предположения, что у нас есть произвольный наборзначений в столбце A, начиная с строки 1, а также о том, что у нас есть еще одна ячейка, которая содержит количество бинов, которые мы хотим видеть в нашей гистограмме.В моей книге это E2.Таким образом, мы запускаем Диспетчер имен (на вкладке «Формулы») и создаем

num_bins             =Sheet1!$E$2

Я решил определить количество бинов, а не размер бина (который мы определим позже)потому что последнее затрудняет точное определение границ наших бинов: довольны ли мы тем, что первый и последний бины могут охватывать части диапазона значений разных размеров, например? *

Мы также можем настроить динамические формулы для описания наших данных:

data_count           =COUNT(Sheet1!$A:$A)
data_vals            =OFFSET(Sheet1!$A$1,0,0,data_count,1)
max_val              =MAX(data_vals)
min_val              =MIN(data_vals)

Определив их, мы можем получить фантазию.Насколько большим должен быть каждый контейнер?Создайте еще одну именованную формулу:

bin_size             =(max_val-min_val)/(num_bins)

И вот идет наука: эти формулы создают динамические массивы:

bin_array            =min_val+ROW(OFFSET(Sheet1!$A$1,0,0,num_bins-1,1))*bin_size
bin_labels           =min_val+ROW(OFFSET(Sheet1!$A$1,0,0,num_bins,1))*bin_size        
data_vals            =FREQUENCY(data_vals,bin_array)

Первый способ сложнее: он использует номера строкnum_bins minus one -размерный диапазон для генерации кратного bin_size.Массив не начинается с min_val, потому что функция FREQUENCY() считает элементы до каждого значения бина.Это на единицу меньше желаемого количества бинов, потому что функция создает массив на один больше, где конечная запись имеет точки выше самого высокого номера бина.Поэтому мы создаем отдельный массив bin_labels для презентаций.

Теперь мы можем создать диаграмму.Вставьте (скажем) двумерную диаграмму столбца и откройте диалоговое окно «Выбор данных» (с ленты или щелкнув правой кнопкой мыши диаграмму).Добавьте новую серию, установив значения серии в =Sheet1!freq_array.Чтобы это работало, необходимо указать либо имя листа, либо имя книги.Добавьте название серии, если хотите, и нажмите «ОК».Теперь нажмите «Изменить» для «Метки горизонтальной (категории) оси» и установите диапазон на =Sheet1!bin_labels.

. Здесь 2000 ячеек с =RAND()*5 и 5 ячейками (я перечислил имена и их формулы со значениямигде они не производят массивы)

image=RAND()*5 results into 5 bins">

И тот же лист после изменения num_bins на 10. (Формулы RAND() пересчитаны, поэтому ящики могут не составлять в точностите же значения)

After changing num_bins to 10

  • (если вам нужен пользовательский размер ячейки, вам нужно сделать bin_size ссылкой на лист ирассчитать num_bins по названной формуле)
0 голосов
/ 06 марта 2012

Единственный ответ, который я могу придумать, - использовать макрос, чтобы изменить размер выходного диапазона вашей формулы.

Вот простой фрагмент, иллюстрирующий эту идею.

Dim result As Variant
Dim targetCols As Long

result = Evaluate(fmla)
With rng
  targetCols = UBound(result, 1) - LBound(result, 1) + 1
  .Resize(1, targetCols).FormulaArray = fmla
End With

Я писал о более полной реализации в прошлом году - более устойчивые к ошибкам, двумерные выходные данные и т. Д.

EDIT: Однако ... Формула, которую вы используете, не будет работать с этим подходом: она зависит от размера выходного диапазона, известного на входе. Вот альтернативное предложение, которое может быть автоматически изменено:

Мы можем создать набор выполнимых корзин с чем-то вроде этого:

={(ROW(OFFSET(A1,0,0,CEILING((MAX(A:A)-MIN(A:A))/B1,1)+1,1))-1)*B1}

где, как и прежде, это количество ячеек

CEILING((MAX(A:A)-MIN(A:A))/B1,1)+1

, который мы затем используем для создания диапазона, используя OFFSET() (цель не имеет значения, поскольку мы не используем ее значения). Затем мы берем ROW() каждой ячейки в диапазоне (вычитая 1, чтобы получить набор значений, начинающихся с нуля) и умножаем на размер нашего бина. Вы можете изменить диапазон значений (например, добавив MIN(A:A)).

Большим отличием является то, что эту формулу не нужно вводить по всему диапазону, чтобы функция Evaluate() VBA могла выводить диапазон.

Чтобы получить гистограмму, либо подключите вывод формулы bin в FREQUENCY(), либо добавьте всю формулу целиком. Автоматическое изменение размера должно работать в любом случае.

Если вы были особенно против запуска макроса (у меня он доступен через пользовательскую кнопку на ленте и комбинацию горячих клавиш), вы можете использовать событие Worksheet_Change, чтобы отслеживать возможности его применения. Я не могу точно сказать, будут ли это иметь неприятные побочные эффекты.

...