使用Chartify进行数据可视化
虽然Chartify并不是什么新生事物,但许多数据科学家仍然对它不熟悉。考虑到它是为了让数据科学家更容易进行数据可视化而开发的,而且比其他Python图表库更 "直观",这真是令人遗憾。
数据可视化是数据分析的一个重要方面,因为它允许你以视觉上吸引人和可理解的方式向股东传达信息。
在这篇文章中,我们将学习如何用Chartify将数据集可视化。本文将遵循一个非常清晰的结构,从Chartify的概述开始,到它与其他图表库的区别,最后以Chartify的实际演示结束。
前提条件
要跟上这篇文章,你应该具备:
- Python的基本知识。
- 有使用Jupyter笔记本或任何其他基于笔记本的技术的基本知识。我推荐Jupyter笔记本或Google Colab用于数据可视化。然而,在本教程中,我们将使用Jupyter。
什么是Chartify?
根据文档,Chartify是一个Python库,其目的是使数据科学家能够轻松创建图表。在这篇文章中,Spotify Lab向世界介绍了这个开源库,作为你和我使用Python构建视觉上吸引人的图表的一种手段。
该库建立在Bokeh之上。Bokeh是一个基于JavaScript的Python可视化框架。Bokeh可以用来为现代网络浏览器生成交互式可视化。你可以使用Bokeh来生成由JavaScript驱动的可视化,而不需要编写任何JavaScript。我相信你知道这对Chartify意味着什么......是的,你得到了它奇妙的视觉效果。

但是,有这么多用于数据可视化的Python库,比如Matplotlib、Seaborn、Plotly、Ggplot2、D3和Bokeh,是什么让Chartify与众不同?
是什么让Chartify变得 "直观"?
据观察,数据科学家在使用大多数其他库来创建图表时,会花费大量时间来定制各种细节。你会经常发现自己在StackOverflow上花了好几个小时来排除故障,写了很多代码,只是为了让你的图表工作。创建Charity的主要意图是为了解决这个问题。
Chartify让你有能力只用几行代码和很少的定制来创建图表。
这并不是说你不能够对你的图表进行修改。像我之前提到的Chartify是建立在Bokeh之上的,所以你可以使用Bokeh的API,并按你的意愿进行定制。Chartify还使数据绘图和数据框架操作变得简单,即使你有不同的输入和数据类型。
让我们看看Chartify如何帮助你可视化你的数据,但首先,让我们把它安装好。
安装Chartify
如果你在你的本地机器上工作,你将需要安装Chartify。我强烈建议创建一个虚拟环境来更好地管理你的软件包。但在这篇文章中,我将只使用Jupyter笔记本。让我们打开我们的笔记本。
Chartify可以通过运行下面的代码来安装。
pip install chartify
如果你正在使用Jupyter笔记本,并且想用pip ,你可能已经尝试在shell中直接运行pip 。然而,这可能一般不会成功。因此,你可以使用下面的代码片断。
Import sys
!{sys.executale} -m pip install chartify
该库需要一个ChromeDriver来生成PNG输出。你可以从Chrome网站上下载它。下载后,你需要安装它并将其复制到适当的目录中。
导入Chartify
import numpy as np
import pandas as pd
import chartify
Pandas是一个Python库,需要进行数据清理和处理,而Numpy是一个用于科学计算的Python库。
加载数据集
Chartify自带一个内置的数据集。运行下面的代码来访问它。
data = chartify.examples.example_data()
data.head()
然而,在本教程中,我们将利用完整的宠物小精灵数据集,你可以从Kaggle免费下载。解压缩文件后,你应该在你的本地机器上创建一个与数据集相同的文件夹的python文件。
这个数据集也被用于Seaborn的这篇教程文章中。我们会重现文章中的一些图表,并添加其他图表。
现在让我们通过运行下面的代码来读取和显示数据集。
pokemon_df = pd.read_csv('pokemon.csv')
pokemon_df.head(5)
我们将使用.columns 来检查我们的列,并使用下面的代码片段添加s/n 列。
pokemon_df.columns
pokemon_df.insert(loc =0, column = 's/n',value = np.arange(len(pokemon_df)))
使用Chartify时可能遇到的问题
在使用Charify的过程中,我发现了一个问题。我无法显示我的图表。
当我第一次运行我的代码时,我得到一个错误信息。如果我们看一下这个错误信息,我们会发现这是一个兼容性问题。现有的最新版本的ChromeDriver只支持93版的Chrome,而我目前的Chrome浏览器版本是96.0.4664.45。

作者的屏幕截图
为什么会影响到chartify的视觉显示能力?这是因为就像我之前提到的,我们的PNG输出(视觉)需要ChromeDriver。为了解决这个问题,我们需要将Chrome浏览器降级。这可以通过3个简单的步骤实现。
- 第1步:卸载Chrome。
- 第2步:下载较旧的Chrome浏览器版本。
- 第3步:禁用Chrome的自动更新功能。
使用Chartify进行数据可视化
要开始我们的图表绘制,请输入并运行以下代码片段。
ch = chartify.Chart()
ch.show()
我们刚刚运行的代码将给我们带来下面的输出。

作者的屏幕截图
Chartify让初学的人比较容易上手。这是它的一个神奇之处。这个得到显示的空图表向库的用户展示了他们如何用数据填充图表。
让我们用柱状图来可视化口袋妖怪的类型分布。
宠物小精灵类型分布
柱状图通过使用不同高度的柱子来表示数据。我们将用它来查看各种小精灵类型的分布。首先,我们需要创建一个数据框,将口袋妖怪类型1和它的世代分组。这可以用下面的代码段来完成。
bar_data = (pokemon_df.groupby('type1')[['generation']].sum()
.reset_index()
)
bar_data
接下来,我们要将这个数据框可视化。
ch = chartify.Chart(blank_labels=True, x_axis_type='categorical')
ch.set_title("Pokemon EDA using Chartify")
ch.set_subtitle("Pokemon type distribution")
ch.plot.bar(
data_frame=bar_data,
categorical_columns=['type1'],
numeric_column='generation')
ch.show()
我们传递的前几个参数是.set_title 和.set_subtitle ,它们是图表的标题和副标题。你可以分别用.axes.set_xaxis_label 和.axes.set_yaxis_label 为你的x轴和y轴指定一个名称。最后一个参数,.plot.bar ,需要你的data_frame,也就是要绘制的数据。其他参数定义你要绘制的分类和数字列。

作者的屏幕截图
接下来,让我们看看小精灵的类型分布,但这次要考虑每个小精灵的is_legendary 属性。我们也会首先创建一个所需数据的数据框。我们可以通过将我们的小精灵按type1 和is_legendary 列分组来实现。这可以通过运行下面的代码片断来完成。
Pokemon_type_distribution = (pokemon_df.groupby(['type1','is_legendary'])['s/n'].sum().reset_index())
print(Pokemon_type_distribution.head())
然后,我们将通过运行下面的代码,用Chartify将这些数据可视化。
ch = chartify.Chart(blank_labels=True, x_axis_type='categorical')
ch.set_title("Pokemon EDA using Chartify")
ch.set_subtitle("Pokemon type distribution")
ch.plot.bar(
data_frame=Pokemon_type_distribution,
categorical_columns=['type1', 'is_legendary'],
numeric_column='s/n', color_column='is_legendary')
ch.show()

作者的屏幕截图
每一代小精灵的数量
让我们来看看每一代的小精灵的数量。我们将通过运行下面的代码片断从宠物小精灵数据中提取这一数据。
generations = pd.DataFrame ({'count': pokemon_df.generation.value_counts().sort_index()})
generations['generation'] = generations.index.get_level_values(0)
generations
接下来,我们将运行一个代码片段,就像我们为之前的柱状图所运行的那样。
ch = chartify.Chart(blank_labels=True, x_axis_type='categorical')
ch.set_title("Pokemon EDA using Chartify")
ch.set_subtitle("Number of Pokemon in Each Generation")
ch.plot.bar(data_frame=generations, categorical_columns='generation',
numeric_column='count',color_column='generation')
ch.style.color_palette.reset_palette_order()
ch.plot.text(
data_frame=generations,
categorical_columns='generation',
numeric_column='count',
text_column='count',
color_column='generation')
ch.show()
color_column 参数给你的绘图一个基于颜色的参数,为指定的列的基础上的绘图着色。在我们的图表中,Chartify会给不同的代数分配不同的颜色,因为我们把color_column 设置为列generation 。

作者的屏幕截图
每一代中每种类型的小精灵的数量
让我们试一试折线图。我们将使用我们的Python知识,从我们的宠物小精灵数据中提取数据。我们将首先获得每种类型的计数。
data2 = pokemon_df[pokemon_df.type2.notna()].copy()
data2.type1 = data2.type2
type_data = pd.concat ([pokemon_df, data2])
#get a count for each type
type_count = type_data.type1.value_counts()
type_count = pd.DataFrame ({'count': type_count})
type_count
接下来,我们将创建一个数据集,通过使用.groupby 和.value_counts 函数,得到每一代每个口袋妖怪类型的总数。
generations_types = type_data.groupby (['generation']).type1.value_counts()
generations_types = pd.DataFrame ({'count': generations_types})
generations_types['generation'] = generations_types.index.get_level_values(0)
generations_types['type'] = generations_types.index.get_level_values(1)
generations_types.reset_index(drop = True, inplace = True)
generations_types
现在,我们通过使用chartify.plot.parallel 函数绘制线图来可视化我们的数据。
ch = chartify.Chart(blank_labels=True, x_axis_type='categorical')
ch.set_title("Pokemon EDA using Chartify")
ch.set_subtitle("Number of Pokemon of Each Type in Each Generation")
ch.plot.parallel(
data_frame=generations_types,
categorical_columns='generation',
numeric_column='count',
color_column='type')
ch.show()
就像柱状图一样,折线图需要一个数据框参数来表示我们的数据。我们还将以与条形图相同的方式指定categorical_column,numeric_column, 和color_column 。之后,我们运行代码,我们的输出就会显示出来。

作者的屏幕截图
我们可以在棒状图中重现这些数据。
棒状图是棒状图的一个变种,其中棒状图被替换成了一条线,末端有一个点,就像棒棒糖。
当试图在对象或类别之间进行比较时,棒棒糖图非常好。棒状图也需要与柱状图和线状图相同的参数。axes.set_xaxis_tick_orientation ,我们可以设置一个方向。
ch = chartify.Chart(blank_labels=True, y_axis_type='categorical')
ch.set_title("Pokemon EDA using Chartify")
ch.set_subtitle("Number of Pokemon of Each Type in Each Generation using a Lollipop chart")
ch.plot.lollipop(
data_frame=generations_types,
categorical_columns=['generation','type'],
numeric_column='count',
color_column='generation')
ch.axes.set_xaxis_tick_orientation('horizontal')
ch.show()

口袋妖怪类型组合
我们将绘制一个热图来查看口袋妖怪类型组合。就像我们在其他可视化中所做的那样,我们将创建一个数据框架。
type_combos= (pokemon_df.groupby(['type1', 'type2'])['generation'].mean().reset_index())
我们将使用.plot.heatmap 来创建热图。
ch = chartify.Chart(blank_labels=True, x_axis_type='categorical', y_axis_type='categorical')
ch.plot.heatmap(
data_frame=type_combos,
x_column='type1',
y_column='type2',
color_column='generation',
text_column='generation',
text_color='white')
ch.axes.set_xaxis_label('type1')
ch.axes.set_yaxis_label('type2')
ch.set_title('Pokemon EDA using Chartify')
ch.set_subtitle("Pokemon Type Combinations: Heatmap")
ch.show()

小精灵重量分布
让我们来看看我们的小精灵重量。这将以直方图的形式显示。在weight_kg 列中,有nan值。我们将不得不填补它。对于这篇文章,我们将用0 。
pokemon_df['weight_kg'] = pokemon_df['weight_kg'].fillna(0)
之后,我们将绘制我们的直方图。
ch = chartify.Chart(blank_labels=True, y_axis_type='density')
ch.set_title("Pokemon EDA using Chartify")
ch.set_subtitle("Distribution of Weight: Histogram")
ch.plot.histogram(data_frame=pokemon_df, values_column='weight_kg',bins=50)
ch.show()

结论
数据可视化对于深入了解大型数据集至关重要。而Chartify可以确保你用更少的代码来完成它。我们希望这篇文章能帮助你感受到如何使用Chartify进行数据可视化。