【问题标题】:Histogram using Excel FREQUENCY function使用 Excel FREQUENCY 函数的直方图
【发布时间】:2012-03-23 17:12:04
【问题描述】:

在 Excel 2010 中,我在列 A 中有一个值列表,并且在 B1 中指定了 bin 大小。这使我可以使用以下公式创建具有 N 个 bin 的直方图:

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

唯一的问题是我需要选择 N 个单元格并应用此公式来获取 N 个 bin 用作我的条形图的数据源。可以跳过这一步吗?例如。是否可以在单个单元格中使用此公式(稍作修改),以便在用作数据源时,将其解释为 N 个单元格,从而生成具有 N 个值的漂亮直方图?

谢谢。

Here's the answer that led me to the formula above.

【问题讨论】:

    标签: excel histogram frequency


    【解决方案1】:

    (这与宏驱动的动态范围调整大小的方法完全不同,所以我使用了一个单独的答案......)

    可以通过记住“命名范围”实际上命名为公式来构建动态直方图,因此它们的值可能是动态的,在某些情况下尤其如此。

    让我们假设我们在 A 列中有一组任意值,从第 1 行开始,并且我们还有另一个单元格,其中包含我们想要在直方图中的 bin 数量。在我的工作簿中恰好是 E2。所以我们启动名称管理器(在“公式”选项卡上)并创建

    num_bins             =Sheet1!$E$2
    

    我已经开始定义多个 bin,而不是 bin 大小(我们将在后面定义),因为后者使得准确地知道如何设置 bin 边界变得很棘手:我们对这个想法感到满意吗第一个和最后一个 bin 可以覆盖值范围的不同大小的部分,例如?*

    我们还可以设置动态公式来描述我们的数据:

    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-size 范围的行号来生成bin_size 的倍数。它不会从min_val 开始数组,因为FREQUENCY() 函数将项目计数到每个bin 值。它比所需的 bin 数量小一,因为该函数会生成一个更大的数组,其中最终条目的点 高于 最高 bin 编号。因此,我们制作了一个单独的 bin_labels 数组用于演示目的。

    现在我们可以制作图表了。插入(例如)二维柱形图并打开“选择数据”对话框(从功能区或右键单击图表)。添加一个新系列,将系列值设置为=Sheet1!freq_array。必须包含工作表名称或工作簿名称才能使其正常工作。如果您愿意,请添加系列名称,然后单击“确定”。现在点击“水平(类别)轴标签”的“编辑”并将范围设置为=Sheet1!bin_labels

    这里有 2000 个单元格,带有 =RAND()*5 和 5 个 bin(我列出了名称和它们的公式,以及它们不生成数组的值)

    以及将 num_bins 更改为 10 后的同一张表。(RAND() 公式重新计算,因此这些 bin 加起来可能不会得到完全相同的值)

    • (如果您必须有用户定义的 bin 大小,则需要将 bin_size 设为工作表引用并使用命名公式计算 num_bins

    【讨论】:

    • 现在这是一个绝妙的答案。谢谢! :)
    • 小修正:第二个data_vals 应该重命名以避免名称冲突。
    【解决方案2】:

    我能想到的唯一答案是使用宏来调整公式的输出范围。

    这里有一个简单的 sn-p 来说明这个想法。

    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
    

    我去年写过关于 a more complete implementation 的文章——更容错、二维输出等

    编辑:但是...您使用的公式不适用于这种方法:它依赖于输入时已知的输出范围大小。这是一个可以自动调整大小的替代建议:

    我们可以用这样的东西创建一组可行的垃圾箱:

    ={(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 以获得一组从零开始的值)并乘以我们的 bin 大小。您可能想要改变值的范围(例如,通过添加 MIN(A:A))。

    最大的区别在于,此公式不需要跨范围输入,Evaluate() VBA 函数就能产生范围输出。

    要获取直方图,请将 bin 公式的输出插入 FREQUENCY() 或放入整个公式。无论哪种方式,自动调整大小都应该起作用。

    如果您特别反对运行宏(我通过自定义功能区按钮和热键组合提供它),那么您可以使用Worksheet_Change 事件来寻找应用它的机会。我不能确定这是否会产生任何令人不快的副作用。

    【讨论】:

    • 我想创建一个动态直方图,可以通过更改单个常量(bin 大小)轻松更改该直方图。我什至可以禁用 UI 交互(我正在使用 Excel 自动化创建直方图)。
    • 通过“直方图”,所需的输出是工作表上的图表还是数组?如果是图表,整个事情都可以用命名公式来完成。否则,您将需要如上所述的范围调整功能或为范围设置最大大小并使您的数组变大。
    • 图表可以,只要在 bin 大小更改时更新图表即可。我尝试过使用命名公式,但不断出错......以前从未做过这些事情:P
    猜你喜欢
    • 1970-01-01
    • 2019-08-22
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 2023-03-12
    相关资源
    最近更新 更多