Python绘图与可视化

Python有不少可视化工具,本篇只介绍Matplotlib。css

Matplotlib是一种2D的绘图库,它能够支持硬拷贝和跨系统的交互,它能够在Python脚本、IPython的交互环境下、Web应用程序中使用。该项目是由John Hunter于2002年启动的,其目的是为Python构建一个MATLAB式的绘图接口。若是结合使用一种GUI工具包(如IPython),Matplotlib还具备诸如缩放和平移等交互功能。它不只支持各类操做系统上许多不一样的GUI后端,并且还能将图片导出为各类常见的食量(vector)和光栅(raster)图:PDF、SVG、JPG、PNG、BMP、GIF等。python

Matplotlib程序包数据库


 所谓“一图胜千言”,咱们不少时候须要经过可视化的方式查看、分析数据,虽然Pandas中也有一些绘图操做,可是相比较而言,Matplotlib在绘图显示效果方面更加出色。Python为Matplotlib提供了一个方便的接口,咱们能够经过Pyplot对Matplotlib进行操做,多数状况下,Pyplot的命令与MATLAB有些类似。后端

导入Matplotlib包进行简单的操做(此处须要安装pip install matplotlib):api

import matplotlib.pyplot as plt#约定俗成的写法plt
#首先定义两个函数(正弦&余弦)
import numpy as np

X=np.linspace(-np.pi,np.pi,256,endpoint=True)#-π to+π的256个值
C,S=np.cos(X),np.sin(X)
plt.plot(X,C)
plt.plot(X,S)
#在ipython的交互环境中须要这句话才能显示出来
plt.show()

输出结果:架构

 

绘图命令的基本架构及其属性设置app


 上面的例子咱们能够看出,几乎全部的属性和绘图的框架咱们都选用默认设置。如今咱们来看Pyplot绘图的基本框架是什么,用过Photoshop的人都知道,做图时先要定义一个画布,此处的画布就是Figure,而后再把其余素材“画”到该Figure上。框架

1)在Figure上建立子plot,并设置属性dom

x=np.linspace(0,10,1000)#X轴数据
y1=np.sin(x)#Y轴数据
y2=np.cos(x**2)#Y轴数据  x**2即x的平方

plt.figure(figsize=(8,4))

plt.plot(x,y1,label="$sin(x)$",color="red",linewidth=2)#将$包围的内容渲染为数学公式
plt.plot(x,y2,"b--",label="$cos(x^2)$")
#指定曲线的颜色和线性,如‘b--’表示蓝色虚线(b:蓝色,-:虚线)

plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")

'''
使用关键字参数能够指定所绘制的曲线的各类属性:
label:给曲线指定一个标签名称,此标签将在图标中显示。若是标签字符串的先后都有字符'$',则Matplotlib会使用其内嵌的LaTex引擎将其显示为数学公式
color:指定曲线的颜色。颜色能够用以下方法表示
       英文单词
       以‘#’字符开头的3个16进制数,如‘#ff0000’表示红色。
       以0~1的RGB表示,如(1.0,0.0,0.0)也表示红色。
linewidth:指定权限的宽度,能够不是整数,也可使用缩写形式的参数名lw。
'''

plt.ylim(-1.5,1.5)
plt.legend()#显示左下角的图例

plt.show()

2)在Figure上建立多个子plot编辑器

若是须要绘制多幅图表的话,能够给Figure传递一个整数参数指定图表的序号,若是所指定序号的绘图对象已经存在的话,将不建立新的对象,而只是让它成为当前绘图对象。

fig1=plt.figure(2)
plt.subplot(211)
#subplot(211)把绘图区域等分为2行*1列共两个区域,而后在区域1(上区域)中建立一个轴对象
plt.subplot(212)#在区域2(下区域)建立一个轴对象
plt.show()

输出结果:

咱们还能够经过命令再次拆分这些块(至关于Word中拆分单元格操做)

f1=plt.figure(5)#弹出对话框时的标题,若是显示的形式为弹出对话框的话
plt.subplot(221)
plt.subplot(222)
plt.subplot(212)
plt.subplots_adjust(left=0.08,right=0.95,wspace=0.25,hspace=0.45)
# subplots_adjust的操做时相似于网页css格式化中的边距处理,左边距离多少?
# 右边距离多少?这取决于你须要绘制的大小和各个模块之间的间距
plt.show()

输出结果:

3)经过Axes设置当前对象plot的属性

 以上咱们操做的是在Figure上绘制图案,可是当咱们绘制图案过多,又须要选取不一样的小模块进行格式化设置时,Axes对象就能很好地解决这个问题。

fig,axes=plt.subplots(nrows=2,ncols=2)#定一个2*2的plot
plt.show()

输出结果:

如今咱们须要经过命令来操做每一个plot(subplot),设置它们的title并删除横纵坐标值。

fig,axes=plt.subplots(nrows=2,ncols=2)#定一个2*2的plot
axes[0,0].set(title='Upper Left')
axes[0,1].set(title='Upper Right')
axes[1,0].set(title='Lower Left')
axes[1,1].set(title='Lower Right')

# 经过Axes的flat属性进行遍历
for ax in axes.flat:
#     xticks和yticks设置为空置
    ax.set(xticks=[],yticks=[])
plt.show()

输出结果:

另外,实际来讲,plot操做的底层操做就是Axes对象的操做,只不过若是咱们不使用Axes而用plot操做时,它默认的是plot.subplot(111),也就是说plot实际上是Axes的特例。

 4)保存Figure对象

最后一项操做就是保存,咱们绘图的目的是用在其余研究中,或者但愿能够把研究结果保存下来,此时须要的操做时save。

plt.savefig(r"C:\Users\123\Desktop\save_test.png",dpi=520)#默认像素dpi是80

很明显保存的像素越高,内存越大。此处只是用了savefig属性对Figure进行保存。

另外,除了上述的基本操做以外,Matplotlib还有其余的绘图优点,此处只是简单介绍了它在绘图时所须要注意的事项,更多的属性设置请参考:https://matplotlib.org/api/

 

Seaborn模块介绍


 前面咱们简单介绍了Matplotlib库的绘图功能和属性设置,对于常规性的绘图,使用Pandas的绘图功能已经足够了,但若是对Matplotlib的API属性研究较为透彻,几乎没有不能解决的问题。可是Matplotlib仍是有它的不足之处,Matplotlib自动化程度很是高,可是,掌握如何设置系统以便得到一个吸引人的图是至关困难的事。为了控制Matplotlib图表的外观,Seaborn模块自带许多定制的主题和高级的接口。

1)未加Seaborn模块的效果

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

np.random.seed(sum(map(ord,"aesthetics")))
#首先定义一个函数用来画正弦函数,可帮助了解能够控制的不一样风格参数
def sinplot(flip=1):
    x=np.linspace(0,14,100)
    for i in range(1,7):
        plt.plot(x,np.sin(x+i*0.5)*(7-i)*flip)
sinplot()
plt.show()

输出结果:

2)加入Seaborn模块的效果

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

# 添加了Seaborn模块

np.random.seed(sum(map(ord,"aesthetics")))
#首先定义一个函数用来画正弦函数,可帮助了解能够控制的不一样风格参数
def sinplot(flip=1):
    x=np.linspace(0,14,100)
    for i in range(1,7):
        plt.plot(x,np.sin(x+i*0.5)*(7-i)*flip)
#转换成Seaborn模块,只须要引入seaborn模块
import seaborn as sns#添加Seaborn模块
sinplot()
plt.show()

输出效果:

小编使用的jupyter notebook编辑器,使用与不使用Seaborn模块效果差异不明显。

使用Seaborn的优势有:

  1. Seaborn默认浅灰色背景与白色网格线的灵感来源于Matplotlib,却比Matplotlib的颜色更加柔和
  2. Seaborn把绘图风格参数与数据参数分开设置。

其中,Seaborn有两组函数对风格进行控制:axes_style()/set_style()函数和plotting_context()/set_context()函数。

axes_style()函数和plotting_context()函数返回参数字典,set_style()函数和set_context()函数设置Matplotlib。

使用set_style()函数

import seaborn as sns

'''
Seaborn有5种预约义的主题:
darkgrid(灰色背景+白网格)
whitegrid(白色背景+黑网格)
dark(仅灰色背景)
white(仅白色背景)
ticks(坐标轴带刻度)
默认的主题是darkgrid,修改主题可使用set_style函数
'''
sns.set_style("whitegrid")
sinplot()#即上段代码中定义的函数
plt.show()

输出结果:

使用set_context()函数

'''
上下文(context)能够设置输出图片的大小尺寸(scale)
Seaborn中预约义的上下文有4种:paper、notebook、talk和poster
默认使用notebook上下文
'''
sns.set_context("poster")
sinplot()#即前文定义的函数
plt.show()

输出结果:

使用Seaborn“耍酷”

 然而Seaborn不只可以用来更改背景颜色,或者改变画布大小,还有其余不少方面的用途,好比下面的例子。

'''
Annotated heatmaps
================================
'''
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

#经过加载sns自带数据库中的数据(具体数据能够不关心)
flights_long=sns.load_dataset("flights")
flights=flights_long.pivot("month","year","passengers")

# 使用每一个单元格中的数据值绘制一个热力图heatmap
sns.heatmap(flights,annot=True,fmt="d",linewidths=.5)
plt.show()

输出结果:

描述性统计图形概览


 描述性统计是借助图表或者总结性的数值来描述数据的统计手段。数据挖掘工做的数据分析阶段,咱们可借助描述性统计来描绘或总结数据的基本状况,一来能够梳理本身的思惟,而来能够更好地向他人展现数据分析结果。数值分析的过程当中,咱们每每要计算出数据的统计特征,用来作科学计算的Numpy和Scipy工具能够知足咱们的需求。Matplotlib工具可用来绘制图,知足图分析的需求。

1)制做数据

数据是本身制做的,主要包括我的身高、体重及一年的借阅图书量(之因此本身制做数据是由于不是每份真实的数据均可以进行接下来的分析,好比有些数据就不能绘制饼图,另外一个角度也说明,此处举例的数据其实没有实际意义,只是为了分析二举例,可是不表明在具体的应用中这些分析不能发挥做用)。

另外,如下的数据显示都是在Seaborn库的做用下体现的效果。

# 案例分析
from numpy import array
from numpy.random import normal

def getData():
    heights=[]
    weights=[]
    books=[]
    N=10000
    for i in range(N):
        while True:
            #身高服从均值为172,标准差为6的正态分布
            height=normal(172,6)
            if 0<height:
                break
        while True:
            #体重由身高做为自变量的线性回归模型产生,偏差服从标准正态分布
            weight=(height-80)*0.7+normal(0,1)
            if 0<weight:
                break
        while True:
            #借阅量服从均值为20,标准差为5的正态分布
            number=normal(20,5)
            if 0<=number and number<=50:
                book='E' if number<10 else ('D' if number<15 else ('C' if number<20 else ('B' if number<25 else 'A')))
                break
        heights.append(height)
        weights.append(weight)
        books.append(book)
   return array(heights),array(weights),array(books)
heights,weights,books=getData()

2)频数分析

(1)定性分析

柱状图和饼形图是对定性数据进行频数分析的经常使用工具,使用前需将每一类的频数计算出来。

柱状图。柱状图是以柱的高度来指代某类型的频数,使用Matplotlib对图书借阅量这必定性变量绘制柱状图的代码以下。(接上段代码)

from matplotlib import pyplot

#绘制柱状图
def drawBar(books):
    xticks=['A','B','C','D','E']
    bookGroup={}
    #对每一类借阅量进行频数统计
    for book in books:
        bookGroup[book]=bookGroup.get(book,0)+1
    #建立柱状图
    #第一个参数为柱的横坐标
    #第二个参数为柱的高度
    #参数align为柱的对齐方式,以第一个参数为参考标准
    pyplot.bar(range(5),[bookGroup.get(xtick,0) for xtick in xticks],align='center')
    
    #设置柱的文字说明
    #第一个参数为文字说明的横坐标
    #第二个参数为文字说明的内容
    pyplot.xticks(range(5),xticks)
    #设置横坐标的文字说明
    pyplot.xlabel("Types of Students")
    #设置纵坐标的文字说明
    pyplot.ylabel("Frequency")
    #设置标题
    pyplot.title("Numbers of Books Students Read")
    #绘图
    pyplot.show()
drawBar(books)

输出结果:

饼形图。饼形图事宜扇形的面积来指代某类型的频率,使用Matplotlib对图书借阅量这必定性变量绘制饼形图的代码以下:

#绘制饼形图
def drawPie(books):
    labels=['A','B','C','D','E']
    bookGroup={}
    for book in books:
        bookGroup[book]=bookGroup.get(book,0)+1
    #建立饼形图
    #第一个参数是扇形的面积
    #labels参数为扇形的说明文字
    #autopct参数为扇形占比的显示格式
    pyplot.pie([bookGroup.get(label,0) for label in labels],labels=labels,autopct='%1.1f%%')
    pyplot.title("Number of Books Students Read")
    pyplot.show()
drawPie(books)

输出结果:

(2)定量分析

直方图相似于柱状图,是用柱的高度来指代频数,不一样的是其将定量数据划分为若干连续的区间,在这些连续的区间上绘制柱。

直方图。使用Matplotlib对身高这必定量变量绘制直方图的代码以下:

#绘制直方图
def drawHist(heights):
    #建立直方图
    #第一个参数为待绘制的定量数据,不一样于定性数据,这里并无实现进行频数统计
    #第二个参数为划分的区间个数
    pyplot.hist(heights,100)
    pyplot.xlabel('Heights')
    pyplot.ylabel('Frequency')
    pyplot.title('Height of Students')
    pyplot.show()
drawHist(heights)

输出结果:

累积曲线。使用Matplotlib对身高这必定量变量绘制累积曲线的代码以下:

#绘制累积曲线
def drawCumulativaHist(heights):
    #建立累积曲线
    #第一个参数为待绘制的定量数据
    #第二个参数为划分的区间个数
    #normal参数为是否无量纲化
    #histtype参数为‘step’,绘制阶梯状的曲线
    #cumulative参数为是否累积
    pyplot.hist(heights,20,normed=True,histtype='step',cumulative=True)
    pyplot.xlabel('Heights')
    pyplot.ylabel('Frequency')
    pyplot.title('Heights of Students')
    pyplot.show()
drawCumulativaHist(heights)

输出结果:

3)关系分析

 散点图。在散点图中,分别以自变量和因变量做为横坐标。当自变量与因变量线性相关时,散点图中的点近似分布在一条直线上。咱们以身高做为自变量,体重做为因变量,讨论身高对体重的影响。使用Matplotlib绘制散点图的代码以下:

#绘制散点图
def drawScatter(heights,weights):
    #建立散点图
    #第一个参数为点的横坐标
    #第二个参数为点的纵坐标
    pyplot.scatter(heights,weights)
    pyplot.xlabel('Heights')
    pyplot.ylabel('Weight')
    pyplot.title('Heights & Weight of Students')
    pyplot.show()
drawScatter(heights,weights)

输出结果:

4)探索分析

 箱型图。在不明确数据分析的目标时,咱们对数据进行一些探索性的分析,能够知道数据的中心位置、发散程度及误差程度。使用Matplotlib绘制关于身高的箱型图代码以下:

#绘制箱型图
def drawBox(heights):
    #建立箱型图
    #第一个参数为待绘制的定量数据
    #第二个参数为数据的文字说明
    pyplot.boxplot([heights],labels=['Heights'])
    pyplot.title('Heights of Students')
    pyplot.show()
drawBox(heights)

输出结果:

注:

  • 上四分位数与下四分位数的差叫四分位差,它是衡量数据发散程度的指标之一
  • 上界线和下界线是距离中位数1.5倍四分位差的线,高于上界线或者低于下界线的数据为异常值

 描述性统计是容易操做、直观简洁的数据分析手段。可是因为简单,对于多元变量的关系难以描述。现实生活中,自变量一般是多元的:决定体重的不只有身高,还有饮食习惯、肥胖基因等因素。经过一些高级的数据处理手段,咱们能够对多元变量进行处理,例如,特征工程中,可使用互信息方法来选择多个对因变量有较强相关性的自变量做为特征,还可使用主成分分析法来消除一些冗余的自变量来下降运算复杂度。

 

 参考书目:《数据馆员的Python简明手册》