数据可视化技术:棒棒糖图的绘制与优化

随着时间的推移,数据可视化技术也在不断进化。近期,出现了比以往任何时候都要优秀的可视化技术。每天,人们都在发明自己的可视化方法,其终极目标是:提升数据背后的故事性。毫无疑问,高级数据可视化技术需要更多的技能和努力,但这些图表总是值得投入的。得益于人脑的发展,以前需要多行代码实现的功能,现在可以通过一行函数调用来完成。这最好地解释了说法:数据可视化技术随着时间而进化。

目录

  • 什么是棒棒糖图?
  • 如何在Python中绘制棒棒糖图?
  • 优化棒棒糖图
  • 条形图与棒棒糖图的比较
  • 结论

什么是棒棒糖图?

棒棒糖图由一个条形和一个顶部的圆圈组成,类似于顶部有糖果的棒棒糖。这种图表用于比较不同类别的类别,因此它是可视化类别间比较的一个强大工具。但是,它与条形图有何不同呢?首先,当顶部有一个填充圆圈时,它使得识别值变得更容易。其次,当有超过10个类别时,条形图会变得杂乱无章,对于最终用户来说难以阅读。而棒棒糖图使用细条形,从而为更多类别提供了更大的空间。同样,可以在类别数量多时水平绘制棒棒糖图。

棒棒糖图也用于显示类别间的排名。例如,如果想根据燃油里程比较20种不同的汽车型号,棒棒糖图在这种情况下可以高效地完成任务并提供最小的图表。

如何在Python中绘制棒棒糖图?

棒棒糖图可以使用Python中的Matplotlib库高效绘制。Matplotlib库提供了一个方便的函数.stem(),专门用于构建棒棒糖图。让看看它是如何工作的。

import matplotlib.pyplot as plt import numpy as np x = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'] y = np.linspace(1, (np.log(0.2 * np.pi)), 10) plt.stem(x, y, use_line_collection=True) plt.show()

plt.stem()中,设置了参数use_line_collection为True。这将在图表中添加单独的线条作为LineCollection。如果不指定这个参数,它将给出一个用户警告,并提醒设置这个参数为True。这提高了茎叶图的性能。

Python代码:

Basic Lollipop Chart (Source – PC)

优化棒棒糖图

通过向.stem()添加参数,可以提高棒棒糖图的可读性和数据描述能力。以下是一些可以进行的改进:

import matplotlib.pyplot as plt import numpy as np x = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'] y = np.linspace(1, (np.log(0.2 * np.pi)), 10) plt.stem(x, y, markerfmt='s', linefmt='--', basefmt=':', use_line_collection=True) plt.show()

执行此代码后,得到:

带有额外参数的棒棒糖图(来源 – 个人电脑)

在这里,进行了三项修改:

  • 标记格式 – 指定了markerfmt='s',这将棒棒糖图的填充圆圈替换为正方形(s指的是正方形)。
  • 线条格式 – 指定了linefmt='--',这将棒棒糖图的茎替换为双划线。(--指的是双划线)
  • 基线格式 – 指定了basefmt=':',这将棒棒糖图的基线替换为冒号。
import matplotlib.pyplot as plt import numpy as np x = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'] y = list(np.linspace(1, (np.log(0.2 * np.pi)), 10)) y.sort() plt.stem(x, y, markerfmt='s', linefmt='--', basefmt=':', use_line_collection=True) plt.show()

执行此代码后,得到:

排序后的棒棒糖图(来源 – 个人电脑)

记住,这里硬编码了X标签。因此,X标签与任何值无关。这就是为什么在排序值时,标签保持在原位。

import matplotlib.pyplot as plt import numpy as np x = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'] y = list(np.linspace(1, (np.log(0.2 * np.pi)), 10)) y.sort() my_range = range(1, len(x) + 1) plt.hlines(y=x, xmin=0, xmax=y, color='skyblue') plt.plot(y, x, "o") plt.show()

执行此代码后,得到:

水平棒棒糖图(来源 – 个人电脑)

在这里,使用.hlines()方法绘制棒棒糖图的水平棒,使用.plot()方法绘制糖果,指定标记为“o”。

条形图与棒棒糖图的比较

让通过一个例子来比较条形图和棒棒糖图,以确定哪个更适合例子。在这里,将为水平条形图和水平棒棒糖图绘制子图,以便并排比较这两个图形。使用NumPy库生成随机数据。在Y轴上,使用了range()函数,并将每个标签转换为字符串。

import matplotlib.pyplot as plt import numpy as np x = list(map(str, range(1, 35))) y = list(np.random.random(34)) f, axs = plt.subplots(1, 2, figsize=(12, 6)) axs[0].barh(x, y) axs[1].hlines(y=x, xmin=0, xmax=y, color='skyblue') axs[1].plot(y, x, marker="o", linewidth=0) plt.show()

执行此代码后,得到:

比较水平条形图和水平棒棒糖图(来源 – 个人电脑)

因此,在水平棒棒糖图中读取数据比在水平条形图中更容易。人们可以轻松地对值进行排名并比较类别。此外,类别的更多类别可能会使类别轴变得杂乱无章。因此,人们不应该依赖于一种图表来解决问题。为问题绘制不同的图表并选择最佳图表是一个更明智的决定。

注意:在这里使用了NumPy随机的.random()方法。每次运行代码时,都会产生不同的值集。因此,每次运行代码时都会得到不同的图表。

在本文中,学习了如何在Python中构建基本的棒棒糖图。但这个话题并没有结束。人们可以对他们的棒棒糖图进行大量的修改。上面学到的是最基本的修改,可以用较少的努力完成。当今许多BI工具和编程语言都能够构建像棒棒糖图这样的高级可视化。事实上,matplotlib的.stem()方法受到了MATLAB的茎方法的启发。可以将棒棒糖图称为条形图的特例。还讨论了在构建棒棒糖图时必须避免的错误。人们可以尝试构建自己的棒棒糖图版本,因为人们总是通过尝试来学习。

在LinkedIn上与联系:。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485