一、Matplotlib基本介绍
Matplotlib(mathematic plot lib,数学绘图库)是一个可视化绘图库。可以使用这个库轻松地完成线形图、直方图、条形图、误差图或散点图等操作,设置标签、图例、调整绘图大小等。是python中使用最广的绘图库。有很多库(如pandas,seaborn)的绘图功能都是基于matplotlib实现的。
pyplot(python plot,python绘图)是Matplotlib的一个基于状态的接口,可以快速的绘制图表,通常我们绘图只需要通过pyplot的接口就可以了。
在Jupyter notebook中进行交互式绘图,需要执行一下语句:
%matplotlib notebook
使用matplotlib时,使用的导入的语句
import matplotlib.pyplot as plt
from matplotlib import pyplot as plt
二、两种绘图方式区别(plt.*** 和ax.***)
利用matplotlib画图有两种方式,一个直接调用pyplot模型中的相应函数就可以完成绘图,称为过程式绘图;另一种可以在画布上显示多个图表,称为面向对象绘图,fig.subplots()无参数创建图表,默认创建一个图表。
先matplotlib架构上理解,可以理解为:
matplotlib架构上分为三层
底层:backend layer
中层:artist layer
最高层:scripting layer
在任意一层操作都能够实现画图的目的,而且画出来还都一样。但越底层的操作越细节话,越高层越易于人机交互。
plt. 对应的就是最高层 scripting layer。这就是为什么它简单上手,但要调细节就不灵了。
ax.plot 是在 artist layer 上操作。基本上可以实现任何细节的调试。
三、如何使用Matplotlib绘图
快速绘图的流程:从左往右
1、画布—绘画的画板
函数接口 | 函数作用 | 参数说明 |
---|---|---|
plt.figure() | 创建一个新的绘图窗口,设置画布大小。 | figsize:参数格式为(width,height),单位为inch。dpi参数:分辨率,指每inch像素数。默认dpi为100。例figsize=(18,6) |
fig.add_subplot(row,col,index) | 在新的绘图窗口上创建子图,子图相互独立 | 无显式参数,逗号可以省略,fig.add_subplot(2,2,2)与fig.add_subplot(222)都可以。 row:行,col:列,index:子图的位置 |
plt.show() | 显示当前figure图像 | |
plt.close() | 关闭当前figure窗口 |
过程式绘图
import matplotlib.pyplot as plt
import numpy as np
x = np.random.random(10)
y = np.random.random(10)
plt.plot(x,y) #绘制拆线图
plt.show() #显示图形
说明:依次调用pyplot模块中的相应函数就可以完成绘图。
面向对象绘图
import matplotlib.pyplot as plt
fig=plt.figure(figsize=(18,6))
ax1=fig.add_subplot(2,2,1) # 创建2*2=4张图,ax1画在第一张图上
ax2=fig.add_subplot(2,2,2) # 创建2*2=4张图,ax2画在第二张图上
ax3=fig.add_subplot(2,2,3) # 创建2*2=4张图,ax3画在第三张图上
ax4=fig.add_subplot(2,2,4) # 创建2*2=4张图,ax4画在第四张图上
plt.show() # 显示画布
plt.close() # 关闭画布
说明:
1、先通过plt.figure()函数创建一张完整的画面,作为底层,之后的所有操作都在这张画布上完成。
2、再通过figure.add_subplot()函数创建子图,相当于在已创建的画布上再叠加子图,子画布间相互独立,这样就可以达到一次性完成多幅图片的效果。
3、创建多个子图,可通过循环最后一个参数达到效果。
fig=plt.figure(figsize=(18,6))
for i in range(1,5):
ax=fig.add_subplot(2,2,i)
plt.show()
plt.close()
4、在一张画布上创建子图的其他方法
#方法1
fig=plt.figure()
ax=fig.add_axes([left, bottom, width, height])
#方法2
fig,ax=plt.subplots(行数, 列数)
2、配置—更个性化的绘图
全局配置
过程式和面向对象式配图都适用
指定中文字体
函数接口 | 函数作用 | 参数说明 |
---|---|---|
matplotlib.font_manager.FontProperties() | 指定中文字体 | font_path:指定字体的路径。 |
# 指定中文字体样式、大小
import matplotlib.font_manager as mfm
# 请换成自己电脑的字体路径
font_path = r"c:\windows\Fonts\simsun.ttc"
prop = mfm.FontProperties(fname = font_path)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_title('你好',fontproperties=prop,fontsize=20)
plt.show()
指定全局画图主题
函数接口 | 函数作用 | 参数说明 |
---|---|---|
plt.style.use() | 指定画图主题 | 无显式参数,style_name:设置主题名 |
常用主题:’ggplot’、‘seaborn-bright’、‘seaborn-white’、‘seaborn-darkgrid’、‘season-deep’
# 查看所有主题
plt.style.available
# 指定全局画图主题为ggplot
plt.style.use('ggplot')
局部配置
面向对象绘图过程:ax代表子图变量
图表标题设置
函数接口 | 函数作用 | 参数说明 |
---|---|---|
ax.set_title() | 在当前图形中添加主题,可以指定标题的名称、位置、颜色、字体大小等参数。 | label:标题文字,fontsize:指定字体大小,color:指定字体颜色,loc可选值为{‘left’,‘center’,‘right’},默认值为’center’ |
ax.set_title(“sample”):设置图表标题。
ax.set_title(“title”, loc=‘left’):设置图表标题位置。
坐标轴设置
函数接口 | 函数作用 | 参数说明 |
---|---|---|
ax.set_xlabel() | 当前图形中添加x轴名称,可以指定标题的名称、位置、颜色、字体大小等参数。 | xlabel:标签文字,fontsize:指定字体大小 |
ax.set_ylabel() | 当前图形中添加y轴名称,可以指定标题的名称、位置、颜色、字体大小等参数。 | ylabel:标签文字,fontsize:指定字体大小 |
ax.set_xlim() | 设置当前图形中x轴的范围,只能确定一个数值区间,而无法使用字符串标识。 | left:指定最小值,right:指定最大值,可以使用tuple合并表示(left,right) |
ax.set_ylim() | 设置当前图形中y轴的范围,只能确定一个数值区间,而无法使用字符串标识。 | bottom:指定最小值,top:指定最大值,可以使用tuple合并表示(bottom,top) |
ax.set_xticks() | 指定x轴刻度的数目与取值。 | ticks:传入列表,每个元素代表一个刻度值。 |
ax.set_yticks() | 指定y轴刻度的数目与取值。 | ticks:传入列表,每个元素代表一个刻度值。 |
ax.set_xticklabels() | 设置x轴刻度的显示值。 | labels:每个刻度上显示的值,fontsize:指定字体大小 |
ax.set_yticklabels() | 设置y轴刻度的显示值。 | labels:每个刻度上显示的值,fontsize:指定字体大小 |
ax.hlines() | 设置水平线 | y:某个纵坐标,固定值。xmin:横坐标最小值。xmax:横坐标最大值。 |
ax.vlines() | 设置垂直线 | x:某个纵坐标,固定值。ymin:横坐标最小值。ymax:横坐标最大值。 |
ax2=ax1.twinx() | 子图ax1、ax2共享x轴 | 无 |
ax2=ax1.twiny() | 子图ax1、ax2共享y轴 | 无 |
设置坐标轴标签文本
ax.set_xlabel(‘X axis’)
ax.set_ylabel(‘Y axis’)
设置x,y轴坐标刻度显示范围
ax.set_xlim(-3.5,3.5)
ax.set_ylim(-1.5,1.5)
设置主刻度坐标
ax.set_xticks([-4,-2,0,2,4])
ax.set_yticks([-1,-0.5,0,0.5,1])
设置次刻度坐标
ax.set_xticks(np.arange(-4,4,0.5),minor=True)
ax.set_yticks(np.arange(-1.5,1.5,0.1),minor=True)
图例
函数接口 | 函数作用 | 参数说明 |
---|---|---|
ax.legend | 指定当前图形的图例,可以指定图例大小、位置、标签。 | labels:标签名。loc:图例的位置。bbox_to_anchor:指定图例的位置(横坐标,纵坐标)(横纵最大1.0,最小0.0)。prop:等同于fontproperties。fontsize:字体大小。 |
ax.legend(loc=‘upper right’):自定义图例位置。
loc 可选择的参数
- ‘best’:自动选择最佳位置
- ‘upper left’:左上角
- ’upper right’:右上角
- ‘lower left’:左下角
- ‘lower right’:右下角
- ‘center left’:中左
- ‘center right’:中右
- ‘lower center’:中下
- ‘upper center’:中上
ax.legend(fontsize=‘samll’) 自定义图例文字大小。
ax.legend(fontsize=10)
fontsize 可选择的参数
- 相对大小(字符串)
‘xx-small’,‘x-small’,‘smal’:小于当前默认字体大小
‘medium’:中等
‘large’,‘x-large’,‘xx-large’:大于当前默认字体大小 - 绝对大小(数值)
fontsize=10:绝对字体大小,单位为点。
ax.legend(labelcolor=[‘r’,‘b’]):设置图例文本颜色。
ax.legend(mode=‘expand’):图例水平平铺。
保存图形
函数接口 | 函数作用 | 参数说明 |
---|---|---|
plt.savefig() | 保存图片 | fname:文件名;dpi:像素,单个数值即可。 |
plt.savefig(“sample.png”)
支持如下格式:
jpg, jpeg:jpg图
png:png图
svg, svgz:svg图
tif, tiff:tiff图
pgf:pgf位图
pdf, eps, ps:pdf或postscript文件
raw, rgba
面向对象画图的代码示例
#准备数据
import numpy as np
x=np.linspace(-np.pi,np.pi,100)
y=np.sin(x)
#导入matplotlib库pyplot模块
import matplotlib.pyplot as plt
#创建画布
fig=plt.figure()
#创建图表
ax=fig.subplots()
#绘制折线图,设置点线样式,设置线条名称
ax.plot(x,y,'+r--', label='line1',mec='b',ms=10) #点为蓝色+(大小为10),线为红色虚线
#设置坐标轴
ax.set_xlabel('X axis') #坐标轴文本标签
ax.set_ylabel('Y axis')
ax.set_xticks([-4,-2,0,2,4]) #主刻度
ax.set_xticks(np.arange(-4,4,0.5),minor=True) #次刻度
ax.set_yticks([-1,-0.5,0,0.5,1])
ax.set_yticks(np.arange(-1.5,1.5,0.1),minor=True)
ax.tick_params(axis='y',labelrotation=30) #y轴主刻度文字旋转30度
ax.set_xlim(-3.5,3.5) #设置显示刻度范围
ax.set_ylim(-1.5,1.5)
ax.grid(True) #显示主刻度网格
#设置图例
ax.legend() #注意需要绘图时,需指定label参数
#设置标题
ax.set_title("sample")
#保存显示图形
fig.savefig("sample.png")
plt.show()
过程式绘图过程
图表标题设置
函数接口 | 函数作用 |
---|---|
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
x=np.linspace(-np.pi,np.pi,100)
y=np.sin(x)
#导入matplotlib库pyplot模块
import matplotlib.pyplot as plt
#绘制折线图,设置点线样式,设置线条名称
plt.plot(x,y,'+r-.', label='line1') #点为蓝色+,线为红色点划线
#设置坐标轴
plt.xlabel('X axis') #坐标轴文本标签
plt.ylabel('Y axis')
plt.xticks([-4,-2,0,2,4]) #主刻度,不支持次刻度设置
plt.yticks([-1,-0.5,0,0.5,1], rotation=30)
plt.xlim(-3.5,3.5) #设置显示刻度范围
plt.ylim(-1.5,1.5)
plt.grid(True,c='gray',linestyle=':') #显示主刻度网格
#设置图例
plt.legend() #注意需要绘图时,指定label参数
#设置标题
plt.title("sample")
#保存显示图形
plt.savefig("sample.png")
plt.show()
四、常用绘图图形
如何选择常用绘图图形?
散点图
散点图(scatter diagram,scatter:分散;撒;四散;散开;驱散;撒播)又称为散点分布图,是以一个特征为横坐标,另一个特征为纵坐标,值是由点在图表中的位置表示,类别是由图表中的不同标记表示,通常用于比较跨类别的数据。
散点图主要功能利用坐标点(散点)的分布形态反映特征间的统计关系(相关性)的一种图形。
1)线性相关:x,y变量的散点看上去都在一条直线附近波动;
2)非线性相关:x,y变量的散点都在某条曲线(非直线)附近波动;
3)不相关:所有点在图中没有显示任何关系
scatter()函数
函数接口 | 函数作用 |
---|---|
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs) | 绘制散点图 |
基本参数说明:
参数名称 | 说明 |
---|---|
x,y | x:自变量。y:因变量。 |
s | 指定点的大小,数值或者一维的array,若传入一维array则表示每个点的大小。默认为None。 |
c | 指定点的颜色,浮点数、颜色或者颜色列表,若传入一维array则表示每个点的颜色,默认为None。 |
marker | 表示绘制点的类型,待定string,默认为小圆圈‘o’。 |
cmap | Colormap,默认为None,标量或者是一个colormap的名字,只有c是一个浮点数数组的时才使用,如果没有申明就是image.cmap。 |
norm | Normalize,默认为None,数据亮度在0-1之间,只有c是一个浮点数的数组时才使用。 |
vmin,vmax | 亮度设置,在norm参数存在时忽略。 |
alpha | 表示点的透明度,0-1的小数,默认为None,即不透明。 |
linewidths | 散点的边缘线宽。 |
edgecolors | 散点的边缘颜色,默认为 ‘face’,可选值有 ‘face’, ‘none’。 |
**kwargs | 其他参数。 |
举例1:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as mfm
fig,ax=plt.subplots() #创建画布与图表
plt.rcParams['font.family']=['SimHei'] #用来显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
#准备数据
x1=np.arange(1,30)
y1=np.sin(x1)
ax=plt.subplot(1,1,1)
plt.title('散点图')
plt.xlabel('X')
plt.ylabel('Y')
lvalue=x1
#绘制散点图。颜色为'r',点的大小为s,散点的边缘线宽为linewidths,点的类型为marker。
ax.scatter(x1,y1,c='r',s=100,linewidths=lvalue,marker='o')
plt.legend('x1')
plt.show()
举例2:
import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots()
plt.rcParams['font.family']=['SimHei'] #用来显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
#绘制散点图。颜色为['red','green','blue'],透明度为0.3,散点的边缘颜色为'none'。
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()
举例3:
比较特别的,用浮点数表示颜色,表示从当前matplotlib.colors.Colormap映射得到的颜色,相当于多个调色盘的合集。并非所有颜色参数都可以浮点数表示(比如plot就不行)。
import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots() #创建画布与图表
#准备数据
x=np.random.randn(50)*10 #随机产生50个x轴坐标
y=np.random.randn(50)*10 #随机产生50个y轴坐标
sizes=(np.random.randn(50)*10)**2 #随机产生50个用于改变散点面积的数值
colors=np.random.randn(50)*10
#绘制散点图。颜色为colors,大小为sizes(单位points^2),透明度为0.5
ax.scatter(x,y,s=sizes,c=colors,alpha=0.5)
plt.show()
折线图
折线图(line chart)是一种将数据点按照顺序连接起来的图形。可以看作是将散点图,按照x轴坐标顺序连接起来的图形。可以只显示点、只显示线,或者点、线都显示。
折线图的主要功能观察因变量y随着自变量x改变的趋势。
- 最适合用于显示随时间(根据常用比例设置)而变化的连续数据。
- 适合用于观察数量的差异,增长趋势的变化。
plot()函数
函数接口 | 函数作用 |
---|---|
matplotlib.pyplot.plot(*args, **kwargs) | 绘制折线图 |
基本参数说明:
参数名称 | 说明 |
---|---|
x,y | x:自变量。y:因变量。 |
marker | 绘制的点的样式,接受特定string,默认为None,例如marker=‘o’。 |
markersize | 绘制点的大小,ms=1.5。 |
linestyle | 线条样式,接受特定string,默认为’-'。 |
linewidth | 线条宽度 |
color | 线条颜色,接受特定string,默认为None。‘b’:蓝色,‘g’:绿色,’r’:红色,‘c’:青色,’m’:品红,‘y’:黄色,’k’:黑色,’w’:白色。 |
markerfacecolor | 点填充颜色。例如mfc=‘r’。 |
markeredgecolor | 点边缘颜色。例如meg=‘g’。 |
markeredgewidth | 点边缘宽度。例如mew=0.5。 |
alpha | 表示点的透明度,0-1的小数,默认为None。 |
fmt = ‘[marker][line][color]’ | fmt为字符串由点样式、颜色、线样式组成,例如’+r–':点样式为+,颜色为红色,线样式为虚线 |
举例1:
import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots() #创建画布与图表
#准备数据
x=np.linspace(0,4*np.pi,50) #通过定义均匀间隔创建数值序列
y1=np.sin(x)
y2=np.cos(x)
y3=np.cos(x+np.pi)
#绘制'line1'。线条为灰色,线形为点划线('-.'),线宽为1。
ax.plot(x,y1,c='gray',linestyle='-.',linewidth=1,label='line1')
#绘制'line2'。线条为红色,线型为虚线('--')
ax.plot(x,y2,'r--',label='line2')
#绘制'line3'。同时显示点和线。
#点大小为10,填充颜色为绿色,边缘颜色为红色,边缘宽度为1。
#线为蓝色实绩,线条宽度为2。
ax.plot(x,y3,'ob-',mfc='g',mec='r',ms=10,linewidth=2,label='line3')
ax.legend(loc='upper right') #设置图例
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, … ) | 绘制箱线图 |
基本参数说明:
参数名称 | 说明 |
---|---|
x | 表示用于绘制箱线图的数据,接受array,无默认。 |
notch | 表示中间简体是否有缺口,默认为None,接boolean。 |
sym | 指定异常点(超出Q0-Q5范围的值的绘制颜色和符号,默认为None,接收特定string。 |
vert | 表示图形是纵向或者横向,默认为None。 |
positions | 表示图形位置,接叫array,默认为None。 |
widths | 接收scalar或者array,表示每个箱体的宽度,默认为None。 |
labels | 指定每一个箱线图的标签,默认为None。 |
meanline | 表示是否显示均值线,接叫boolean,默认为False。 |
showfliers | False:不显示超出Q0-Q5范围的点,True:显示超出Q0-Q5范围的点。 |
whis=1.5 | Q0=Q1-whis*(Q3-Q1),Q5=Q3+whis*(Q3-Q1) |
举例1:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
fig,ax=plt.subplots()
#准备数据
np.random.seed(2)
df=pd.DataFrame(np.random.rand(5,4),columns=['A','B','C','D'])
#df.boxplot()
ax.boxplot(df,sym='r+',whis=1.25)
plt.show()
柱状图
柱状图一般用横轴表示数据所属类别,纵轴表示数量或者占比。
柱状图主要功能是观察数据模式、样本的频率分布和总体的分布。
- 适用于比较产品质量特性的分布状态,判断其总体质量分布情况。
- 适用于属于不同组别的统计,可以用于比较组别的数据差异。
与直方图区别:
1)直方图展示数据的分布,柱状图比较数据的大小。
2)直方图X轴为定量数据(数据区间),柱状图X轴为分类数据。
3)直方图柱子无间隔(区间是连续的),柱状图柱子有间隔
4)直方图柱子宽度可不一,柱状图柱子宽度须一致
bar()函数
函数接口 | 函数作用 |
---|---|
matplotlib.pyplot.bar(x,left,height,width = 0.8,bottom = None,hold = None,data = None,** kwargs ) | 绘制柱状图 |
bar()函数绘制垂直柱状图,barh()函数绘制水平柱状图。
基本参数说明:
参数名称 | 说明 |
---|---|
x | bar坐标刻度参数。也是默认的坐标刻度文本。barh为y参数。 |
left | 每根柱子最左边的刻度,接受list。 |
height | 每根柱子的高度,即y轴上的坐标。浮点数或类数组结构。 |
width | 柱子的宽度,接收0-1之间的float,如0.5。 |
bottom | 柱子最低处的高度,浮点数或类数组结构。如0.5。 |
color | 柱子的颜色,颜色值或颜色值序列。如‘red’。 |
edgecolor | 柱形图边缘颜色,颜色值或颜色值序列。 |
linewidth | 柱形图边缘宽度,浮点数或类数组。如果为0,不绘制柱子边缘。 |
tick_label | 坐标刻度文本,字符串或字符串列表。不再使用x,y作为柱标签。 |
举例1:
单个柱状图代码示例
import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots()
#准备数据
x=np.arange(6)
y=np.random.uniform(0,10,6)
ax.bar(x,y) #绘制简单柱状图。用x坐标文本标签
ax.bar(x,y,tick_label=list('abcdef'),color='gray',lw=1,ec='orange') #制定文本作为标签,填充灰色,描边宽度为1,颜色为橙色
plt.show()
举例2:
设置柱形图宽度,bar() 方法使用 width 设置,barh() 方法使用 height 设置 height
垂直柱状图与水平柱状图代码示例(两种作图方式):
import numpy as np
import matplotlib.pyplot as plt
fig,axes=plt.subplots(2,1)
data=pd.Series(np.random.randn(16),index=list('abcdefghijklmnop'))
data.plot.bar(ax=axes[0],color='gray',alpha=0.7) #绘制垂直柱状图
data.plot.barh(ax=axes[1],color='gray',alpha=0.7) #绘制水平柱状图
import numpy as np
import matplotlib.pyplot as plt
fig=plt.figure(figsize=(18,6))
ax1=fig.add_subplot(211)
ax2=fig.add_subplot(212)
x1=list('abcdefghijklmnop')
y1=np.random.randn(16)
ax1.bar(x1,y1,color='gray',alpha=0.7,width=0.5,)
ax2.barh(x1,y1,color='gray',alpha=0.7,height=0.5)
举例3:
分组柱形图代码示例:
import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots(figsize=(7,5))
plt.rcParams['font.family']=['SimHei']#用来显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
x=np.arange(1,6)
Y1=np.random.uniform(1.5,1.0,5)
Y2=np.random.uniform(1.5,1.0,5)
ax.bar(x,Y1,width=0.35,facecolor='lightskyblue',edgecolor='white',label='A')
ax.bar(x+0.35,Y2,width=0.35,facecolor='yellowgreen',edgecolor='white',label='B')
ax.legend()
plt.show()
举例4:
分组柱形图(进阶)代码示例:
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as mpatches
matplotlib.rcParams['font.sans-serif']=['SimHei']
matplotlib.rcParams['axes.unicode_minus']=False
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
fig,ax=plt.subplots(figsize=(20, 8),dpi=80)
year = ['2015年','2016年','2017年']
data1 = [68826, 73125, 77198]
data2 = [50391, 54455, 57892]
# 先得到year长度, 再得到下标组成列表
x = range(len(year))
ax.bar(x,data1,width=0.2,color='#FF6347')
# 向右移动0.2,柱状条宽度为0.2
ax.bar([i + 0.2 for i in x],data2,width=0.2,color='#008B8B')
# 底部汉字移动到两个柱状条中间(本来汉字是在左边蓝色柱状条下面, 向右移动0.1)
ax.set_xticks([i+0.1 for i in x])
ax.set_xticklabels(year, fontsize=15)
ax.set_ylabel('人数(万人)',size=13)
color = ['#FF6347', '#008B8B']
labels = ['中国网民规模', '中国网络视频用户规模']
patches = [mpatches.Patch(color=color[i], label="{:s}".format(labels[i]) ) for i in range(len(color))]
ax=plt.gca()
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width , box.height* 0.8])
#下面一行中bbox_to_anchor指定了legend的位置
ax.legend(handles=patches, bbox_to_anchor=(0.65,1.12), ncol=3) #生成legend
# 为每个条形图添加数值标签
for x1,y1 in enumerate(data1):
ax.text(x1, y1+200, y1,ha='center',fontsize=16)
for x2,y2 in enumerate(data2):
ax.text(x2+0.2,y2+200,y2,ha='center',fontsize=16)
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=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)[source] | 绘制饼图 |
基本参数说明:
参数名称 | 说明 |
---|---|
x | 每一块饼的数值,浮点型数组或列表。 |
explode | 每块饼突出来的距离,数组。如 explode=[0,0.2,0,0]:第i个数字表示第i个饼炸开距离(数值×半径=距离),explode参数的长度必须和x参数相同。 |
labels | 指定第一个饼图的文本标签,列表,默认为None。 |
colors | 每块饼的颜色,数组,默认为None。 |
autopct | 指定数值的显示方式,设置小数点,默认为None,%d%% 整数百分比,%0.1f 一位小数, %0.1f%% 一位小数百分比, %0.2f%% 两位小数百分。 |
labeldistance | 标签标记的绘制位置,相对于半径的比例,默认为1.1,如<1则绘制在饼图内侧,float。 |
pctdistance | 类似于 labeldistance,指定 autopct 的位置刻度,默认值为 0.6。 |
shadow | 布尔值 True 或 False,是否有阴影,默认为 False,不设置阴影。 |
radius | 设置饼图的半径,默认为1。 |
startangle | 指定饼图的起始角度,默认从x轴正方向逆时针画起,如设定=90则从y轴正方向画起。 |
counterclock | 布尔值,用于指定是否逆时针绘制扇形,默认True,即逆时针绘制,False为顺时针。 |
wedgeprops | 字典类型,默认值 None。用于指定扇形的属性,比如边框线颜色、边框线宽度等,如 |
textporps | 字典类型, 用于指定文本标签的属性,比如字体大小、字体颜色等,默认值为None。 |
center | 浮点类型的列表,用于指定饼图的中心位置,默认值:(0,0) |
frame | 布尔类型,用于指定是否绘制饼图的边框,默认值:False。如果是True,绘制带有表的轴框架。 |
rotatelabels | 布尔类型,指定是否旋转文本标签,默认为False。如果为True,旋转每个label到指定的角度。 |
data | 用于指定数据。如果设置了 data 参数,则可以直接使用数据框中的列作为 x、labels 等参数的值,无需再次传递。 |
举例1:
import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots()
#准备数据
labels='Spring','Summer','Autumn','Winter'
x=[15,30,45,60]
ax.pie(x
,labels=labels #设置标签
,explode=[0,0,0.1,0] #第3个饼图炸开
,wedgeprops={'lw':2,'ec':'lightblue'} #描边
,startangle=60 #起始角度,默认从0开始逆时针转
,autopct='%1.1f%%' #在图中显示比例值,注意值的格式。
)
ax.set_title('Rany days by season')
plt.show()
直方图
直方图(Histogram)又称质量分布图,是统计报告图的一种,表示同一组数据在连续间隔或者特定时间段内容的分布情况,横轴表示数据类型(同一个变量的分组统计),纵轴表示一组数据分布情况,每个数据宽度可以任意变化。
直方图主要功能是描述一组数据的频次分布,有助于观察众数、中位数的位置,关注数据存在缺口或者异常值。
hist()函数
函数接口 | 函数作用 |
---|---|
matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype=‘bar’, align=‘mid’, orientation=‘vertical’, rwidth=None, log=False, color=None, label=None, stacked=False, **kwargs) | 绘制直方图 |
基本参数说明:
参数名称 | 说明 |
---|---|
x | 表示要绘制直方图的数据,可以是一个二元组或列表。 |
bins | 表示直方图的箱数,默认为10。 |
range | 表示要直方图的值域范围,可以是一个一维数组或列表。默认为None,即使用数据中的最小值和最大值。 |
density | 表示是否将直方图归一化,默认为False,即直方图的高度为每个箱子内的样本数,而不是频率或概率密度。 |
weights | 表示每个数据点的权重,默认为None。 |
cumulative | 表示是否绘制累积分布图,默认为False。 |
bottom | 表示直方图的起始高度,默认为None。 |
histtype | 表示直方图类型,可以是’bar’、’barstacked’、‘step’、‘stepfilled’等。默认为’bar’。 |
align | 表示直方图箱子的对齐方式,可以是’left’、‘mid’、‘right’。默认为’mid’。 |
orientation | 表示直方图的方向,可以是’vertical’、‘horizontal’。默认为’vertical’。 |
rwidth | 表示每个箱子的宽度。默认为None。 |
log | 表示是否在y轴上使用对数刻度。默认为False。 |
color | 表示直方图的颜色。 |
label | 表示直方图的标签。 |
stacked | 表示是否堆叠不同的直方图。默认为False。 |
**kwargs | 表示其他绘图参数。 |
举例1:
import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots()
# 使用 NumPy 生成随机数
x= np.random.normal(170, 10, 250)
ax.hist(x,bins=30,color='r',cumulative=True)
ax.set_xlabel('random test')
plt.show()
plt.close()
五、绘图数据和多子图绘图
列表绘图
import numpy as np
import matplotlib.pyplot as plt
x=[1,2,3,4]
y=[1,4,9,16]
plt.plot(x,y)
plt.show()
数组绘图
import numpy as np
import matplotlib.pyplot as plt
t=np.arange(0,5,0.2)
#线条1
x1=y1=t
#线条2
x2=x1
y2=t**2
#线条3
x3=x1
y3=t**3
#使用plot绘制线条
lineslist=plt.plot(x1,y1,x2,y2,x3,y3)
#使用setp方法可以同时设置多个线条的属性
plt.setp(lineslist,color='r')
plt.show()
print('',type(lineslist))
print('',len(lineslist))
字典绘图
import numpy as np
import matplotlib.pyplot as plt
data={'x':np.arange(50),
'y':np.random.randint(0,50,50),
'color':np.random.randn(50)}
plt.scatter('x','y',c='color',data=data)
plt.show()
多子图绘制
可以用如下三个方法创建多个子图
- fig,axes=plt.subplots(m,n):一次生成m行n列子图。
- axes=fig.subplots(m,n):一次生成m行n列子图,返回m*n个axes对象。
- fig.add_subplot((m,n,i)):增加一个子图,m行n列放在第i个。建议采用这个方法创建多子图。
- 也可以fig.add_subplots(mni)方式调用。
举例1:
fig,axes=plt.subplots(m,n):一次生成m行n列子图。
import numpy as np
import matplotlib.pyplot as plt
ax=plt.subplots(2,2)
ax1=ax[0]
ax2=ax[1]
ax3=ax[2]
ax4=ax[3]
ax1.plot(x,y)
举例2:
fig.add_subplot((m,n,i)):增加一个子图,m行n列放在第i个。建议采用这个方法创建多子图。
import numpy as np
import matplotlib.pyplot as plt
#准备数据
x=np.linspace(-np.pi,np.pi,100)
y=np.sin(x)
fig=plt.figure()
ax1=fig.add_subplot(2,2,1)
ax1.plot(x,y,'r-')
ax2=fig.add_subplot(2,2,3)
ax2.plot(x,y,'b:')
ax3=fig.add_subplot(1,2,2)
ax3.plot(x,y,'Dg--')
plt.show()
画布级别标题和标签
- fig.suptitle(“figtitle”):设置总标题(与所有子图平级)
- fig.supxlabel(“figxlabel”):设置总x标签(如果所有子图标签相同,可以只设置一个总标签)
- fig.supylabel(“figxlabel”):设置总y标签
子图间距
- fig.subplots_adjust(wspace=0.5,hspace=0.5):调整子图之间的间距
- wspace:表示子图间宽度方向间隔系数
- hspace:表示子图间高度方向间隔系数
- fig.tight_layout(pad=1):调整子图四周空白宽度
- pad:四周空白宽度系数
- w_pad:宽度方向空白宽度系数
- h_pad:高度方向空白宽度系数
import numpy as np
import matplotlib.pyplot as plt
#准备数据
x=np.linspace(-np.pi,np.pi,100)
y=np.sin(x)
fig=plt.figure()
#画布设置
fig.suptitle("figtitle", x=0.5, y=0.98)
fig.supxlabel("figxlabel", x=0.5, y=0.02)
fig.supylabel("figylabel", x=0.02, y=0.5)
fig.subplots_adjust(wspace=0.5,hspace=0.5)
fig.tight_layout(pad=2)
ax1=fig.add_subplot(2,2,1)
ax1.plot(x,y,'r-')
ax2=fig.add_subplot(2,2,3)
ax2.plot(x,y,'b:')
ax3=fig.add_subplot(1,2,2)
ax3.plot(x,y,'Dg--')
plt.show()
参考文章:
Matplotlib系列(一):快速绘图入门_matplotlib思维导图-CSDN博客
python利用matplotlib进行可视化_import numpy as np data = np.arange(10) data plt.p-CSDN博客
【python绘图】Matplotlib绘图及设置(使用python制图)_python画图设置-CSDN博客
Matplotlib入门-6-plt.bar( )绘制柱状图 - 知乎
转自:python可视化模块—快速利用matplot绘制图表-CSDN博客