Bootstrap

Python Matplotlib实现数据可视化的5种方法详解

前言

数据科学家并不逊色于艺术家。他们用数据可视化的方式绘画,试图展现数据内隐藏的模式或表达对数据的见解。更有趣的是,一旦接触到任何可视化的内容、数据时,人类会有更强烈的知觉、认知和交流。

数据可视化是数据科学家工作中的重要组成部分。在项目的早期阶段,你通常会进行探索性数据分析(Exploratory Data Analysis,EDA)以获取对数据的一些理解。创建可视化方法确实有助于使事情变得更加清晰易懂,特别是对于大型、高维数据集。在项目结束时,以清晰、简洁和引人注目的方式展现最终结果是非常重要的,因为你的受众往往是非技术型客户,只有这样他们才可以理解。

Matplotlib 是一个流行的 Python 库,可以用来很简单地创建数据可视化方案。但每次创建新项目时,设置数据、参数、图形和排版都会变得非常繁琐和麻烦。在这篇博文中,我们将着眼于 5 个数据可视化方法,并使用 Python Matplotlib 为他们编写一些快速简单的函数。与此同时,这里有一个很棒的图表,可用于在工作中选择正确的可视化方法!

一、散点图

散点图非常适合展示两个变量之间的关系,因为你可以直接看到数据的原始分布。 如下面第一张图所示的,你还可以通过对组进行简单地颜色编码来查看不同组数据的关系。想要可视化三个变量之间的关系? 没问题! 仅需使用另一个参数(如点大小)就可以对第三个变量进行编码,如下面的第二张图所示。

现在开始讨论代码。我们首先用别名 “plt” 导入 Matplotlib 的 pyplot 。要创建一个新的点阵图,我们可调用 plt.subplots() 。我们将 x 轴和 y 轴数据传递给该函数,然后将这些数据传递给 ax.scatter() 以绘制散点图。我们还可以设置点的大小、点颜色和 alpha 透明度。你甚至可以设置 Y 轴为对数刻度。标题和坐标轴上的标签可以专门为该图设置。这是一个易于使用的函数,可用于从头到尾创建散点图!

import matplotlib.pyplot as pltimport numpy as npdef scatterplot(x\_data, y\_data, x\_label="", y\_label="", title="", color = "r", yscale\_log=False): 
 # Create the plot object 
 \_, ax = plt.subplots() # Plot the data, set the size (s), color and transparency (alpha) 
 # of the points 
 ax.scatter(x\_data, y\_data, s = 10, color = color, alpha = 0.75) if yscale\_log == True: 
 ax.set\_yscale('log') # Label the axes and provide a title 
 ax.set\_title(title) 
 ax.set\_xlabel(x\_label) 
 ax.set\_ylabel(y\_label) 

二、折线图

当你可以看到一个变量随着另一个变量明显变化的时候,比如说它们有一个大的协方差,那最好使用折线图。让我们看一下下面这张图。我们可以清晰地看到对于所有的主线随着时间都有大量的变化。使用散点绘制这些将会极其混乱,难以真正明白和看到发生了什么。折线图对于这种情况则非常好,因为它们基本上提供给我们两个变量(百分比和时间)的协方差的快速总结。另外,我们也可以通过彩色编码进行分组。

这里是折线图的代码。它和上面的散点图很相似,只是在一些变量上有小的变化。

def lineplot(x\_data, y\_data, x\_label="", y\_label="", title=""): 
 # Create the plot object 
 \_, ax = plt.subplots() # Plot the best fit line, set the linewidth (lw), color and 
 # transparency (alpha) of the line 
 ax.plot(x\_data, y\_data, lw = 2, color = '#539caf', alpha = 1) # Label the axes and provide a title 
 ax.set\_title(title) 
 ax.set\_xlabel(x\_label) 
 ax.set\_ylabel(y\_label) 

三、直方图

直方图对于查看(或真正地探索)数据点的分布是很有用的。查看下面我们以频率和 IQ 做的直方图。我们可以清楚地看到朝中间聚集,并且能看到中位数是多少。我们也可以看到它呈正态分布。使用直方图真得能清晰地呈现出各个组的频率之间的相对差别。组的使用(离散化)真正地帮助我们看到了“更加宏观的图形”,然而当我们使用所有没有离散组的数据点时,将对可视化可能造成许多干扰,使得看清真正发生了什么变得困难。

下面是在 Matplotlib 中的直方图代码。有两个参数需要注意一下:首先,参数 n_bins 控制我们想要在直方图中有多少个离散的组。更多的组将给我们提供更加完善的信息,但是也许也会引进干扰,使得我们远离全局;另一方面,较少的组给我们一种更多的是“鸟瞰图”和没有更多细节的全局图。其次,参数 cumulative 是一个布尔值,允许我们选择直方图是否为累加的,基本上就是选择是 PDF(Probability Density Function,概率密度函数)还是 CDF(Cumulative Density Function,累积密度函数)。

def histogram(data, n\_bins, cumulative=False, x\_label = "", y\_label = "", title = ""): 
 \_, ax = plt.subplots() 
 ax.hist(data, n\_bins = n\_bins, cumulative = cumulative, color = '#539caf') 
 ax.set\_ylabel(y\_label) 
 ax.set\_xlabel(x\_label) 
 ax.set\_title(title) 

想象一下我们想要比较数据中两个变量的分布。有人可能会想你必须制作两张直方图,并且把它们并排放在一起进行比较。然而,实际上有一种更好的办法:我们可以使用不同的透明度对直方图进行叠加覆盖。看下图,均匀分布的透明度设置为 0.5 ,使得我们可以看到他背后的图形。这样我们就可以直接在同一张图表里看到两个分布。

对于重叠的直方图,需要设置一些东西。首先,我们设置可同时容纳不同分布的横轴范围。根据这个范围和期望的组数,我们可以真正地计算出每个组的宽度。最后,我们在同一张图上绘制两个直方图,其中有一个稍微更透明一些。

\# Overlay 2 histograms to compare themdef overlaid\_histogram(data1, data2, n\_bins = 0, data1\_name="", data1\_color="#539caf", data2\_name="", data2\_color="#7663b0", x\_label="", y\_label="", title=""): 
 # Set the bounds for the bins so that the two distributions are fairly compared 
 max\_nbins = 10 
 data\_range = \[min(min(data1), min(data2)), max(max(data1), max(data2))\] 
 binwidth = (data\_range\[1\] - data\_range\[0\]) / max\_nbins if n\_bins == 0 
 bins = np.arange(data\_range\[0\], data\_range\[1\] + binwidth, binwidth) else: 
 bins = n\_bins # Create the plot 
 \_, ax = plt.subplots() 
 ax.hist(data1, bins = bins, color = data1\_color, alpha = 1, label = data1\_name) 
 ax.hist(data2, bins = bins, color = data2\_color, alpha = 0.75, label = data2\_name) 
 ax.set\_ylabel(y\_label) 
 ax.set\_xlabel(x\_label) 
 ax.set\_title(title) 
 ax.legend(loc = 'best') 

四、柱状图

当你试图将类别很少(可能小于10)的分类数据可视化的时候,柱状图是最有效的。如果我们有太多的分类,那么这些柱状图就会非常杂乱,很难理解。柱状图对分类数据很好,因为你可以很容易地看到基于柱的类别之间的区别(比如大小);分类也很容易划分和用颜色进行编码。我们将会看到三种不同类型的柱状图:常规的,分组的,堆叠的。在我们进行的过程中,请查看图形下面的代码。

常规的柱状图如下面的图1。在 barplot() 函数中,xdata 表示 x 轴上的标记,ydata 表示 y 轴上的杆高度。误差条是一条以每条柱为中心的额外的线,可以画出标准偏差。

分组的柱状图让我们可以比较多个分类变量。看看下面的图2。我们比较的第一个变量是不同组的分数是如何变化的(组是G1,G2,……等等)。我们也在比较性别本身和颜色代码。看一下代码,y_data_list 变量实际上是一个 y 元素为列表的列表,其中每个子列表代表一个不同的组。然后我们对每个组进行循环,对于每一个组,我们在 x 轴上画出每一个标记;每个组都用彩色进行编码。

堆叠柱状图可以很好地观察不同变量的分类。在图3的堆叠柱状图中,我们比较了每天的服务器负载。通过颜色编码后的堆栈图,我们可以很容易地看到和理解哪些服务器每天工作最多,以及与其他服务器进行比较负载情况如何。此代码的代码与分组的条形图相同。我们循环遍历每一组,但这次我们把新柱放在旧柱上,而不是放在它们的旁边。

def barplot(x\_data, y\_data, error\_data, x\_label="", y\_label="", title=""): 
 \_, ax = plt.subplots() 
 # Draw bars, position them in the center of the tick mark on the x-axis 
 ax.bar(x\_data, y\_data, color = '#539caf', align = 'center') 
 # Draw error bars to show standard deviation, set ls to 'none' 
 # to remove line between points 
 ax.errorbar(x\_data, y\_data, yerr = error\_data, color = '#297083', ls = 'none', lw = 2, capthick = 2) 
 ax.set\_ylabel(y\_label) 
 ax.set\_xlabel(x\_label) 
 ax.set\_title(title) 
 
def stackedbarplot(x\_data, y\_data\_list, colors, y\_data\_names="", x\_label="", y\_label="", title=""): 
 \_, ax = plt.subplots() 
 # Draw bars, one category at a time 
 for i in range(0, len(y\_data\_list)): 
 if i == 0: 
  ax.bar(x\_data, y\_data\_list\[i\], color = colors\[i\], align = 'center', label = y\_data\_names\[i\]) 
 else: 
  # For each category after the first, the bottom of the 
  # bar will be the top of the last category 
  ax.bar(x\_data, y\_data\_list\[i\], color = colors\[i\], bottom = y\_data\_list\[i - 1\], align = 'center', label = y\_data\_names\[i\]) 
 ax.set\_ylabel(y\_label) 
 ax.set\_xlabel(x\_label) 
 ax.set\_title(title) 
 ax.legend(loc = 'upper right') 
 
def groupedbarplot(x\_data, y\_data\_list, colors, y\_data\_names="", x\_label="", y\_label="", title=""): 
 \_, ax = plt.subplots() 
 # Total width for all bars at one x location 
 total\_width = 0.8 
 # Width of each individual bar 
 ind\_width = total\_width / len(y\_data\_list) 
 # This centers each cluster of bars about the x tick mark 
 alteration = np.arange(-(total\_width/2), total\_width/2, ind\_width) 
 
 # Draw bars, one category at a time 
 for i in range(0, len(y\_data\_list)): 
 # Move the bar to the right on the x-axis so it doesn't 
 # overlap with previously drawn ones 
 ax.bar(x\_data + alteration\[i\], y\_data\_list\[i\], color = colors\[i\], label = y\_data\_names\[i\], width = ind\_width) 
 ax.set\_ylabel(y\_label) 
 ax.set\_xlabel(x\_label) 
 ax.set\_title(title) 
 ax.legend(loc = 'upper right') 

五、箱形图

我们之前看了直方图,它很好地可视化了变量的分布。但是如果我们需要更多的信息呢?也许我们想要更清晰的看到标准偏差?也许中值与均值有很大不同,我们有很多离群值?如果有这样的偏移和许多值都集中在一边呢?

这就是箱形图所适合干的事情了。箱形图给我们提供了上面所有的信息。实线框的底部和顶部总是第一个和第三个四分位(比如 25% 和 75% 的数据),箱体中的横线总是第二个四分位(中位数)。像胡须一样的线(虚线和结尾的条线)从这个箱体伸出,显示数据的范围。

由于每个组/变量的框图都是分别绘制的,所以很容易设置。xdata 是一个组/变量的列表。Matplotlib 库的 boxplot() 函数为 ydata 中的每一列或每一个向量绘制一个箱体。因此,xdata 中的每个值对应于 ydata 中的一个列/向量。我们所要设置的就是箱体的美观。

def boxplot(x\_data, y\_data, base\_color="#539caf", median\_color="#297083", x\_label="", y\_label="", title=""): 
 \_, ax = plt.subplots() 
 # Draw boxplots, specifying desired style 
 ax.boxplot(y\_data 
    # patch\_artist must be True to control box fill 
    , patch\_artist = True 
    # Properties of median line 
    , medianprops = {'color': median\_color} 
    # Properties of box 
    , boxprops = {'color': base\_color, 'facecolor': base\_color} 
    # Properties of whiskers 
    , whiskerprops = {'color': base\_color} 
    # Properties of whisker caps 
    , capprops = {'color': base\_color}) 
 
 # By default, the tick label starts at 1 and increments by 1 for 
 # each box drawn. This sets the labels to the ones we want 
 ax.set\_xticklabels(x\_data) 
 ax.set\_ylabel(y\_label) 
 ax.set\_xlabel(x\_label) 
 ax.set\_title(title) 

总结

使用 Matplotlib 有 5 个快速简单的数据可视化方法。将相关事务抽象成函数总是会使你的代码更易于阅读和使用!我希望你喜欢这篇文章,并且学到了一些新的有用的技巧。如果你确实如此,请随时给它点赞。


关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

👉CSDN大礼包:《Python入门资料&实战源码&安装工具】免费领取安全链接,放心点击

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、Python基础学习视频

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述
因篇幅有限,仅展示部分资料

三、精品Python学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、Python工具包+项目源码合集
①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

六、Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述
在这里插入图片描述
这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;