数极客首页

有这5小段代码在手,轻松实现数据可视化(Python+Matplotlib)

大数据文摘作品

编译:傅一洋、吴双、龙牧雪

本文要讲的是Matplotlib,一个强大的Python可视化库。一共5小段代码,轻松完成
散点图、折线图、直方图、柱状图、箱线图,每段代码只需

10行,也是再简单不过了吧!

数据可视化是数据科学家工作的一项主要任务。在项目早期阶段,通常会中止

探求

数据剖析

(EDA)以获取对数据的了解

和洞察,特别
关于
大型高维的数据集,数据可视化着实有助于使数据关系更明晰
易懂。

同时在项目终了

时,以明晰
、简约
和引人注目

的方式展示

最终结果也是十分

重要的,由于
受众常常
是非技术性客户,只需

这样,他们才更容易去了解

Matplotlib是个很盛行
的Python库,能够

轻松完成
数据可视化。但是,每次执行新项目的绘图时,设置数据、参数、图形的过程都十分

的繁琐。 在本文中,我们将着眼于5种数据可视化办法

,用Python的Matplotlib库完成
一些快速而简单的功用

第一
,请大家看看这张大的地图,它能指引你依据

不同状况

,选择正确的可视化办法

依据

状况

选择恰当
数据可视化技术

散点图

散点图十分

适合

展示

两个变量间关系,由于
,图中能够

直接看出数据的原始散布

。还能够

经过
设置不同的颜色,轻松地查看不同组数据间的关系,如下图所示。那假定

想要可视化三个变量之间的关系呢?没问题!只需再添加一个参数(如点的大小)来表示第三个变量就能够

了,如下面第二个图所示。

往常

来写代码。第一
导入Matplotlib库的pyplot子库,并命名为plt。运用
plt.subplots()命令创建

一个新的图。将x轴和y轴数据传送
给相应数组x_data和y_data,然后将数组和其他参数传送
给ax.scaer()以绘制散点图。我们还能够

设置点的大小、颜色和alpha透明度,致使

将y轴设置成对数坐标。最终
再为该图设置好必要的标题和轴标签。这个函数轻松地完成
了端到端的绘图!

import matplotlib.pyplot as plt
import numpy as np

def scaerplot(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.scaer(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人群所占比例的直方图。从中能够

分明

地看出中心希冀
值和中位数,看出它遵照
正态散布

。运用
直方图(而不是散点图)能够

分明

地显现
出不同组数据频率之间的相对差别

。而且,分组(使数据离散化)有助于看出“更宏观的散布

”,若运用
未被离散化的数据点,可能会产生大量数据噪声,从而很难看出数据的真实散布

正态散布

的IQ

下面是用Matplotlib库创建

直方图的代码。这里有两个参数需求
留意
。第一个参数是n_BIs参数,用于控制直方图的离散度。一方面,更多的分组数能提供更细致
的信息,但可能会引入数据噪声使结果偏离宏观散布

;另一方面,更少的分组数能提供更宏观的数据“俯瞰
”,在不需求
太多细节的状况

下能更全面天文

数据整体状况

。第二个参数是累积参数cumulative,是一个布尔值,经过
它控制直方图能否
累积,也就是选择运用
概率密度函数(PDF)还是累积密度函数(CDF)。

def histogram(data, n_BIs, cumulative=False, x_label = “”, y_label = “”, title = “”):
_, ax
= plt.subplots()
ax.hist(data, n_BIs = n_BIs, 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 them
def overlaid_histogram(data1, data2, n_BIs = 0, data1_name=””, data1_color=”#539caf”, data2_name=””, data2_color=”#7663b0″, x_label=””, y_label=””, title=””):
# Set the bounds for the BIs so that the two distributions are fairly compared
max_nBIs
= 10
data_range = [min(min(data1), min(data2)), max(max(data1), max(data2))]
BIwidth = (data_range[1] – data_range[0]) / max_nBIs

if n_BIs == 0
BIs = np.arange(data_range[0], data_range[1] + BIwidth, BIwidth)
else:
BIs = n_BIs

# Create the plot
_, ax = plt.subplots()
ax.hist(data1, BIs = BIs, color = data1_color, alpha = 1, label = data1_name)
ax.hist(data2, BIs = BIs, 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个)的分类数据中止

可视化。但在类别太多时,图中的柱体就会容易堆在一同
,显得十分

乱,对数据的了解

构成

艰难

。柱状图适合

于分类数据的缘由
,一是能依据

柱体的高度(即长短)轻松地看出类别之间的差别

,二是很容易将不同类别加以辨别

,致使

赋予不同颜色。以下引见
三种类

型的柱状图:常规柱状图,分组柱状图和堆积柱状图。参考代码来看细致
的阐明

常规柱状图,如下图所示。代码中,barplot()函数的x_data参数表示x轴坐标,y_data代表y轴(柱体的高度)坐标,yerr表示在每个柱体顶部中央显现
的规范

倾向

线。

分组柱状图,如下图所示。它允许对多个分类变量中止

对比

。如图所示,两组关系其一是分数与组(组G1,G2,…等)的关系,其二是用颜色辨别

的性别之间的关系。代码中,y_data_list是一个列表,其中又包含多个子列表,每个子列表代表一个组。对每个列表赋予x坐标,循环遍历其中的每个子列表,设置成不同颜色,绘制出分组柱状图。

堆积柱状图,适合

可视化含有子分类的分类数据。下面这张图是用堆积柱状图展示

的日常效劳
器负载状况

统计。运用
不同颜色中止

堆叠,对不同效劳
器之间中止

比较

,从而能查看并了解

每天中哪台效劳
器的工作效率最高,负载细致

为多少。代码与柱状图样式

相同,同样为循环遍历每个组,只是这次是在旧柱体基础

上堆叠,而不是在其旁边绘制新柱体。

以下是三种堆积柱状图的代码:

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 boom of the
# bar will be the top of the last category
ax.bar(x_data, y_data_list[i], color = colors[i], boom = 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’
# 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%),箱体内的横线为第二四分位数(即中位数)。箱体上下的延伸线(即T型虚线)表示数据的上下限。

由于箱形图是为每个组或变量绘制的,因而

设置起来十分

容易。x_data是组或变量的列表,x_data中的每个值对应于y_data中的一列值(一个列向量)。用Matplotlib库的函数boxplot()为y_data的每列值(每个列向量)生成一个箱形,然后设定箱线图中的各个参数就能够

了。

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个快速简单的数据可视化办法

了!将功用
和办法

包装成函数,总是会使代码的编写和阅读都变的更简单!希望这篇文章能对你有所辅佐

,希望你能从中学到学问
!假定

喜欢就点个赞吧!

原文链接:https://towardsdatascience.com/5-quick-and-easy-data-visualizations-in-python-with-code-a2284bae952f

发表评论

评论已关闭。

相关文章