在全球化的商业活动中,每时每刻都在产生大量的数据。企业从这些数据中提取有用信息,以做出重要的商业决策。探索性数据分析可以帮助他们可视化当前市场状况,预测未来可能的趋势,了解客户对产品的期望,并采取适当的措施改进产品等。
数据可视化是创建一个视觉上吸引人的数据表示,能够快速讲述一个有趣的故事,同时足够简单,让所有读者都能理解。可以使用Python中的Pandas库通过其内置的绘图函数进行上述数据分析。但如果能够通过缩放或悬停等函数与图表互动,深入挖掘数据,岂不是更好?
交互式数据可视化允许用户立即修改图形图表上的元素,而无需更改后台代码。想象一下,正在与一个显示十年产品价格的图表互动。如果有一个滑块或下拉菜单可以选择特定年份或月份的价格,那么作为读者的将能够更快地从图表中获得洞察,而且不需要编辑代码。这正是交互式图表所提供的。
通过交互式图表,可以更好地理解数据背后的故事。这些图表允许放大有趣的变化,发现趋势和变化,以及找到变量之间的相关性和联系。所有这些都使得数据探索过程更有意义。
仪表板是讲述数据集中故事的视觉工具,允许用户快速理解大局。这些是不同图表的集合,以网格样式布局组合在一起,是故事的一部分。因此,可以说仪表板是呈现有价值洞察的常见方式。
使用Matplotlib和Seaborn创建的图表是静态图表,即用户不能在不更新代码并重新运行的情况下更新它们。因此,可以使用D3和chart.js等交互式图表库,但它们要求用户具备一些JavaScript知识。
目前,有两个流行的开源库用于构建交互式可视化——Bokeh和Plotly。在本文中,将使用Bokeh进行一个简单的教程。Bokeh是一个开源库,用于交互式可视化,使用HTML和JavaScript渲染图形。它是一个强大的EDA工具,也可以用来构建基于Web的仪表板和应用程序。
Bokeh支持折线图、饼图、条形图和堆叠条形图、直方图和散点图。数据源被转换为JSON文件,成为BokehJS(JavaScript库)的输入,这使得它能够渲染浏览器支持的交互式图表和可视化。
Bokeh库需要基本的JavaScript代码知识,以便编写自定义函数根据用户输入更新图表。对于这篇面向初学者的文章,使用了名为Pandas-Bokeh的库,它更易于新手使用,并且允许通过其对Pandas的后端支持来渲染相同的Bokeh图表。对于高级可视化,总是可以使用Bokeh库来定义自定义可视化。
首先,使用pip从PyPI安装库。
pip install pandas_bokeh
接下来,导入pandas和numpy库。记得在pandas_bokeh库之前导入这些。
import numpy as np
import pandas as pd
import pandas_bokeh
还需要以下命令在笔记本中显示输出图表。
# 在Jupyter/Colab笔记本中嵌入图表
pandas_bokeh.output_notebook()
要在单独的HTML中显示图表,使用此命令:
# 导出图表为HTML
pandas_bokeh.output_file(filename)
对于这个面向初学者的教程,使用NumPy库生成一个简单的随机数据集,并使用它来构建仪表板。
假设数据集包含来自4个传感器在12个月期间测量值的样本,每个值都有一个唯一的识别号码和一个与之相关的类别。这意味着总共有6个特征,即‘id’、‘month’、‘sensor_1’、‘sensor_2’、‘sensor_3’和‘category’。为了简单起见,只考虑15个样本或数据行。
要生成这个数据集,使用NumPy库的np.random函数如下。(NumPy官方文档链接:https://numpy.org/doc/stable/reference/random/generator.html)
然后将打印数据集的形状,并查看数据集的前5行。
# 生成随机数据集
df_random = pd.DataFrame(np.random.rand(15, 6), columns=['id', 'month', 'sensor_1', 'sensor_2', 'sensor_3', 'category'])
print(df_random.shape)
print(df_random.head())
现在可以在仪表板中绘制图表。为了演示目的,让使用pandas_bokeh库绘制以下图表:
# 折线图
p_line = df_random.groupby(['month']).mean().plot_bokeh(kind="line", y="sensor_2", color='#d01c8b', plot_data_points=True, show_figure=False)
# 条形图
p_bar = df_random.groupby(['month']).mean().plot_bokeh(kind="bar", colormap=colors, show_figure=False)
# 堆叠条形图
df_sensor = df_random.drop(['month'], axis=1)
p_stack = df_sensor.groupby(['category']).mean().plot_bokeh(kind='barh', stacked=True, colormap=colors, show_figure=False)
# 散点图
p_scatter = df_random.plot_bokeh(kind="scatter", x="month", y="sensor_2", category="category", colormap=colors, show_figure=False)
# 饼图
p_pie = df_random.groupby(['category']).mean().plot_bokeh.pie(y='sensor_1', colormap=colors, show_figure=False)
# 直方图
p_hist = df_sensor.plot_bokeh(kind='hist', histogram_type="stacked", bins=6, colormap=colors, show_figure=False)
运行这些命令将生成图表,但由于设置了‘show_figure=False’,它们将不会被显示。因为希望这些图表出现在仪表板中,所以使用了这个选项。
接下来,使用‘pandas_bokeh.plot_grid’命令设置仪表板的网格布局。将前三个图表绘制在第一行,剩下的三个绘制在第二行。
# 使用网格布局制作仪表板
pandas_bokeh.plot_grid([[p_line, p_bar, p_stack], [p_scatter, p_pie, p_hist]], plot_width=400)
仪表板看起来像这样:
(此处应有图片,但由于是文本格式,无法显示)
所有这些图表都是交互式的,允许使用悬停和缩放功能,以及过滤类别。
通过本文,了解了如何在Pandas中直接生成Bokeh交互式图表,并使用Pandas-Bokeh库设置一个简单的仪表板。Pandas-Bokeh库对于具有基本pandas绘图语法理解的初学者来说非常容易使用。这个库肯定可以帮助使可视化更加引人注目,无需学习任何额外的JavaScript代码来生成交互式图表。希望像一样喜欢探索这个库!