利用matplotlib进行可视化
1、Matplotlib 基本介绍
- Matplotlib 是一个在 python 下实现的类 matlab 的纯 python 的第三方库,旨在用 python实现matlab 的功能,是python下最出色的绘图库。其风格跟 matlab 相似,同时也继承了 python 的简单明了。
- 要使用matplotlib得先安装 numpy 库 (一个python下数组处理的第三方库,可以很方便的处理矩阵,数组) 。
- matplotlib 对于图像美化方面比较完善,可以自定义线条的颜色和样式,可以在一张绘图纸上绘制多张小图,也可以在一张图上绘制多条线,可以很方便地将数据可视化并对比分析。
- Matplotlib模块依赖于NumPy和tkinter模块,可以绘制多种形式的图形,包括线图、直方图、饼图、散点图等,图形质量满足出版要求,是数据可视化的重要工具。
- Matplotlib中应用最广的是matplotlib.pyplot模块。
- Pyplot提供了一套和Matlab类似的绘图API,使得Matplotlib的机制更像Matlab。我们只需要调用Pyplot模块所提供的函数就可以实现快速绘图并设置图表的各个细节。
- 在Jupyter notebook中进行交互式绘图,需要执行一下语句:
% matplotlib notebook - 使用matplotlib时,使用的导入惯例为:
import matplotlib.pyplot as plt
2、Matplotlib绘图基础

- figure():创建一个新的绘图窗口。
- figtext():为figure添加文字
- axes():为当前figure添加一个坐标轴
- plot():绘图函数
- polar():绘制极坐标图
- axis():获取或设置轴属性的边界方法(坐标的取值范围)
- clf : 清除当前figure窗口 cla : 清除当前axes窗口
- close : 关闭当前figure窗口
- subplot : 一个图中包含多个axes
- text(): 在轴上添加文字
- title(): 设置当前axes标题
- xlabel/ylabel:设置当前X轴或Y轴的标签
- hist():绘制直方图
- hist2d():绘制二维在直方图
- hold :设置当前图窗状态;off或者on
- imread():读取一个图像,从图形文件中提取数组
- legend():为当前axes放置标签
- pie():绘制饼状图
- scatter():做一个X和Y的散点图,其中X和Y是相同长度的序列对象
- stackplot():绘制一个堆叠面积图
- acorr():绘制X的自相关函数
- annotate():用箭头在指定的数据点创建一个注释或一段文本
- bar():绘制垂直条形图 barh():绘制横向条形图
- barbs():绘制一个倒钩的二维场
创建画布与创建子图
| 函数名称 | 函数作用 |
|---|---|
| plt.figure | 创建一个空白画布,可以指定画布大小,像素。 |
| figure.add_subplot | 创建并选中子图,可以指定子图的行数,列数,与选中图片编号。 |
第一部分主要作用是构建出一张空白的画布,并可以选择是否将整个画布划分为多个部分,方便在同一幅图上绘制多个图形的情况。最简单的绘图可以省略第一部分,而后直接在默认的画布上进行图形绘制。
1import matplotlib.pyplot as plt 2import numpy as np 3data=np.arange(10) 4plt.plot(data)

绘制的图位于图片(figure)对象中。
创建子图
1 import matplotlib.pyplot as plt 2fig = plt.figure() 3#不能使用空白的figure绘图,需要创建子图 4ax1 = fig.add_subplot(2,2,1) 5ax2 = fig.add_subplot(2,2,2) 6ax3 = fig.add_subplot(2,2,3)

子图绘制
1 fig = plt.figure() 2ax1 = fig.add_subplot(2,2,1) 3ax2 = fig.add_subplot(2,2,2) 4ax3 = fig.add_subplot(2,2,3) 5ax1.plot([1.5,2,3.5,-1,1.6])

可以用语句Fig , axes = plt.subplots(2,3) 创建一个新的图片,然后返回包含了已生成子图对象的NumPy数组。数组axes可以像二维数组那样方便地进行索引,如axes[0,1]。也可以通过sharex和sharey表明子图分别拥有相同的x轴和y轴。
fig , axes = plt.subplots(2,3)

调整子图周围的间距
1fig,axes = plt.subplots(2,2,sharex = True,sharey = True) 2for i in range(2): 3 for j in range(2): axes[i,j].hist(np.random.randn(500),bins =50,color='k',alpha= 0.5) 4plt.subplots_adjust(wspace=0,hspace=0)

添加画布内容
| 函数名称 | 函数作用 |
|---|---|
| plt.title | 在当前图形中添加标题,可以指定标题的名称、位置、颜色、字体大小等参数。 |
| plt.xlabel | 在当前图形中添加x轴名称,可以指定位置、颜色、字体大小等参数。 |
| plt.ylabel | 在当前图形中添加y轴名称,可以指定位置、颜色、字体大小等参数。 |
| plt.xlim | 定当前图形x轴的范围,只能确定一个数值区间,而无法使用字符串标识。 |
| plt.ylim | 指定当前图形y轴的范围,只能确定一个数值区间,而无法使用字符串标识。 |
| plt.xticks | 指定x轴刻度的数目与取值。 |
| plt.yticks | 指定y轴刻度的数目与取值。 |
| plt.legend | 指定当前图形的图例,可以指定图例的大小、位置、标签。 |
第二部分是绘图的主体部分。其中添加标题,坐标轴名称,绘制图形等步骤是并列的,没有先后顺序,可以先绘制图形,也可以先添加各类标签。但是添加图例一定要在绘制图形之后。
1import numpy as np 2import matplotlib.pyplot as plt 3%matplotlib inline 4data=np.arange(0,1,0.01) 5plt.title('my lines example') 6plt.xlabel('X') 7plt.ylabel('Y') 8plt.xlim(0,1) 9plt.ylim(0,1) 10plt.xticks([0,0.2,0.4,0.6,0.8,1]) 11plt.yticks([0,0.2,0.4,0.6,0.8,1]) 12plt.plot(data,data**2) 13plt.plot(data,data**3) 14plt.legend(['y=x^2','y=x^3']) 15plt.show()

1import numpy as np 2import matplotlib.pyplot as plt 3%matplotlib inline 4data=np.arange(0,np.pi*2,0.01) 5fig1=plt.figure(figsize=(9,7),dpi=90) 6#确定画布大小 7#绘制第一幅子图 8ax1=fig1.add_subplot(1,2,1) 9plt.title('lines example') 10plt.xlabel('X') 11plt.ylabel('Y') 12plt.xlim(0,1) 13plt.ylim(0,1) 14plt.xticks([0,0.2,0.4,0.6,0.8,1]) 15plt.yticks([0,0.2,0.4,0.6,0.8,1]) 16plt.plot(data,data**2) 17plt.plot(data,data**3) 18 19#绘制第二幅子图 20ax1=fig1.add_subplot(1,2,2) 21plt.title('sin-cos') 22plt.xlabel('X') 23plt.ylabel('Y') 24plt.xlim(0,np.pi*2) 25plt.ylim(-1,1) 26plt.xticks([0,np.pi/2,np.pi,np.pi*3/2,np.pi*2]) 27plt.yticks([-1,-0.5,0,0.5,1]) 28plt.plot(data,np.sin(data)) 29plt.plot(data,np.cos(data)) 30plt.legend(['sin','cos']) 31plt.show()

Matplotlib 的 Legend 图例就是为了帮助我们展示每个数据对应的图像名称,更好的让读者认识到你的数据结构。关于plt.legend()的说明如下:

常用设置示例:
1 plt.legend(loc = 'best',frameon = False) 2#去掉图例边框,推荐使用 3plt.legend(loc = 'best',edgecolor = 'blue') 4#设置图例边框颜色 5plt.legend(loc = 'best',facecolor = 'blue') 6#设置图例背景颜色,若无边框,参数无效
绘图的保存与显示
| 函数名称 | 函数作用 |
|---|---|
| plt.savafig | 保存绘制的图片,可以指定图片的分辨率、边缘的颜色等参数。 |
| plt.show | 在本机显示图形 |
第三部分主要用于保存和显示图形。
fig.savefig(save_path, format='png', transparent=True, dpi=300, pad_inches = 0)
figure.savefig选项

3、rc参数设置
- pyplot使用rc配置文件来自定义图形的各种默认属性,被称为rc配置或rc参数。
- 在pyplot中几乎所有的默认属性都是可以控制的,例如视图窗口大小以及每英寸点数、线条宽度、颜色和样式、坐标轴、坐标和网格属性、文本、字体等。
两种方式可以设置参数,即全局参数定制和rc设置方法。
查看matplotlib的rc参数:
1 import matplotlib as plt 2 print(plt.rc_params())
import matplotlib as plt
print(plt.rc_params())
参数众多
常用参数:
Axes:设置坐标轴边界、颜色、坐标
刻度值大小和网格的显示;
Figure:设置边界颜色、图形大小和子区;
Font:设置字号、字体和样式;
Grid:设置网格颜色和线型;
Legend:设置图例和其中的文本显示;
Lines:设置线条颜色、宽度、线型等;
Savefig:对保存图像进行单独设置;
Xtick和ytick:X、Y轴的主刻度和次刻度设置颜色、大小、方向和标签大小。
线条的常用rc参数名称、解释与取值



1import numpy as np 2import matplotlib.pyplot as plt 3fig,ax = plt.subplots() 4#配置中文显示 5plt.rcParams['font.family'] = ['SimHei'] 6plt.rcParams['axes.unicode_minus'] = False 7def f(t): 8 return np.cos(2*np.pi*t) 9x1 = np.arange(0.0,4.0,0.5) 10x2 = np.arange(0.0,4.0,0.01) 11plt.figure(1) 12plt.subplot(2,2,1) 13plt.plot(x1,f(x1),'bo',x2,f(x2),'k') 14plt.title('子图1') 15plt.subplot(2,2,2) 16plt.plot(np.cos(2*np.pi*x2),'r--') 17plt.title('子图2') 18plt.show()

由于默认的pyplot字体并不支持中文字符的显示,因此需要通过设置font.sans-serif参数改变绘图时的字体,使得图形可以正常显示中文。同时,由于更改字体后,会导致坐标轴中的部分字符无法显示,因此需要同时更改axes.unicode_minus参数。
1import numpy as np 2import matplotlib.pyplot as plt 3fig,ax=plt.subplots() 4#配置中文显示 5plt.rcParams['font.family']=['SimHei']#用来显示中文标签 6plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 7def f(t): 8 return np.cos(2*np.pi*t) 9 10x1=np.arange(0.0,5.0,0.5) 11x2=np.arange(0.0,5.0,0.01) 12plt.figure(1) 13plt.subplot(2,2,1) 14plt.plot(x1,f(x1),'bo',x2,f(x2),'k') 15plt.subplot(2,2,2) 16plt.plot(np.cos(2*np.pi*x2),'r--') 17plt.show()

设置图的填充
- 调用函数fill_between() 实现曲线下面部分的填充:
1import numpy as np 2import matplotlib.pyplot as plt 3x=np.linspace(0,1,500) 4y=np.sin(3*np.pi*x)*np.exp(-4*x) 5fig,ax=plt.subplots() 6plt.plot(x,y) 7plt.fill_between(x, 0, y, facecolor='green', alpha=0.3)

- x:第一个参数表示覆盖的区域, x,表示整个x都覆盖
- 0:表示覆盖的下限
- y:表示覆盖的上限是y这个曲线
- facecolor:覆盖区域的颜色
- alpha:覆盖区域的透明度[0,1],其值越大,表示越不透明
- 部分区域的填充:
plt.fill_between(x[15:300], 0, 0.4, facecolor='green', alpha=0.3)

- 两条曲线之间的区域填充:
1import numpy as np 2import matplotlib.pyplot as plt 3x=np.linspace(0,1,500) 4y1=np.sin(3*np.pi*x)*np.exp(-4*x) 5y2 = y1 + 0.2 6plt.plot(x, y1,'b') 7plt.plot(x, y2, 'r') 8plt.fill_between(x, y1, y2, facecolor='green', alpha=0.3) 9plt.show()

4. 利用fill进行绘图的填充:
1import numpy as np 2import matplotlib.pyplot as plt 3x=np.linspace(0,1,500) 4y=np.sin(3*np.pi*x)*np.exp(-4*x) 5fig,ax=plt.subplots() 6ax.fill(x,y) 7plt.show()

文本注释
绘图时有时需要在图表中加文本注解,这时可以通过text函数在指定的位置(x,y)加入文本注解。如在柱状图上加入文本数字,可以清楚地显示每个类别的数量。如6个城市8月份的日均最高气温。
1import numpy as np 2import matplotlib.pyplot as plt 3plt.rcParams['font.family'] = ['SimHei'] 4data = [25,30,32,34,34,23] 5label = ['青海','兰州','北京','上海','广州','拉萨'] 6plt.xticks(range(len( data)),label) 7plt.xlabel('城市') 8plt.ylabel('温度') 9plt.title('六城市8月份日均最高气温') 10plt.bar(range(len( data)),data) 11for x,y in zip(range(len(data)),data): 12 plt.text(x,y,y,ha = 'center',va = 'bottom') 13plt.show()

4、pyplot中的常用绘图
折线图
折线图(line chart)是一种将数据点按照顺序连接起来的图形。可以看作是将散点图,按照x轴坐标顺序连接起来的图形。
折线图的主要功能是查看因变量y随着自变量x改变的趋势,最适合用于显示随时间(根据常用比例设置)而变化的连续数据。同时还可以看出数量的差异,增长趋势的变化。
plot函数:matplotlib.pyplot.plot(*args, **kwargs)


1带点的折线图 2import numpy as np 3x1 = np.arange(0, 30) 4plt.plot(x1,x1*2, 'b') 5plt.plot(x1,x1*2, 'bo') 6plt.show()

散点图
散点图(scatter diagram)又称为散点分布图,是以一个特征为横坐标,另一个特征为纵坐标,利用坐标点(散点)的分布形态反映特征间的统计关系的一种图形。
值是由点在图表中的位置表示,类别是由图表中的不同标记表示,通常用于比较跨类别的数据。
scatter函数:
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, alpha=None, **kwargs)

1import numpy as np 2import matplotlib.pyplot as plt 3fig,ax=plt.subplots() 4plt.rcParams['font.family']=['SimHei']#用来显示中文标签 5plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 6x1=np.arange(1,30) 7y1=np.sin(x1) 8 9ax1=plt.subplot(1,1,1) 10plt.title('散点图') 11plt.xlabel('X') 12plt.ylabel('Y') 13lvalue=x1 14ax1.scatter(x1,y1,c='r',s=100,linewidths=lvalue,marker='o') 15plt.legend('x1') 16plt.show()

1import numpy as np 2import matplotlib.pyplot as plt 3fig,ax=plt.subplots() 4plt.rcParams['font.family']=['SimHei']#用来显示中文标签 5plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 6for color in ['red','green','blue']: 7 n=500 8 x,y=np.random.randn(2,n) ax.scatter(x,y,c=color,label=color,alpha=0.3,edgecolors='none') 9 ax.legend() 10 ax.grid(True) 11 12plt.show()

直方图
直方图(Histogram)又称质量分布图,是统计报告图的一种,由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般用横轴表示数据所属类别,纵轴表示数量或者占比。
用直方图可以比较直观地看出产品质量特性的分布状态,便于判断其总体质量分布情况。直方图可以发现分布表无法发现的数据模式、样本的频率分布和总体的分布。
bar函数:
matplotlib.pyplot.bar(left,height,width = 0.8,bottom = None,hold = None,data = None,** kwargs )

1fig,axes=plt.subplots(2,1) 2data=pd.Series(np.random.randn(16),index=list('abcdefghijklmnop')) 3data.plot.bar(ax=axes[0],color=‘k’,alpha=0.7) #垂直柱状图 4data.plot.barh(ax=axes[1],color=‘k’,alpha=0.7) #alpha设置透明度

1import numpy as np 2import matplotlib.pyplot as plt 3fig,ax=plt.subplots() 4plt.rcParams['font.family']=['SimHei']#用来显示中文标签 5plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 6plt.figure(figsize=(7,5)) 7x=np.arange(1,6) 8Y1=np.random.uniform(1.5,1.0,5) 9Y2=np.random.uniform(1.5,1.0,5) 10plt.bar(x,Y1,width=0.35,facecolor='lightskyblue',edgecolor='white') 11plt.bar(x+0.35,Y2,width=0.35,facecolor='yellowgreen',edgecolor='white') 12plt.show()

饼图
饼图(Pie Graph)是将各项的大小与各项总和的比例显示在一张“饼”中,以“饼”的大小来确定每一项的占比。
饼图可以比较清楚地反映出部分与部分、部分与整体之间的比例关系,易于显示每组数据相对于总数的大小,而且显现方式直观。
pie函数
matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, … )

1plt.figure(figsize=(6,6)) 2ax=plt.axes([0.1,0.1,0.8,0.8])#建立轴的大小 3labels='Springs','Summer','Autumn','Winter' 4x=[15,30,45,10] 5explode=(0.05,0.05,0.05,0.05)#这个是控制分离的距离的,默认的饼图不分离。 6plt.pie(x,labels=labels,explode=explode,startangle=60,autopct='%1.1f%%')#qutopct在图中显示比例值,注意值的格式。 7plt.title('Rany days by season') 8plt.show()

箱线图
箱线图(boxplot)也称箱须图,其绘制需使用常用的统计量,能提供有关数据位置和分散情况的关键信息,尤其在比较不同特征时,更可表现其分散程度差异。
箱线图利用数据中的五个统计量(最小值、下四分位数、中位数、上四分位数和最大值)来描述数据,它也可以粗略地看出数据是否具有对称性、分布的分散程度等信息,特别可以用于对几个样本的比较。
boxplot函数
matplotlib.pyplot.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None,meanline=None, labels=None, … )

1import numpy as np 2import matplotlib.pyplot as plt 3import pandas as pd 4np.random.seed(2) #设置随机种子 5df = pd.DataFrame(np.random.rand(5,4), 6columns=['A', 'B', 'C', 'D'])#先生成0-1之间的5*4维度数据,再装入4列DataFrame中 7df.boxplot() #也可用plot.box() 8plt.show()

概率图
概率图模型是图灵奖获得者Pearl提出的用来表示变量间概率依赖关系的理论。
正态分布又名高斯分布。
正态概率密度函数 normpdf(X,mu,sigma)其中,x为向量,mu为均值,sigma为标准差。
1import numpy as np 2import matplotlib.pyplot as plt 3fig,ax=plt.subplots() 4plt.rcParams['font.family']=['SimHei']#用来显示中文标签 5plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 6np.random.seed(1587554) 7mu=100 8sigma=15 9x=mu+sigma*np.random.randn(437) 10num_bins=50 11n,bins,patches=ax.hist(x,num_bins,normed=1) 12y=plt.mlab.normpdf(bins,mu,sigma) 13ax.plot(bins,y,'--') 14fig.tight_layout() 15plt.show()

5、利用Matplotlib绘制词云
一、 安装需要的包
(1)WordCloud
(2)jieba
conda install -c conda-forge jieba
二、 词云生成过程
一般生成词云的过程为:
(1)首先使用pandas读取数据并将需要分析的数据转化为列表;
(2)对获得的列表数据利用分词工具jieba进行遍历分词;
(3)使用WordCloud设置词云图片的属性、掩码和停用词,并 生成词云图像。
1def get_wordClound(mylist): 2 word_list = [" ".join(jieba.cut(sentence))for sentence in mylist] 3 new_text = ' '.join(word_list) 4 pic_path = 'C:/Users/Chen/Desktop/mask.png' 5 img_mask = imread(pic_path) 6 wordcloud = WordCloud(background_color="white",font_path='/home/shen/Downloads/front/msyh.ttc',mask=img_mask,stopwords=STOPWORDS,).generate(new_text) 7 plt.imshow(wordcloud) 8 plt.axis("off") 9 plt.show() 10if __name__ == '__main__': 11 wordList = get_wordList() 12 get_wordClound(wordList)
