python可视化步骤matplotlib (python进行数据分析网盘)

如何用python进行数据分析,利用python进行数据分析git

可视化作为利用数据、信息来达到目的、解决问题的最后一环,在很多时候其重要性往往高于前面的所有工作。在经过了定义问题、收集数据、数据清洗、数据建模、评价的环节以后,终于到了要将数据分析的结果展示出来的时候,它直接决定了分析的结果是否可以落地,是否可以实现价值。我们将重点介绍Python中最典型的两种可视化工具:Matplotlib和Seaborn。

一、Matplotlib

Matplotlib是Python的一个绘图库,它包含了大量的工具,也提供了极大的灵活性,理论上使用者可以利用它绘制任何图形。正是由于这一特性,使得Matplotlib学习曲线相对陡峭,我们将以初学者的视角带领读者由浅入深一步步地掌握Matplotlib的各项功能。

1.1绘制第一个散点图

Jupyter Notebook中几乎所有利用Matplotlib绘图的代码都会包含下面两句。

如何用python进行数据分析,利用python进行数据分析git

上述代码首先将matplotlib.pyplot以别名plt导入,它是整个Matplotlib库的核心,包含了所有绘图相关的函数,在Notebook中输入dir(plt)可以查看所有函数。而%matplotlib inline则是Jupyter Notebook中的特殊命令,有了它,所有绘图将在Notebook中自动显示,如果没有这一行代码,就需要调用plt.show()函数让Notebook显示图形。导入了Matplotlib库后,就可以用plt.plot()函数来绘制第一个图形,运行如下代码将得到图1所示图形。

如何用python进行数据分析,利用python进行数据分析git

如何用python进行数据分析,利用python进行数据分析git

图1 折线图

上述代码将一个列表的数据传给了plt.plot()函数,该函数自动绘制了一幅折线图,其中的Y轴取值来自输入的数据列表,而X轴取值则对应输入列表的索引,因此,最后得到如图1所示的图形。细心的读者还会注意到图形输出上方有一行显示[matplotlib.lines.Line2Dat0x8c72fd0],其实这是plt.plot()函数返回的图形对象,如果不想有这样的显示,在代码后面加上“;”就可以不输出该内容,当然通过在代码下一行执行plt.show()函数也可以达到同样效果。不过前面不是说要画散点图吗?现在plt.plot()怎么默认画的是折线图呢?要理解原因,就需要了解plt.plot()的参数使用,这个函数有3个基本输入项(x,y,format)。其中,format包含以下3种参数的组合:{color}{marker}{line}。例如,“go-”依次代表的是绿色(对应g),对应(x,y)处画点(对应o),各个点间用线连接(对应-)。如果给出的format组合是“go”,此时就将得到绿色散点图。为帮助大家更深入理解这种绘图格式,下面再来看几个例子。

· r*--:带红色星型点的虚线,r代表红色,*代表星型,--代表虚线。

· ks.:带黑色方块点的实线,k代表黑色,s代表方块,.代表点。

· bD-.:带蓝色钻石点的点画线,b代表蓝色,D代表钻石点,-.代表点画线。

关于{color}{marker}{line}的更详细内容,读者可以通过help(plt.plot)获取更深入的说明。接下来再来看一个画红色散点图的例子,运行下面代码将得到如图2所示输出。由于代码后面加了“;”,所以不再看到如图1那样的对象地址输出。

如何用python进行数据分析,利用python进行数据分析git

如何用python进行数据分析,利用python进行数据分析git

图2 散点图

前面画的是一组散点图,如果要画两组数据的散点图呢?很简单,只需要画两次就可以得到如图3所示的散点图,代码如下。

如何用python进行数据分析,利用python进行数据分析git

如何用python进行数据分析,利用python进行数据分析git

图3 两组数据散点图

一幅完整的图形不只是图形部分,还包含标题、坐标轴等,接下来为上面的图加上标题、坐标轴、图例等,运行如下代码,将得到如图4所示的图形。

如何用python进行数据分析,利用python进行数据分析git

如何用python进行数据分析,利用python进行数据分析git

图4 带图例和标题的散点图

上述代码中,plt.plot()函数通过label参数给出了图例信息,之后的plt.legend(loc='best')给出图例的位置,best代表自适应选择最佳位置,更多的loc参数取值读者可以通过help(plt.legend)获得。plt.xlable('X')和plt.ylabel('Y')分别给出了两个坐标轴的名称。plt.title('Scatterplot With Legend')则给出了整个图形的标题。如果图形中有中文字符,为了使中文能正确显示,需要指定字体,运行如下代码将得到能显示中文字符的图形,如图5所示。

如何用python进行数据分析,利用python进行数据分析git

如何用python进行数据分析,利用python进行数据分析git

图5 中文标题散点图

上述代码中,第一行代码给出了字体,这里使用了SimHei字体,当然如果读者的计算机中有其他中文字体,也可以指定使用该字体。对于Linux系统,通常可以通过命令fc-list:lang=zh查看计算机中的中文字体。如果使用的是Windows系统,通常可以通过“控制面板”中的“字体”进行查看。第二行代码则是解决当坐标轴有负号的时候可以显示负号。现在图形有了标题、图例,但是整个图看起来似乎有点小,应该怎么办呢?同时,如果要修改X轴和Y轴显示的范围,应该如何操作呢?下面的代码给出了方法。

如何用python进行数据分析,利用python进行数据分析git

其中,plt.xlim(0,12)和plt.ylim(0,12)给出了绘图时显示的X轴和Y轴范围。plt.figure(figsize=(12,9))则给出了图形的长与宽。

1.2理解figure与axes

现在读者对Matplotlib中的绘图已经有了基本的了解,是时候来深入了解其绘图机制了。在Matplotlib绘图语言中有两个基本术语:figure与axes,读者可以把figure想象成绘画的画布,在Matplotlib中每幅图都是在figure上面绘制的,这个对象包含了所有的子图以及图形元素。图6详细说明了一张Matplotlib图形中存在的图形元素,实际上绘图就是添加、调整这些元素。

理解了figure,那么axes是做什么的呢?要回答这个问题,需要了解Matplotlib中的另一种绘图方式。假设现在想画一幅图,这幅图包含两个散点图水平排列,请问应该如何绘制呢?此时就需要通过plt.subplots(1,2)使用子图(也称为axes)来完成这一操作。利用该函数创建两个对象:figure对象和在figure对象中的axes对象。通过如下代码,就可以得到如图7所示的图形。

如何用python进行数据分析,利用python进行数据分析git

如何用python进行数据分析,利用python进行数据分析git

图6 Matplotlib中的图形元素

如何用python进行数据分析,利用python进行数据分析git

图7 并列子图

其中,plt.subplots(1,2)可以创建一个有两个子图的figure对象,返回值包括了figure对象以及axes对象列表。sharey=True参数表示两个子图共用Y轴,dpi参数表示分辨率,指每英寸长度上的点数。子图对象ax1、ax2与plt一样,提供了set_title()、set_xlabel()、set_ylabel()等函数。实际上plt.title()底层调用的就是当前axes对象的set_title()函数。类似地,plt.xlabel()对应ax.set_xlabel(),plt.ylabel()对应ax.set_ylabel(),plt.xlim()对应ax.set_xlim(),plt.ylim()对应ax.set_ylim()。为了简化代码,也可以通过axes对象的set()函数一次完成这些设置,代码如下。

如何用python进行数据分析,利用python进行数据分析git

1.3Matplotlib中面向对象与类Matlab语法的区别

随着对Matplotlib的学习的深入,读者会很自然地发现,似乎Matplotlib中有两种不同的绘图语法。一种是类似Matlab的语法,另一种就是面向对象语法。也正是由于这一原因,很多人都觉得Matplotlib学习曲线陡峭,对新手一点都不友好。由于Matplotlib最初的目的是在Python中实现Matlab的绘图功能,所以它采用了类似的语法,即无状态语法(stateful)。所谓无状态是指plt会记录当前的axes是哪个,当使用plt.{绘图函数}绘图时,它将在当前的那个子图上绘制。简单来说,面向对象和类Matlab语法的区别就是面向对象是在指定axes对象上面绘图,而类Matlab语法中所有的绘图则是使用的plt()在当前那个axes对象上绘制。那么问题来了,如果想如前一节那样绘制两幅并列的图,采用类Matlab的语法该怎么实现呢?其实很简单,只要每次先建立一幅子图(使用plt.subplot()或plt.add_subplot()函数),然后使用plt.plot()或plt.{其他绘图属性函数}来修改对应的子图(axes)就可以了。这里需要牢记,不管调用的是plt的哪个方法,绘图都是在当前的axes(子图)上进行。下面来看一下代码。

如何用python进行数据分析,利用python进行数据分析git

这段代码产生的输出与图7相同,与前一段代码的区别在于这段代码使用的是类Matlab语法绘图,没有明确指明axes对象。其中,代码plt.subplot(1,2,1)中前两个参数(1,2)分别代表了新建的子图的行数与列数,这里是1行2列,第三个参数“1”指定当前子图为第1个子图,后续对应的plt函数将在该子图进行图形绘制。为了方便获取或设定axes与figure,Matplotlib中提供了plt.gca()和plt.gcf()函数来获取当前axes和figure。而plt.cla()和plt.clf()函数则可以清除当前axes和figure。看起来面向对象的绘图方式与类Matlab方式相比似乎没有太大优势,不过如果要绘制如图8所示的图形呢?

如何用python进行数据分析,利用python进行数据分析git

图8 有4幅子图的图形

此时如果采用无状态方式绘图,代码将大量重复,而采用面向对象方式则相对简单,示例如下。

如何用python进行数据分析,利用python进行数据分析git

这段代码通过循环遍历axes对象的方式,将重复性的工作放到了一起,绘图代码得到了极大简化。此外,还可以使用plt.suptitle()函数为整个绘图添加一个标题(plt.title()是给当前的子图添加标题),verticalalignment='bottom'参数给出了对齐方式是底部。最后,这段代码使用了ax.yaxis.set_ticks_position('none')使得Y轴不绘制刻度标记。这也是使用面向对象的好处,理论上用户可以获得axes对象的所有子对象,之后调用该子对象的方法或属性对图形进行修改,下面将进一步讨论这种设置图形属性的方式。

1.4修改坐标轴属性

读者已经知道了一幅Matplotlib图形中有多个属性,图形的每个属性都可以进行调整。这一方面使得Matplotlib功能极其强大,理论上可以绘制出任何图形,当然另一方面也使得它学习起来有些困难。我们将一步步带领大家掌握Matplotlib中如何对各图形属性进行调节。首先来看看经常用到的关于坐标轴以及标签的修改方法。

· 修改坐标轴的刻度位置以及标签(plt.xticks()/ax.setxticks()/ax.setxticklabels())。

· 控制坐标轴的刻度显示位置(上/下/左/右),使用plt.tick_params()。

· 格式刻度标签。

假设要绘制如图9所示的图形,应该怎么办呢?

如何用python进行数据分析,利用python进行数据分析git

图9 正弦余弦曲线

要设置X轴的刻度和标签,需要用到xticks()函数。plt.xticks()一次完成了X轴的刻度、标签字体、方向等的设置,实际上底层也是通过调用ax.set_xticks()和ax.set_xticklabels()来实现。plt.tick_params()则对每个坐标轴的刻度进行了设置,这里设置了每个轴(上/下/左/右)都显示主刻度标记,同时标记显示在内部(direction='in'),网格采用蓝色虚线。最后因为要在X轴显示度数,所以需要对X轴的刻度标签进行从弧度到角度的转换,首先利用FuncFormatter定义了一个formatter,之后使用plt.gca().xaxis.set_major_formatter(formatter)将该formatter应用到X轴。具体代码如下。

如何用python进行数据分析,利用python进行数据分析git

1.5修改图形属性

Matplotlib中各图形组件的外观都可以通过其属性进行修改,对应到代码就是通过rcParams进行全局设置。要了解详细的图形属性,可以通过mpl.rcparams()查看,代码如下。

如何用python进行数据分析,利用python进行数据分析git

上述代码中只是列出了一部分属性,这里以字体属性为例,来说明如何进行修改,其他属性修改基本类似。例如,STIX字体是一种常用字体,读者可以输入以下代码来一次完成设置。

如何用python进行数据分析,利用python进行数据分析git

如果想恢复原来的设置,则可以通过下面的代码实现。

如何用python进行数据分析,利用python进行数据分析git

单个修改各种属性的确很灵活,但是人工设置各图形属性,一是比较麻烦,另外就是可能使整个图形的样式存在这样或那样的不一致情况。因此,Matplotlib提供了各种设置好的样式供用户选择,通过如下代码,可以查看当前系统中已安装的样式。

如何用python进行数据分析,利用python进行数据分析git

要选择使用哪种样式绘图也非常简单,只需要在绘图时进行指定就可以了。例如,如下代码就使用了不同样式进行绘图。

如何用python进行数据分析,利用python进行数据分析git

上述代码首先定义了一个绘图函数plot_sine_cosine_wave(),该函数通过参数style来决定选择的绘图样式,然后用plt.style.use(style)来完成设置。最后得到的图形如图10~图12所示,可以看出不同样式对应了不同字体、大小、颜色等属性。此外,上述代码中对于X轴的刻度标签的显示特意采用了另一种方式,即使用了参数labels=[r'$0#39;,r'$\frac{\pi}{2}#39;,r'$\pi#39;,r'$\frac{3\pi}{2}#39;,r'$2\pi#39;]来完成,这里是利用了Latex的语法,如果读者经常需要写科技论文,那么应该对此非常熟悉。如果有不清楚的地方可以去参考Latex的相关文档。

Matplotlib中提供了3组不同的颜色,分别是CSS4风格、XKCD风格和系统的基础色,使用者可以通过如下代码查看具体颜色。

如何用python进行数据分析,利用python进行数据分析git

图10 seaborn-notebook

如何用python进行数据分析,利用python进行数据分析git

图11 ggplot

如何用python进行数据分析,利用python进行数据分析git

图12 fivethirtyeight

如何用python进行数据分析,利用python进行数据分析git

除此之外,为了方便用户更好地使用颜色对比,Matplotlib中还提供了调色板,通过如下代码可以进行查看。

如何用python进行数据分析,利用python进行数据分析git

1.6定制图例,添加标注

绘图过程中经常会遇到图例说明、在特定位置添加标注以及文本说明的情况,我们将介绍如何在Matplotlib中完成这一功能。首先来看图例的定制,仍然是绘制正弦余弦曲线,如果想得到如图13所示图形,应该如何完成呢?

如何用python进行数据分析,利用python进行数据分析git

图13 定制图例

图例的设置主要通过plt.legend()函数来完成,可以使用如下代码。

如何用python进行数据分析,利用python进行数据分析git

其中,frameon指明是否画边框,framealpha指明了边框透明度,ncol指明分成两列,shadow指明是否有阴影,boderpad指明边框厚度,title指明图例标题。通过plt.text()和plt.annotate()函数还可以给图形添加标注以及文本说明,例如如下代码可以完成图形标注功能,绘制出如图14所示的图形。

如何用python进行数据分析,利用python进行数据分析git

其中,plt.annotate()函数通过xy参数决定标注箭头位置,xytext决定了文本位置,bbox指定了文本框的样式,arrowprops指定了箭头的样式,而plt.text()函数则指定了文本位置。

如何用python进行数据分析,利用python进行数据分析git

图14 标注与文本示例

此外,在plt.text()函数中还有一个参数transform,它可以用于窗口坐标与子图坐标之间的变换,读者可以通过文档了解(https://matplotlib.org/3.1.1/tutorials/advanced/transforms_tutorial.html),这里用一个简单例子来说明。

上述代码输出的图形如图15所示,结合1.2节,读者可以更好地了解data、axes和figure三者的不同。

图15 不同坐标对象

1.7子图

通过前面的学习,读者应该已经掌握了Matplotlib中基本的绘图技巧,接下来将进入一个新的主题——子图,即在一个图形中包含了多个子图形。读者已经知道通过plt.subplot()函数可以绘制子图,但是此时得到的子图都是一样大小,很多时候绘图需要对子图有更精确的大小控制,此时就需要用到plt.subplot2grid()或plt.GridSpec()函数。例如,图16就是利用plt.subplot2grid()函数实现的结果。

图16 subplot2grid实现子图

上述代码中第二行plt.subplot2grid()函数的第一个参数给出了整个图形是3×3的网格,现在首先绘制(0,0)位置子图,colspan=2代表该子图占列方向两个网格,rowspan=2代表占行方向两个网格。接下来的plt.subplot2grid()函数就只能从(0,2)位置开始了,因为网格的行方向0和1已经被第一个子图占用,rowspan=3则代表了将行方向3个网格占满。依此类推就得到了图16的布局,利用此方法,用户可以构造任何图形布局。同样的功能,利用plt.GridSpec()函数也可以完成,例如如下代码将得到如图17所示的输出。

图17 GridSpec实现子图

除了子图,数据分析中有时还会绘制图中图,即在原图形区域中创建一个新的图形区域来放大显示某部分图形。例如,运行如下代码将得到如图18所示的图中图。

图18 图中图

上述代码中最关键部分就是inner_ax=fig.add_axes([0.2,0.55,0.35,0.35]),其中给出的参数依次代表left,bottom,width,height,但它并不是坐标位置,而是figure的百分比,即左边从figure的20%位置开始,下边从55%位置开始,宽高是figure的35%。

1.8利用Matplotlib绘制各种图形

经过前面章节的学习,读者可以说已经完成了Matplotlib中的内功修炼,只需要再学习些不同招式就可以绘制各种图形了。先来看一个气泡图绘制的例子。

上面的大部分代码,读者朋友应该已经很熟悉了。需要说明的有3个地方,plt.figure()函数中的两个新参数facecolor和edgecolor,分别代表了背景色为白色,边框颜色为黑色。plt.scatter()函数代表画散点图,同时它提供了更多参数。'area'和'poptotal'分别代表了X和Y的取值,而data则指定了对应数据集,所以前面的'area'和'poptotal'实际指的是midwest中的对应列。s代表散点大小由'dot_size'列决定,c='popdensity'指定了散点颜色,camp指定了调色板。最后,plt.colorbar()函数会在图形右侧绘制色条。plt.scatter()和plt.colorbar()函数的更多用法,读者可以查看它的帮助,这里不再赘述。通过上述代码将得到如图19所示的输出。

图19 气泡图

接下来再来看一个更复杂图形,图20所示的图形将各种图形的绘制整合到了一个图中。

图20将散点图、步进图、箱线图、直方图等整合在了一个图里面。下面一段一段地讲解代码。

图20 各种Matplotlib图形

上述代码定义了图形的布局为2行4列,其中第5个图占据第2行的前2列。接下来的代码完成各图形绘制。

其中,scatter()函数完成散点图绘制,step()函数完成步进图绘制,bar()函数完成条形图绘制,fill_between()函数完成区域填充图绘制,date_range()函数生成一个时间序列,更多关于时间序列的内容将在第20章进行更深入的讨论。boxplot()函数完成箱线图绘制,hist()函数完成直方图绘制。以上图形的定制都可以参考前面几小节内容完成,同时读者还可以查看帮助了解更多内容,这里就不再详细讨论。

最后用图21这样一个具有双Y轴的图形来结束Matplotlib绘图这一节,代码如下。

图21 双Y轴示例

上述代码中最关键的一行代码就是ax2=ax1.twinx(),这段代码基于ax1新建了一个axes对象ax2,该对象与ax1共享X轴,因此就可以得到图21所示的双Y轴图形。

二、Pandas绘图

由于大量的数据分析都是基于Pandas完成的,而在分析过程中数据分析人员经常会快速对数据进行可视化,此时的目标不是图形美观,而是迅速发现数据中的模式和规律。因此,为了实现这一目标,Pandas中为DataFrame集成了plot()函数,该函数对plt.plot()函数进行了封装以完成快速绘图。我们将学习如何直接使用DataFrame中的plot()函数,以及如何整合Matplotlib和Pandas中提供的绘图功能。

2.1Pandas基础绘图

DataFrame中的plot()函数是为了快速探索数据而产生,因此绘图方法中只提供了除默认线图之外的少数绘图方法。这些方法可以作为plot()函数的kind关键字参数提供。具体包括:

· bar或barh:条形图或水平条形图;

· hist:直方图;

· boxplot:箱线图,也称为盒子图、盒型图;

· area:区域填充图,也称为面积图;

· scatter:散点图。

下面向读者展示如何绘制这些图形。首先,如果要绘制如图22所示的条形图,那么需要如下代码。

其中,第一行代码新建了一个10行4列的DataFrame,kind='bar'代表绘制条形图。通过指定参数方式和使用df.plot.bar()函数的效果是完全等价的,读者可以自行尝试一下使用df.plot.bar()进行绘图。如果想绘制的是如图23所示的堆叠条形图,只需要修改一个参数stacked=True就可以了。

图22 条形图

图23 堆叠条形图

如果要绘制水平条形图,那么使用如下代码可以输出图24所示的图形。

图24 水平条形图

但是如果数据有多列时,使用如下代码绘制直方图,将得到图25所示图形,而不是期望的每列一个直方图。

图25 重叠的直方图

此时应该改为使用df.hist()函数,才能针对每列数据绘制单独的直方图,如图26所示。

图26 针对每列绘制直方图

接下来绘制如图27所示的箱线图,代码如下。

图27 箱线图

绘制如图28所示的面积填充图,则可以使用如下代码。

图28 面积填充图

最后再来看一下如图29所示的饼图,不过一般情况数据可视化中饼图是被错误使用最多的图形。读者在进行可视化时,如果要绘制饼图,最好思考一下是否可以用条形图代替。

图29 饼图

2.2整合Pandas绘图与Matplotlib绘图

将Pandas的快速绘图与Matplotlib的精细化图形设置结合起来,可以快速完成更加吸引人的图形。例如,现在有如下数据需要分析,如图30所示。

图30 需要分析的数据

首先需要对数据进行分组统计,按每客户统计总购买额和购买数量,取前十大客户,代码如下。

有了数据,下一步要考虑的就是选择什么图形来可视化,如图31所示。图形选择的第一步明确可视化的目的是要展示分布还是对比,又或者是相互关系和组合,之后再根据不同目标来选择对应图形。

图31 图形选择

此时本例的目标是展示前十大客户的销售额,这是多个不同类型数值的对比,因此采用水平条形图,可视化如图32所示,代码如下。

图32 十大客户

上述代码首先进行绘图样式选择,可以说上面的图形已经基本达到了可视化的目标,但是它还不够完美,如X轴以美元显示,可以进一步简化为常用的以千美元/百万美元来计数的方式,这时需要用到前面学习过的FuncFormatter。此外,对于前十中的某些客户,有些是新客户需要在图形中标记出来,同时能标记前十客户的平均销售额,那么可以采用如下代码。

上述代码中currency()函数定义了X轴的变换方式,100万美元以下以K记,大于100万用M来表示,之后将FuncFormatter(currency)定义的formatter应用到X轴就完成了转换。而ax.axvline()完成竖直的虚线绘制,ax.text()在指定位置添加标注,最终得到如图33所示的图形。

图33 前十客户销售额

在探索性分析的时候,数据可视化的目标是高效发现数据模式和规律,而数据分析最终的可视化是为了向读者展示结果,此时的图形需要不断重构、美化,从客户的角度来考虑,希望读者能细心体会这一区别。

三、Seaborn

Matplotlib是Python中最常见的绘图包,强大之处不言而喻。然而由于Matplotlib比较底层,想要绘制漂亮的图非常麻烦,需要写大量的代码。为了解决这一问题,Michael Waskom开发了Seaborn,如果Matplotlib是力图让简单的事情简单,困难的事情成为可能,那么Seaborn就是让一系列定义好的困难的事情也变得简单。Seaborn是在Matplotlib基础上进行了高级API封装,图表装饰更加容易,使用者可以用更少的代码作出更美观的图。与Matplotlib相比,Seaborn更好地提供了:

· 计算多变量间关系的面向数据集接口;

· 可视化类别变量的观测与统计;

· 可视化单变量或多变量分布并与其子数据集比较;

· 控制线性回归的不同因变量并进行参数估计与作图;

· 对复杂数据进行易行的整体结构可视化;

· 对多表统计图的制作高度抽象并简化可视化过程;

· 提供多个内建主题渲染Matplotlib的图像样式;

· 提供调色板工具生动再现数据;

· 同时支持矩阵数据和DataFrame。

而以上这些正是探索性数据分析所需要的。

3.1Seaborn中的样式

Seaborn装载了一些默认主题风格,主题风格的选择通过sns.set()方法实现。sns.set()可以设置5种风格的图表背景:darkgrid、whitegrid、dark、white、ticks,通过参数style设置,默认情况下为darkgrid风格。下面以图34所示数据为例进行具体讲解。

图34 示例数据

假如要可视化total_bill与tip的关系,同时考虑性别的影响,那么可以用如下代码。

上述代码将得到图35所示的输出,从图形可以看出Seaborn默认对整个图形样式(字体、大小、颜色、坐标轴等)进行了设置,这里使用的是darkgrid风格。replot()函数画的是散点图,col参数表明需要按不同性别进行可视化,hue参数代表根据是否吸烟来着色,size参数根据吃饭人数来决定散点大小。

同样的绘图代码,如果需要使用另一样式,通过代码sns.set(style='white')将得到如图36所示的可视化图。Seaborn在后台已经默默帮我们完成了底层的一切调整。

同时还可以修改调色板,如sns.set(palette='Paired')改为对比色,将得到如图37所示的图形。

感兴趣的读者还可以试试其他的样式,这里不再一一举例。

图35 账单与消费关系(darkgrid)

图36 账单与消费关系(white)

如何用python进行数据分析,利用python进行数据分析git

图37 账单与消费关系(对比色)

3.2Seaborn绘制统计图形

Seaborn另一强大的功能就是统计图形的绘制,下面以任天堂的精灵宝可梦游戏数据为例进行说明,如图38所示。

如何用python进行数据分析,利用python进行数据分析git

如何用python进行数据分析,利用python进行数据分析git

图38 游戏数据示例

上面的数据给出了各代宝可梦精灵的属性、攻击、防守能力等。首先来查看一下各种精灵的某个属性分布情况,此时可以通过分布图,使用如下代码来完成。

如何用python进行数据分析,利用python进行数据分析git

上述代码将输出如图39所示的叠加了概率密度曲线的直方图。

如何用python进行数据分析,利用python进行数据分析git

图39 叠加概率密度曲线的直方图

如果要可视化精灵某两种能力间的关系,如攻击力与防守力,可以使用如下代码。

如何用python进行数据分析,利用python进行数据分析git

此时将得到如图40所示的图形,lmplot()函数不仅绘制散点图,同时提供了回归线,以及置信区间。

如何用python进行数据分析,利用python进行数据分析git

图40 攻击力与防守力

如果想按第几代精灵来进行分析,那么可以使用如下代码。

如何用python进行数据分析,利用python进行数据分析git

通过hue参数,数据可视化时可以选择各代精灵采用不同颜色区别,同时fit_reg参数选择不画回归线,因为数据中有6代精灵,而多条回归线会让图形混乱,最终图形如图41所示。

如何用python进行数据分析,利用python进行数据分析git

图41 不同代精灵的防守力与攻击力

当然,Seaborn也可以与Matplotlib结合。例如,如果修改上面的图形坐标轴范围,可以加上下面的两行代码。

如何用python进行数据分析,利用python进行数据分析git

不过有的时候不只是想查看精灵的攻击力与防守力间的关系,分析人员还想同时了解攻击力与防守力各自的分布情况,此时就需要用到联合分布图,利用如下代码就可以得到二者的联合分布图,如图42所示。

如何用python进行数据分析,利用python进行数据分析git

如何用python进行数据分析,利用python进行数据分析git

图42 联合分布图

如果想查看精灵的攻防、速度等多个属性的分布,联合分布图就不是最佳方案,那么此时可以使用箱线图。只需要在boxplot()函数中传入对应的DataFrame就可以完成绘图,如下代码将输出图43所示的图形。

如何用python进行数据分析,利用python进行数据分析git

如何用python进行数据分析,利用python进行数据分析git

图43 查看多个属性分布的箱线图

boxplot()函数绘图时将自动选择传入数据中的数值列进行箱线图绘制,而对于非数值列则自动忽略。读者应该很容易就注意到上面的图形中X轴标记文本存在重叠,那么此时可以选择调整图形大小,或者旋转X轴标记文本的方法来解决该问题,这里将问题留给读者进行处理。除了使用箱线图,还可以使用violinplot()函数,这种图形是箱线图的改进,称为小提琴图。除了提供箱线图中的信息,它还提供了数据分布信息。例如,如果想查看Type 1类型精灵的各项属性分布,则可以用如下代码,最终得到图44。

如何用python进行数据分析,利用python进行数据分析git

如何用python进行数据分析,利用python进行数据分析git

图44 小提琴图

对应Seaborn中的绘图函数,使用时还可以指定调色板参数。例如,如下代码将输出图45。

如何用python进行数据分析,利用python进行数据分析git

如何用python进行数据分析,利用python进行数据分析git

图45 使用调色板

Seaborn除了支持上述两种可视化数据分布的图形外,还提供了对swarmplot()函数的支持,用户还可以将violinplot()与swarmplot()函数结合。例如,运行如下代码,得到图46和图47。

如何用python进行数据分析,利用python进行数据分析git

如何用python进行数据分析,利用python进行数据分析git

图46 swarmplot

如何用python进行数据分析,利用python进行数据分析git

图47 swarmplot叠加violinplot

代码段2是在同一个figure中绘制两个图形,因此得到图47,需要通过在swarmplot()函数中指定alpha参数来增加透明度,使得图形不会互相遮挡。掌握了上面的图形后,如果想绘制图48所示图形,应该怎么办?

如何用python进行数据分析,利用python进行数据分析git

图48 读者练习

这里不给出代码,希望读者能自行练习。简单提示如下:上面图形是swarmplot,使用了参数hue,它由'Type 1'决定,同时每种类型的分布图是并列的,因此dodge参数应该为True;而plt.legend(bbox_to_anchor=(1,1),loc=2)可以将图例放到右边。能够表达数据间关系的除了上述图形,还有一种应用广泛的图形——热力图,例如图49很好地将精灵的各项属性间的关系以图形的方式展示了出来,颜色越淡代表了相关性越强,如果读者习惯颜色深代表相关性强,那么可以通过修改cmap参数来完成,如cmap='rocket_r'。

如何用python进行数据分析,利用python进行数据分析git

图49 各属性间的相关性

实现上面图形的代码也非常简单,具体如下。

如何用python进行数据分析,利用python进行数据分析git

在Seaborn中探索数据时,常用到的一种方法就是在数据集的不同子集上绘制同一图的多个实例。这种技术有时被称为“facet”或“grid”绘图。通过这种方式,某种意义上将可视化的维度提高到了三维或四维,因此通过这一可视化方式,数据分析人员可以快速提取复杂数据的大量信息。例如,图50能让数据分析人员一眼就看出各代精灵的攻防关系,图51则可以让数据分析人员迅速发现是否吸烟、就餐时间是否对就餐人数与总账单间的关系有影响。

如何用python进行数据分析,利用python进行数据分析git

图50 各代精灵的攻防对比

如何用python进行数据分析,利用python进行数据分析git

图51 就餐人数与账单关系

要实现这样的可视化也非常简单,只需要运行如下代码。

如何用python进行数据分析,利用python进行数据分析git

这里Seaborn参考了R语言中ggplot的思想,首先通过FacetGrid()函数来指明想要可视化的数据,以何种方式进行布局。这个布局通过参数row和col来指定,row给出了按照行来进行分类的变量,col给出了按照列进行分类的变量,之后sns.FacetGrid()函数会返回一个新的FacetGrid对象,该对象包含了定义的布局。完成了绘图布局的定义,接下来需要将数据映射到这个布局,也就是绘制何种图形。以图50对应代码为例,可视化的目标是想针对不同Generation分列来观察df数据,因此会得到一个如图52所示的1行6列布局对象。上述代码通过g.map()函数告诉Seaborn可视化的数据是Attack和Defense这两列,用regplot来展示它们之间的关系。而图51与图50的区别在于不仅按照"smoker"来分行,还按照"time"来分列。

如何用python进行数据分析,利用python进行数据分析git

图52 FacetGrid