Vincent du Sordet

Kibana:如何使用神奇公式创建引人注目的可视化效果?(第一部分)

我们将了解 Kibana Lens 编辑器中的神奇数学公式如何帮助突出显示高值。

14 分钟阅读
Kibana: How to create impactful visualisations with magic formulas ? (part 1)

Kibana:如何使用神奇公式创建引人注目的可视化效果?(第一部分)

简介

在之前的博客文章《作为非设计师设计直观的 Kibana 仪表板》中,我们强调了创建直观仪表板的重要性。它展示了简单的更改(分组主题、更改图表类型等)如何对理解数据产生影响。在提供诸如《使用 Kibana 进行数据分析》《Elastic Observability Engineer》课程时,我们强调了这篇博客文章以及这些更改如何帮助将基本信息呈现出来。我喜欢一种实现此目标的补充方法:使用两种颜色将最高数据值与普通值分开。

为了说明这个想法,我们将使用 *示例航班数据* 数据集。现在,让我们比较两个可视化效果,它们按航班总数对前 10 个目的地国家/地区进行排名。哪个可视化效果的影响更大?

如果您选择了第二个,您可能想知道这是如何使用 Kibana Lens 编辑器完成的。在去年准备认证期间,我找到了一种实现此结果的方法。秘诀是使用两个不同的图层和一些神奇的公式。本文将解释 Lens 公式中的数学如何帮助创建两种数据颜色可视化效果。

我们将从第一个示例开始,该示例仅强调我们关注的数据集的最高值。第二个示例描述了如何突出显示其他高值(如上图所示)。

[注意:本博客文章中解释的技巧可以从 v 7.15 应用]

仅最高值

为了理解数学如何帮助将高值与普通值分开,让我们从第一个示例开始:仅强调最高值。

我们从一个水平条形图开始

我们需要确定我们当前正在检查的范围的最高值。我们将使用一个适当的 overall_* 函数:**overall_max()**,一个管道函数(等效于 Query DSL 中的管道聚合)。

在我们的示例中,我们按国家/地区(目的地)对航班进行分组。这意味着我们计算每个 DestCountry 的航班数(= 1 个桶)。**overall_max()** 将选择哪个桶具有最高值。

这里的数学技巧是将每个桶的航班数除以所有桶中找到的最大值。只有一个桶将返回 1:与 overall_max() 找到的最大值匹配的桶。所有其他桶将返回一个小于 1 且大于 0 的值。我们使用 **floor()** 来确保任何 0.xxx 值都四舍五入为 0。

现在,我们可以将其乘以 count(),我们就有了第一个图层的公式!

图层 1:

count()*floor(count()/overall_max(count()))

从这里开始,在 Lens 编辑器中,我们复制该图层以调整第二个图层的公式,该图层包含其余数据。我们需要在公式中附加另一个 count(),然后附加减号运算符。这是另一个技巧。在此图层中,我们只需要确保不表示最高值,这只会发生一次。当我们除以它们时,count() = overall_max(),即 = 1。

图层 2:

count() - count()*floor(count()/overall_max(count()))

为了实现这两个图层的完美融合,我们需要在两者中进行以下调整

  • 选择 **水平堆叠条形图**

  • 纵轴:将“按等级排序”更改为“自定义”,并确保等级函数为“计数”

这是两个图层的最终设置

图层 1:

count()*floor(count()/overall_max(count()))

图层 2:

count() - count()*floor(count()/overall_max(count()))

此可视化效果也适用于时间序列数据,您需要快速突出显示哪个时间段(以下示例中为 12 小时)的航班数量最多

突出显示

在先前工作的基础上,我们可以扩展该方法,以使其他高值突出显示。让我们看看我们使用哪个公式在介绍中创建了可视化效果

对于此可视化效果,我们使用了 **round()** 函数的属性。此函数仅引入大于最高值 50% 的值。

让我们复制第一个可视化效果,并将 floor() 函数替换为 round()。

图层 1:

count()*round(count()/overall_max(count()))

图层 2:

count() - count()*round(count()/overall_max(count()))

这是一个简单的修复。
如果我们想通过添加更多高值来进一步扩展第一个图层,该怎么办?
例如,我们希望所有值都高于平均值。

为此,我们使用 **overall_average**() 作为新的参考值,而不是 overall_max() 参考,以分隔图层 1 中的合格值。

由于我们正在与所有桶中的平均值进行比较,因此除法运算可能会返回大于 1 的值。

在这里,**clamp**() 函数很好地解决了这个问题。

根据公式参考,clamp()“将值限制在最小值到最大值之间”。结合 clamp() 和 floor(),可以确保只有两个可能的输出值:作为参数给出的最小值 ( 0 ) 或最大值 ( 1 )。

应用于我们的航班数据集,它会突出显示航班量多于平均值的目的地国家/地区

图层 1:

count()*clamp(floor(count()/overall_average(count())),0,1)

图层 2:

count() - count()*clamp(floor(count()/overall_average(count())),0,1)

它还为使用其他动态参考打开了选项。例如,我们可以将所有大于最高值 60% 的值置于突出显示之上( >

0.6*overall_max(count())
)。我们可以按如下方式调整我们的公式:


count()*clamp(floor(count()/(0.6*overall_max(count()) ) ),0,1)

结论

在第一部分中,我们看到了允许我们创建双色直方图的主要技巧

  • 两个图层:一个用于最高值,另一个用于剩余值

  • 可视化类型:水平/垂直**堆叠**条形图

  • 为了分离数据,我们使用一个公式,其中只有最高值返回 1,否则返回 0

 

然后在第二部分中,我们看到了如何扩展此原则以使更多高值突出显示。此方法可以总结如下

  • 从关注高值的图层 1 开始:count()*<返回 0 或 1 的公式>

  • 复制图层并调整公式
    ( count() - count()*<返回 0 或 1 的公式>)

最后,我们提供了 4 个通用公式,可随时使用来为您的仪表板增添趣味

1. 仅最高值
图层 1
count()*floor(count()/overall_max(count()))
图层 2
count() - count()*floor(count()/overall_max(count()))
2.1. 突出显示:高值(高于最大值的 50%)
图层 1
count()*floor(count()/overall_max(count()))
图层 2
count() - count()*floor(count()/overall_max(count()))
2.2. 突出显示:所有高于总体平均值的值
图层 1
count()*clamp(floor(count()/overall_average(count())),0,1)
图层 2
count() - count()*clamp(floor(count()/overall_average(count())),0,1)
2.2. 突出显示:所有大于最高值 60% 的值
图层 1
count()*clamp(floor(count()/(0.6*overall_max(count()) ) ),0,1)
图层 2
count() - count()*clamp(floor(count()/(0.6*overall_max(count()) ) ),0,1)

您可以亲自尝试这些示例,方法是注册Elastic Cloud 的免费试用版,或免费下载Elastic Stack 的自托管版本。如果您在入门方面有其他问题,请访问Kibana 论坛或查阅Kibana 文档指南
在下一篇博文中,我们将了解新函数 ifelse()(在 8.6 版本中引入)如何极大地简化使用更高级公式创建可视化的过程。

参考资料:

分享这篇文章