利用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 | 创建并选中子图,可以指定子图的行数,列数,与选中图片编号。 |
第一部分主要作用是构建出一张空白的画布,并可以选择是否将整个画布划分为多个部分,方便在同一幅图上绘制多个图形的情况。最简单的绘图可以省略第一部分,而后直接在默认的画布上进行图形绘制。
import matplotlib.pyplot as plt
import numpy as np
data=np.arange(10)
plt.plot(data)
绘制的图位于图片(figure)对象中。
创建子图
import matplotlib.pyplot as plt
fig = plt.figure()
#不能使用空白的figure绘图,需要创建子图
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
子图绘制
fig = plt.figure()
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
ax1.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)
调整子图周围的间距
fig,axes = plt.subplots(2,2,sharex = True,sharey = True)
for i in range(2):
for j in range(2): axes[i,j].hist(np.random.randn(500),bins =50,color='k',alpha= 0.5)
plt.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 | 指定当前图形的图例,可以指定图例的大小、位置、标签。 |
第二部分是绘图的主体部分。其中添加标题,坐标轴名称,绘制图形等步骤是并列的,没有先后顺序,可以先绘制图形,也可以先添加各类标签。但是添加图例一定要在绘制图形之后。
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
data=np.arange(0,1,0.01)
plt.title('my lines example')
plt.xlabel('X')
plt.ylabel('Y')
plt.xlim(0,1)
plt.ylim(0,1)
plt.xticks([0,0.2,0.4,0.6,0.8,1])
plt.yticks([0,0.2,0.4,0.6,0.8,1])
plt.plot(data,data**2)
plt.plot(data,data**3)
plt.legend(['y=x^2','y=x^3'])
plt.show()
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
data=np.arange(0,np.pi*2,0.01)
fig1=plt.figure(figsize=(9,7),dpi=90)
#确定画布大小
#绘制第一幅子图
ax1=fig1.add_subplot(1,2,1)
plt.title('lines example')
plt.xlabel('X')
plt.ylabel('Y')
plt.xlim(0,1)
plt.ylim(0,1)
plt.xticks([0,0.2,0.4,0.6,0.8,1])
plt.yticks([0,0.2,0.4,0.6,0.8,1])
plt.plot(data,data**2)
plt.plot(data,data**3)
#绘制第二幅子图
ax1=fig1.add_subplot(1,2,2)
plt.title('sin-cos')
plt.xlabel('X')
plt.ylabel('Y')
plt.xlim(0,np.pi*2)
plt.ylim(-1,1)
plt.xticks([0,np.pi/2,np.pi,np.pi*3/2,np.pi*2])
plt.yticks([-1,-0.5,0,0.5,1])
plt.plot(data,np.sin(data))
plt.plot(data,np.cos(data))
plt.legend(['sin','cos'])
plt.show()
Matplotlib 的 Legend 图例就是为了帮助我们展示每个数据对应的图像名称,更好的让读者认识到你的数据结构。关于plt.legend()的说明如下:
常用设置示例:
plt.legend(loc = 'best',frameon = False)
#去掉图例边框,推荐使用
plt.legend(loc = 'best',edgecolor = 'blue')
#设置图例边框颜色
plt.legend(loc = 'best',facecolor = 'blue')
#设置图例背景颜色,若无边框,参数无效
绘图的保存与显示
函数名称 | 函数作用 |
---|---|
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参数:
import matplotlib as plt
print(plt.rc_params())
import matplotlib as plt
print(plt.rc_params())
参数众多
常用参数:
Axes:设置坐标轴边界、颜色、坐标
刻度值大小和网格的显示;
Figure:设置边界颜色、图形大小和子区;
Font:设置字号、字体和样式;
Grid:设置网格颜色和线型;
Legend:设置图例和其中的文本显示;
Lines:设置线条颜色、宽度、线型等;
Savefig:对保存图像进行单独设置;
Xtick和ytick:X、Y轴的主刻度和次刻度设置颜色、大小、方向和标签大小。
线条的常用rc参数名称、解释与取值
import numpy as np
import matplotlib.pyplot as plt
fig,ax = plt.subplots()
#配置中文显示
plt.rcParams['font.family'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def f(t):
return np.cos(2*np.pi*t)
x1 = np.arange(0.0,4.0,0.5)
x2 = np.arange(0.0,4.0,0.01)
plt.figure(1)
plt.subplot(2,2,1)
plt.plot(x1,f(x1),'bo',x2,f(x2),'k')
plt.title('子图1')
plt.subplot(2,2,2)
plt.plot(np.cos(2*np.pi*x2),'r--')
plt.title('子图2')
plt.show()
由于默认的pyplot字体并不支持中文字符的显示,因此需要通过设置font.sans-serif参数改变绘图时的字体,使得图形可以正常显示中文。同时,由于更改字体后,会导致坐标轴中的部分字符无法显示,因此需要同时更改axes.unicode_minus参数。
import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots()
#配置中文显示
plt.rcParams['font.family']=['SimHei']#用来显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
def f(t):
return np.cos(2*np.pi*t)
x1=np.arange(0.0,5.0,0.5)
x2=np.arange(0.0,5.0,0.01)
plt.figure(1)
plt.subplot(2,2,1)
plt.plot(x1,f(x1),'bo',x2,f(x2),'k')
plt.subplot(2,2,2)
plt.plot(np.cos(2*np.pi*x2),'r--')
plt.show()
设置图的填充
- 调用函数fill_between() 实现曲线下面部分的填充:
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,1,500)
y=np.sin(3*np.pi*x)*np.exp(-4*x)
fig,ax=plt.subplots()
plt.plot(x,y)
plt.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)
- 两条曲线之间的区域填充:
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,1,500)
y1=np.sin(3*np.pi*x)*np.exp(-4*x)
y2 = y1 + 0.2
plt.plot(x, y1,'b')
plt.plot(x, y2, 'r')
plt.fill_between(x, y1, y2, facecolor='green', alpha=0.3)
plt.show()
4. 利用fill进行绘图的填充:
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,1,500)
y=np.sin(3*np.pi*x)*np.exp(-4*x)
fig,ax=plt.subplots()
ax.fill(x,y)
plt.show()
文本注释
绘图时有时需要在图表中加文本注解,这时可以通过text函数在指定的位置(x,y)加入文本注解。如在柱状图上加入文本数字,可以清楚地显示每个类别的数量。如6个城市8月份的日均最高气温。
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = ['SimHei']
data = [25,30,32,34,34,23]
label = ['青海','兰州','北京','上海','广州','拉萨']
plt.xticks(range(len( data)),label)
plt.xlabel('城市')
plt.ylabel('温度')
plt.title('六城市8月份日均最高气温')
plt.bar(range(len( data)),data)
for x,y in zip(range(len(data)),data):
plt.text(x,y,y,ha = 'center',va = 'bottom')
plt.show()
4、pyplot中的常用绘图
折线图
折线图(line chart)是一种将数据点按照顺序连接起来的图形。可以看作是将散点图,按照x轴坐标顺序连接起来的图形。
折线图的主要功能是查看因变量y随着自变量x改变的趋势,最适合用于显示随时间(根据常用比例设置)而变化的连续数据。同时还可以看出数量的差异,增长趋势的变化。
plot函数:matplotlib.pyplot.plot(*args, **kwargs)
带点的折线图
import numpy as np
x1 = np.arange(0, 30)
plt.plot(x1,x1*2, 'b')
plt.plot(x1,x1*2, 'bo')
plt.show()
散点图
散点图(scatter diagram)又称为散点分布图,是以一个特征为横坐标,另一个特征为纵坐标,利用坐标点(散点)的分布形态反映特征间的统计关系的一种图形。
值是由点在图表中的位置表示,类别是由图表中的不同标记表示,通常用于比较跨类别的数据。
scatter函数:matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, alpha=None, **kwargs)
import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots()
plt.rcParams['font.family']=['SimHei']#用来显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
x1=np.arange(1,30)
y1=np.sin(x1)
ax1=plt.subplot(1,1,1)
plt.title('散点图')
plt.xlabel('X')
plt.ylabel('Y')
lvalue=x1
ax1.scatter(x1,y1,c='r',s=100,linewidths=lvalue,marker='o')
plt.legend('x1')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots()
plt.rcParams['font.family']=['SimHei']#用来显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
for color in ['red','green','blue']:
n=500
x,y=np.random.randn(2,n) ax.scatter(x,y,c=color,label=color,alpha=0.3,edgecolors='none')
ax.legend()
ax.grid(True)
plt.show()
直方图
直方图(Histogram)又称质量分布图,是统计报告图的一种,由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般用横轴表示数据所属类别,纵轴表示数量或者占比。
用直方图可以比较直观地看出产品质量特性的分布状态,便于判断其总体质量分布情况。直方图可以发现分布表无法发现的数据模式、样本的频率分布和总体的分布。
bar函数:matplotlib.pyplot.bar(left,height,width = 0.8,bottom = None,hold = None,data = None,** kwargs )
fig,axes=plt.subplots(2,1)
data=pd.Series(np.random.randn(16),index=list('abcdefghijklmnop'))
data.plot.bar(ax=axes[0],color=‘k’,alpha=0.7) #垂直柱状图
data.plot.barh(ax=axes[1],color=‘k’,alpha=0.7) #alpha设置透明度
import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots()
plt.rcParams['font.family']=['SimHei']#用来显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.figure(figsize=(7,5))
x=np.arange(1,6)
Y1=np.random.uniform(1.5,1.0,5)
Y2=np.random.uniform(1.5,1.0,5)
plt.bar(x,Y1,width=0.35,facecolor='lightskyblue',edgecolor='white')
plt.bar(x+0.35,Y2,width=0.35,facecolor='yellowgreen',edgecolor='white')
plt.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, … )
plt.figure(figsize=(6,6))
ax=plt.axes([0.1,0.1,0.8,0.8])#建立轴的大小
labels='Springs','Summer','Autumn','Winter'
x=[15,30,45,10]
explode=(0.05,0.05,0.05,0.05)#这个是控制分离的距离的,默认的饼图不分离。
plt.pie(x,labels=labels,explode=explode,startangle=60,autopct='%1.1f%%')#qutopct在图中显示比例值,注意值的格式。
plt.title('Rany days by season')
plt.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, … )
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
np.random.seed(2) #设置随机种子
df = pd.DataFrame(np.random.rand(5,4),
columns=['A', 'B', 'C', 'D'])#先生成0-1之间的5*4维度数据,再装入4列DataFrame中
df.boxplot() #也可用plot.box()
plt.show()
概率图
概率图模型是图灵奖获得者Pearl提出的用来表示变量间概率依赖关系的理论。
正态分布又名高斯分布。
正态概率密度函数 normpdf(X,mu,sigma)其中,x为向量,mu为均值,sigma为标准差。
import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots()
plt.rcParams['font.family']=['SimHei']#用来显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
np.random.seed(1587554)
mu=100
sigma=15
x=mu+sigma*np.random.randn(437)
num_bins=50
n,bins,patches=ax.hist(x,num_bins,normed=1)
y=plt.mlab.normpdf(bins,mu,sigma)
ax.plot(bins,y,'--')
fig.tight_layout()
plt.show()
5、利用Matplotlib绘制词云
一、 安装需要的包
(1)WordCloud
(2)jieba
conda install -c conda-forge jieba
二、 词云生成过程
一般生成词云的过程为:
(1)首先使用pandas读取数据并将需要分析的数据转化为列表;
(2)对获得的列表数据利用分词工具jieba进行遍历分词;
(3)使用WordCloud设置词云图片的属性、掩码和停用词,并 生成词云图像。
def get_wordClound(mylist):
word_list = [" ".join(jieba.cut(sentence))for sentence in mylist]
new_text = ' '.join(word_list)
pic_path = 'C:/Users/Chen/Desktop/mask.png'
img_mask = imread(pic_path)
wordcloud = WordCloud(background_color="white",font_path='/home/shen/Downloads/front/msyh.ttc',mask=img_mask,stopwords=STOPWORDS,).generate(new_text)
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
if __name__ == '__main__':
wordList = get_wordList()
get_wordClound(wordList)