Matplotlib是一个Python 2D绘图库,可以生成各种硬拷贝格式和跨平台交互式环境的出版物质量数据。Matplotlib可用于Python脚本,Python和IPython shell,Jupyter笔记本,Web应用程序服务器和四个图形用户界面工具包。
一 简介:
Matplotlib试图让简单易事的事情成为可能。你只需几行代码即可生成绘图,直方图,功率谱,条形图,误差图,散点图等。
对于简单的绘图,pyplot模块提供类似MATLAB的接口,特别是与IPython结合使用时。 对于高级用户,你可以通过面向对象的界面或通过MATLAB用户熟悉的一组函数完全控制线型,字体属性,轴属性等。
二 相关文档:
Matplotlib 中文文档:https://www.matplotlib.org.cn/home.html.
官网教程文档:https://matplotlib.org/users/index.html
三 入门:
pyplot基本绘图流程主要分为3个部分:
1.基础绘图语法
import numpy as np
import matplotlib.pyplot as plt
data = np.arange(0,1.1,0.01)
plt.title('lines')#添加标题
plt.xlabel('x')#添加x轴名称
plt.ylabel('y')#添加y轴名称
plt.xlim((0,1))#确定x轴范围
plt.ylim((0,1))#确定y轴范围
plt.xticks([0,0.2,0.4,0.6,0.8,1])#规定x轴刻度
plt.yticks([0,0.2,0.4,0.6,0.8,1])#规定y轴刻度
plt.plot(data,data**2)#添加y=x^2曲线
plt.plot(data,data**4)#添加y=x^4曲线
plt.legend(['y=x^2','y=x^4'])#指定图例
plt.savefig('y=x^2.png')#保存绘制图形
plt.show()#在本机显示图形
out:
2.包含子图绘制的基础语法
rad = np.arange(0,np.pi*2,0.01)
#第一幅图
p1 = plt.figure(figsize=(8,6),dpi=80)#确定画布大小
ax1 = p1.add_subplot(2,1,1)#创建一个2行1列的子图,并开始绘制第一幅
plt.title('lines')
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(rad,rad**2)
plt.plot(rad,rad**4)
plt.legend(['y=x^2','y=x^4'])
#第二副图
ax2 = p1.add_subplot(2,1,2)
plt.title('sin/cos')
plt.xlabel('rad')
plt.ylabel('value')
plt.xlim(0,np.pi*2)
plt.ylim((-1,1))
plt.xticks([0,np.pi/2,np.pi,np.pi*1.5,np.pi*2])
plt.yticks([-1,-0.5,0,0.5,1])
plt.plot(rad,np.sin(rad))
plt.plot(rad,np.cos(rad))
plt.legend(['sin','cos'])
plt.savefig('sincos.png')
plt.show()
out:
3.设置pyolot的动态rc参数
pyplot使用rc配置文件来自定义图形的各种默认属性,被称为rc配置或rc参数。在pyplot中,几乎所有的默认属性都可以控制,例如视图窗口大小以及每英寸点数,线条宽度,颜色和样式,文本、字体等。
#原图
x = np.linspace(0,4*np.pi)
y = np.sin(x)
plt.plot(x,y,label="$sin(x)$")
plt.title('sin')
plt.savefig('默认sin曲线.png')
plt.show()
#修改rc参数后的图
plt.rcParams['lines.linestyle'] = '-.' #线条样式
plt.rcParams['lines.linewidth'] = 3 #线条宽度
plt.plot(x,y,label="$sin(x)$")
plt.title('sin')
plt.savefig('修改后的sin曲线.png')
plt.show()
线条常用的rc参数名称、解释与取值:
rc参数名称 | 解释 | 取值 |
---|---|---|
lines.linewidth | 线条宽度 | 取0-10之间的数值,默认为1.5 |
lines.linestyle | 线条样式 | “-” “–” “-.” “:” 默认为"-" |
lines.marker | 线条上点的形状 | 可取"o" “D” “h” “.” ","等等 默认为None |
lines.markersize | 点的大小 | 取0-10之间的数值 默认为1 |
lines.marker :
4.绘制散点图
散点图又称为散点分布图,是以一个特征为横坐标,另一个特征为纵坐标,利用坐标点的分布形态反应也证件的统计关系的一种图形。
matplotlib.pyplot.scatter(x,y,s=None,c=None,marker=None,alpha=None,**kwargs)
x,y 接收array,表示x轴y轴对应的数据 s指点的大小,默认为None c指点颜色,默认为None,marker为绘制点的类型,alpha表示点的透明度
#2000~2017年各季度国民生产总值散点图:
#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams[u'font.sans-serif'] = ['simhei'] #设置中文
plt.rcParams['axes.unicode_minus'] = False #设置中文
data = np.load('国民经济核算季度数据.npz')
name = data['columns']
values = data['values']
plt.figure(figsize=(8,7))
plt.scatter(values[:,0],values[0:,2],marker='o')
plt.xlabel('年份');plt.ylabel('GDP (亿元)')
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.savefig('2000~2017年各季度国民生产总值散点图.png')
plt.show()
out:
2000~2017年各产业各季度国民生产总值散点图:
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams[u'font.sans-serif'] = ['simhei']
plt.rcParams['axes.unicode_minus'] = False
data = np.load('国民经济核算季度数据.npz')
name = data['columns']
values = data['values']
plt.figure(figsize=(8,7))#设置画布
#绘制散点图1
plt.scatter(values[:,0],values[:,3], marker='o',c='red')
plt.scatter(values[:,0],values[:,4], marker='D',c='blue')
plt.scatter(values[:,0],values[:,5], marker='v',c='yellow')
plt.xlabel('年份')#设置横轴标签
plt.ylabel('生产总值(亿元)')#添加纵轴标签
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.title('2000~2017年各产业各季度国民生产总值散点图')
plt.legend(['第一产业','第二产业','第三产业'])#添加图例
plt.savefig('2000~2017年各产业各季度国民生产总值散点图.png')
plt.show()
out:
4.绘制折线图
折线图是一种将数据点连接起来的图形,可以看作散点图按照x轴坐标顺序连接起来的图形。
matplotlib.pyplot.plot(*args, **kwargs)
x,y x和y轴对应的数据 color指线条的颜色 linestyle 线条类型 marker指绘制点的类型 alpha指点的透明度
2000~2017年各季度国民生产总值折线图:
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams[u'font.sans-serif'] = ['simhei']
plt.rcParams['axes.unicode_minus'] = False
data = np.load('国民经济核算季度数据.npz')
values = data['values']
plt.figure(figsize=(8,7))
plt.plot(values[:,0],values[:,2],color='r',linestyle='--',marker='o')
plt.xlabel('年份')
plt.ylabel('生产总值(亿元)')
plt.ylim((0,225000))
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.title('2000~2017年各季度国民生产总值折线图')
plt.savefig('2000~2017年各季度国民生产总值折线图.png')
plt.show()
out:
绘制2000~2017年各产业各季度国民生产总值折线图 :
#绘制2000~2017年各产业各季度国民生产总值折线图 部分代码省略
plt.figure(figsize=(8,7))
plt.plot(values[:,0],values[:,3],'bs-',
values[:,0],values[:,4],'ro-.',
values[:,0],values[:,5],'gH--')#绘制折线图
plt.xlabel('年份')
plt.ylabel('生产总值(亿元)')
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.title('2000~2017年各产业各季度国民生产总值折线图')
plt.legend(['第一产业','第二产业','第三产业'])
plt.savefig('2000~2017年各产业各季度国民生产总值折线图.png')
plt.show()
out:
5.绘制直方图
直方图又称质量分布图,是统计报告图的一种,由一系列高度不等的纵向条纹或线段表示数据分布情况,一般用横轴表示数据所属类别,纵轴表示数量或者占比。
matplotlib.pyplot.bar(left,height,width=0.8,bottom=None,hold=None,data=None,**kwargs)
参数名称 | 说明 |
---|---|
left | 接收array,表示x轴数据 |
height | 接收array,表示y轴数据 |
width | 接收0-1的float,直方图宽度,默认为0.8 |
color | 直方图颜色 |
绘制2017年第一季度各产业国民生产总值直方图:
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams[u'font.sans-serif'] = ['simhei']
plt.rcParams['axes.unicode_minus'] = False
data = np.load('国民经济核算季度数据.npz')
name = data['columns']
values = data['values']
label = ['第一产业','第二产业','第三产业']
plt.figure(figsize=(6,5))
plt.bar(range(3),values[-1,3:6],width = 0.5)#绘制直方图
plt.xlabel('产业')
plt.ylabel('生产总值(亿元)')
plt.xticks(range(3),label)#x轴的数目与取值
plt.title('2017年第一季度各产业国民生产总值直方图')
plt.savefig('2017年第一季度各产业国民生产总值直方图.png')
plt.show()
out:
6.绘制饼图
饼图是将各项的大小与各项总和的比例显示在一张饼中,以饼的大小来确定每一项的占比。
matplotlib.pyplot.pie(x,explode=None,labels=None,colors=None,autopct=None,pctdistance=0.6, shadow=False,labeldistance=1.1,startangle=None,radius=None,…)
参数名称 | 说明 |
---|---|
x | 接收array,用于绘制pie的参数 |
explode | 接收array 制定项离饼图圆心为n个半径 |
labels | 每一项的名称 |
color | 饼图颜色 |
autopct | 数值的显示方式 |
pctdistance | 每一项比例和距离饼图n个半径 默认为0.6 |
labeldistance | 指定每一项的比例和距离饼图圆心n和半径 |
radius | 饼图半径,默认为1 |
绘制2017年第一季度各产业国民生产总值饼图:
#部分代码省略
plt.figure(figsize=(6,6))#将画布设置为正方形
label = ['第一产业','第二产业','第三产业']
explode = [0.01,0.01,0.01]#设置各项距离圆心n个半径
plt.pie(values[-1,3:6],explode=explode,labels=label,autopct='%1.1f%%')
plt.title('2017年第一季度各产业国民生产总值饼图')
plt.savefig('2017年第一季度各产业国民生产总值饼图.png')
plt.show()
out:
6.绘制箱线图
箱线图也称箱须图,其绘制需使用常用统计量,能提供有关数据位置和分散情况的关键信息,尤其在比较不同特征值的时候,更可表现其分散程度差异。
matplotlib.pyplot.boxplot(x,notch=None,sym=None,vert=None,whis=None,positions=None,widths=None,patch_artist=None,meanline=None,labels=None,…)
参数名称 | 说明 |
---|---|
x | 绘制箱线图的数据 |
notch | 箱体是否有缺口 |
sym | 异常点形状 |
vert | 图像纵向或横向 |
positions | 图形位置 |
widths | 每个箱体的宽度 |
labels | 箱线图的标签 |
meanline | 是否显示均值线 |
绘制2000~2017年各产业国民生产总值箱线图:
#部分代码省略
label = ['第一产业','第二产业','第三产业']
gdp= (list(values[:,3]),list(values[:,4]),list(values[:,5]))
plt.figure(figsize=(6,4))
plt.boxplot(gdp,notch=True,labels=label,meanline=True)
plt.title('2000~2017年各产业国民生产总值箱线图')
plt.savefig('2000~2017年各产业国民生产总值箱线图.png')
plt.show()
out: