comtop0 2019-01-25
点击上方关注,All in AI中国
作者——Gilbert Tanner
如何利用Matplotlib、Pandas和Seborn制作图形?
数据可视化是一门通过将数据放在可视环境中来理解数据的学科,这样我们就会更加详细的知道/了解那些隐藏在数据下的模式、趋势和相关性。
Python提供了多个很棒的图形库,其中包含许多不同的特性。无论你是想创建交互式的、实时的还是高度定制的绘图,python都为你提供了一个优秀的库。
这里有一些流行的库,以及对它们的相关概述:
Matplotlib:在众多库中相对基础,"规矩"少(https://matplotlib.org/)。
Pandas Visualization:易于使用的界面,建立在Matplotlib上(https://pandas.pydata.org/pandas-docs/stable/visualization.html)。
Seaborn:操作难度较高,有很棒的默认样式(https://seaborn.pydata.org/)。
ggplot:基于R的ggplot2(http://ggplot.yhathq.com/)。
Plotly:互动性好(https://plot.ly/python/)。
在本文中,我们将学习如何使用Matplotlib、Pandas visualization和Seaborn创建基本的图,以及如何使用每个库的一些特定特性。本文将侧重于语法,而不是解释图,我将在另一篇博客文章中介绍这些图。
在以后的文章中,我将介绍交互式绘图工具,如Plotly,它是在D3上构建的,也可以与JavaScript一起使用。
导入数据集
在本文中,我们将使用两个免费的数据集。即,Iris(https://archive.ics.uci.edu/ml/datasets/iris)和Wine Reviews(https://www.kaggle.com/zynicide/wine-reviews)数据集,我们可以使用panda read_csv方法加载该数据集。
Iris数据集
Wine Reviews数据集
Matplotlib
Matplotlib是最流行的python绘图库。它是一个底层库,带有类似Matlab的接口,自由程度高,可以编写更多代码。
安装Matplotlib可以使用pip和conda。
Matplotlib特别适合创建基本的图形,如折线图、条形图、直方图等。输入:
散点图
要在Matplotlib中创建散点图,可以使用scatter方法,并且使用plt创建一个图形和一个轴。所以我们可以给我们的图像进行标记。
Matplotlib散点图
我们可以通过在每个数据点上按其类着色来赋予图形更多的意义。这可以通过创建一个从类映射到颜色的字典来实现,然后使用for循环来分散到每个点,并传递各自的颜色。
按类着色的散点图
折线图
在Matplotlib中,我们可以通过调用plot方法创建一个折线图。我们还可以在一个图中绘制多个列,方法是遍历我们想要的列,并在相同的轴上绘制每个列。
折线图
柱状图
在Matplotlib中,我们可以使用hist方法创建直方图。如果我们向它传递分类数据,比如wine-review数据集中的列,它将自动计算每类发生的频率。
柱状图
条形图
可以使用bar方法创建条形图。条形图不会自动计算类别的频率,因此我们将使用panda value_counts函数来完成这一操作。条形图对于没有很多不同类别(少于30个)的分类数据非常有用,因为如果没有条形图,分类数据会变得非常混乱。
条形图
Pandas Visualization
Panda是一个开源的、高性能、易于使用的库,提供数据结构(如dataframes)和数据分析工具(如本文中使用的可视化工具)。
Pandas Visualization使得从dataframe等中创建图像变得非常容易。它还具有比Matplotlib更高级的API。换句话说,对于相同的结果,我们需要的代码更少。
可以使用pip或conda安装Panda。
散点图
要在panda中创建散点图,我们可以调用<dataset>.plot.scatter()并将两个参数传递给它,即x列的名称和y列的名称。我们也可以选择给它传递一个标题。
散点图
正如你在图像中看到的,它会自动将x和y标签设置为列名。
折线图
要在panda中创建一个线形图,我们可以调用<dataframe>.plot.line()。在Matplotlib中,我们需要循环遍历要绘制的每一列,而在panda中,我们不需要这样做,因为它会自动绘制所有可用的数字列。
折线图
如果我们有一个以上的特征,Panda会自动为我们创建一个折线图,正如上图所示。
柱状图
在Panda中,我们可以根据具体内容创建直方图。没有任何参数是必需的,但是我们可以选择性地传递一些参数,比如bin大小。
柱状图
创建多个直方图也非常容易。
subplot参数指定我们希望为每个特性使用单独的plot,布局指定每行和每列的plot数量。
条形图
要绘制柱状图,我们可以使用plot.bar()方法,但是在调用它之前,我们需要获取数据。为此,我们将首先使用value_count()方法计算事件数,然后使用sort_index()方法从最小到最大排序。
垂直柱状图
使用plot.barh()方法制作水平条形图也非常简单。
水平条形图
我们还可以绘制其他数据,比如是出现的次数。
葡萄酒价格最高的国家(平均)
在上面的例子中,我们将数据按国家进行分组,然后取葡萄酒价格的平均值,并对其进行排序,绘制出平均葡萄酒价格最高的5个国家。
Seaborn
Seaborn是一个基于Matplotlib的Python数据可视化库。它为创建有吸引力的图形提供了高级接口。
Seaborn有很多东西可以提供。在Matplotlib中,你可以在一行中创建需要几十行代码的图形。它的标准设计非常棒,而且它还有一个用于处理panda dataframes的界面。
输入:
散点图
我们可以使用.scatterplot方法创建一个散点图,就像Panda,我们需要把它的列名x和y数据,但现在我们还需要把数据作为一个额外的参数,因为我们不是直接调用函数的数据。
散点图
我们还可以使用hue参数通过类突出显示这些点,这比Matplotlib中简单得多。
由类着色的散点图
折线图
创建线形图,我们可以使用sns. lineplot方法。需要的参数是数据,在我们的示例中是Iris数据集中的四列数字。我们也可以用sns.kdeplot方法对曲线的边缘进行四舍五入处理,因此如果你的数据集中有很多离群值,这种方法会更清晰。
柱状图
直方图
要在Seaborn中创建直方图,我们使用sns.distplot方法。我们需要将它传递到我们想要绘制的列中,它会自己计算发生的事件。
图19:柱状图
图20:直方图
条形图
在Seaborn中,可以使用sns.countplot创建条形图,并将数据传递给它。
图21:条形图
其他图
现在,你已经对Matplotlib、Panda可视化和Seaborn语法有了基本的了解,接下来我将向你展示一些用于提取内部内容的其他图形类型。
大多数Seaborn是go to库,因为它的高级接口允许在几行代码中创建漂亮的图形。
箱形图
箱形图是显示五位数摘要的图形化方法。我们可以使用seaborns sns.boxplot创建box plot,并将数据以及x和y列名传递给它(https://en.wikipedia.org/wiki/Five-number_summary)。
箱形图
箱形图,就像柱状图一样,只对少数类别的数据非常有用。
Heatmap
Heatmap是数据的图形化表示,其中矩阵中包含的各个值用颜色表示。Heatmap对于探索数据集中特征之间的相关性是非常完美的(https://en.wikipedia.org/wiki/Matrix_%28mathematics%29)。
要获得数据集内特征的相关性,我们可以调用<dataset>.corr(),这是一个来自panda dataframe方法,会用到相关矩阵(https://www.displayr.com/what-is-a-correlation-matrix/)。
我们现在可以使用Matplotlib或Seaborn来创建Heatmap。
Matplotlib:
图23:没有注释的Heatmap
要在Heatmap中添加注释,我们需要添加两个for循环:
图24:带有注释的Heatmap
Seaborn使得创建Heatmap和添加注释更加容易:
Faceting
Faceting是将数据变量分解成多个子图,并将这些子图组合成单个图形的操作。
如果想快速浏览数据集,Faceting非常有用。
要在Seaborn中使用faceting,我们可以使用FacetGrid。首先,我们需要定义FacetGrid,并将数据以及用于拆分数据的行或列传递给它。然后我们需要调用FacetGrid对象上的函数,并定义要使用的绘图类型以及要绘制的列。
Facet-plot
你可以让图比上面的例子更大更复杂。你可以在这里找到一些例子(https://seaborn.pydata.org/generated/seaborn.FacetGrid.html)。
Pairplot
最后,我将向你展示Seaborns pairplot和panda scatter_matrix,它们使你能够在数据集中绘制成对关系网格。
图27:Pairplot
图28:散点矩阵
正如你在上面的图像中看到的。图的对角线用直方图填充,其他的图是散点图。
结论
数据可视化是一门通过将数据放在可视环境中来理解数据的学科,这样可能无法检测到的模式、趋势和相关性就可以暴露出来。
Python提供了多个很棒的图形库,其中包含许多不同的特性。在本文中,我们研究了Matplotlib、Pandas和Seborn。
本文中涉及的代码可以作为Github存储库使用:https://github.com/TannerGilbert/Articles/tree/master/Introduction%20to%20Data%20Visualization%20in%C2%A0Python