matplotlib绘图(import matplotlib.pyplot as plt)
matplotlib简介
matplotlib 是一个 python 绘图库,其设计理念是能够用轻松简单的方式生 成强大的可视化效果,只需几行代码即可生成绘图,直方图,功率谱,条形 图,错误图,散点图等,是数据分析核心库之一。
matplotlib 中应用最广的 是 matplotlib.pyplot 模块。
下图就是matplotlib绘图的基本流程,我们对于matplotlib.pyplot模块的函数讲解基于此流程进行:
流程一
创建画布
函数 | 作用 |
---|---|
plt.figure(num=None, figsize=None, dpi=None) | (1)num:可以将该num:窗口的身份标识。如果不提供该参数,则创建窗口的时候该参数会自增,如果提供的话则该窗口会以该num为Id存在。(2)figsize:可选参数,英寸单位的宽和高的数组。默认值为 [6.4, 4.8](3)dpi:可选参数,整数。表示该窗口的分辨率,默认值为100。 |
创建子图
函数 | 作用 |
---|---|
fig,axes = subplots(nrows=1, ncols=1, sharex=False, sharey=False) | (1)创建一个画布 (2)nrows,ncols分别代表创建的子图的行数和列数,默认值为1 (3)sharex,sharey参数:bool 或{‘none’, ‘all’, ‘row’, ‘col’} (4)返回值fig为画布的身份标识,axes代表了子图 |
axes = fig.add_subplot( *args, **kwargs) | 此函数不能创建画布,使用前应先创建画布(fig代表画布变量),例:axes = fig.add_subplot(3,3,2)表示将画布分为3行3列的子图,选择第2个子图并返回该子图的身份标识 |
sharey与sharex的参数相同,以sharex为例:
sharex | 含义 |
---|---|
True或all | 代表所有子图共享x轴 |
row | 代表每行子图共享一个x轴 |
False或none | 每个子图的x轴都是独立的 |
col | 每列子图共享一个x轴 |
流程一完成,案例展示一下:
import matplotlib.pyplot as plt
#创建画布
fig = plt.figure(figsize = [5,4],dpi = 100)
print('fig画布的身份标识{}'.format(fig))
#使用add_subplot创建子图
axes = fig.add_subplot(3,3,5)
axes.set_title('number ten')
#使用subplots创建画布和子图
fig2,axes = plt.subplots(nrows = 2,ncols = 2)
axes[0,1].set_title('number two')
print('fig2画布的身份标识{}'.format(fig2))
plt.show()
效果图
流程二
大的框架我们已经准备好了,接下来就是给画布或者子图进行画图表,并添加细节。
首先是图表的标题,横纵轴的刻度,范围,名称等
函数 | 作用 |
---|---|
plt.title(label, fontdict=None, loc=None, pad=None, *, y=None, **kwargs) | (1)label 是要设置的标题文本 (2)fontdict 可选参数,用于设置标题的字体属性,例如字体名称、大小、颜色等。(3)loc 参数用于指定标题的位置,可以使用字符串( ‘left’、‘center’、‘right’等)或数字表示。(4)pad 参数用于指定标题与图形边界之间的距离。 |
plt.xlabel(xlabel, fontdict=None, labelpad=None, *, loc=None, **kwargs)和plt.ylabel | (1)xlabel:x轴的名称 (2)fontdict 可选参数,用于设置x轴名称的字体属性 (3)x轴名称与图形边界之间的距离 (4)loc 参数用于指定标题的位置 |
plt.xlim(*args, **kwargs)和plt.ylim | 显示或设置x轴的范围,若不填参数,函数返回x轴的左右范围。填参数表示设置x轴的表示范围。例plt.xlim(-1,2),plt.xlim(left = -1),plt.xlim(right = 2) |
plt.xticks(ticks=None, labels=None, *, minor=False, **kwargs)和plt.yticks | (1)ticks:x轴刻度位置的列表 (2)labels:放在指定刻度位置的标签文本。当ticks参数有输入值,该参数才能传入参数 (3)minor:默认值就是按照ticks给定列表进行显示刻度,为True时ticks将不起效果,刻度由系统选择 |
plt.legend(title,loc,frameon) | (1)title:图例的标题 (2)loc:图例在图表中的位置 (3)frameon:设置是否含有边框。都为可选参数 |
上表中的ontdict是一次性设置多个属性值,然后传入多个函数,就可以控制多个函数的字体属性
例如:
fontdict = {
'fontsize': 10, 'family': ['serif','SimSun'],'weight':'bold'}
ax.set_ylabel(label, fontdict=fontdict)
接着我们进行绘制折线,散点,柱状等图表
color | 说明 | color | 说明 |
---|---|---|---|
‘b’ | 蓝色 | ‘m’ | 洋红色 |
‘g’ | 绿色 | ‘y’ | 黄色 |
‘r’ | 红色 | ‘k’ | 黑色 |
‘c’ | 青绿色 | ‘w’ | 白色 |
‘#008000’ | RGB某颜色 |
linestyle | 说明 |
---|---|
‘-‘ | 实线 |
‘–’ | 破折线 |
‘-.’ | 点划线 |
‘:’ | 虚线 |
’ ’ ’ ‘ | 无线条 |
marker | 说明 | marker | 说明 |
---|---|---|---|
‘.’ | 点标记 | ‘1’ | 下三角标记 |
‘,’ | 像素标记(极小点) | ‘2’ | 上三角标记 |
‘o’ | 实心圈标记 | ‘3’ | 左花三角标记 |
‘v’ | 倒三角标记 | ‘4’ | 右花三角标记 |
‘^’ | 上三角标记 | ’s’ | 实心方形标记 |
‘>’ | 右三角标记 | ‘p’ | 实心五角标记 |
‘<’ | 左三角标记 | ‘*’ | 星形标记 |
‘h’ | 竖六边形标记 | ‘d’ | 瘦菱形标记 |
‘H’ | 横六边形标记 | ‘|’ | 垂直线标记 |
‘+’ | 十字标记 | ‘D’ | 菱形标记 |
‘x’ | x标记 |
函数 | 作用 |
---|---|
plt.plot((x, y, color,linestyle,marker, markerfacecolor,markersize) | 折线图常用的参数:(1)x,y为输入列表,依据x,y的画出折线图 (2)color:控制颜色 (3)linestyle:线条风格 (4)marker:标记风格 (5)markerfacecolor:标记颜色 (6)markersize:标记尺寸 |
plt.bar(x, height, width=0.8, bottom=None, *, align=‘center’, data=None, **kwargs) | 柱状图(1)x:柱子在x轴上的坐标。注意x可以为字符串数组! (2)height:柱子的高度,即y轴上的坐标 (3)width:柱子的宽度。浮点数或类数组结构。默认值为0.8。(4)bottom:柱子的基准高度。浮点数或类数组结构。默认值为0。(4)align:柱子在x轴上的对齐方式.取值{‘center’, ‘edge’},默认为’center’。‘center’:x位于柱子的中心位置。‘edge’:x位于柱子的左侧。如果想让x位于柱子右侧,需要同时设置负width 以及align=‘edge’。color:柱子的填充色.hatch:柱子填充符号 |
plt.pie(x, labels=,autopct=,colors) | 饼状图:(1)x:数量,自动算百分比 (2)labels:每部分名称 (3)autopct:占比显示指定%1.2f%% (4)colors:每部分颜色 |
plt.scatter(x, y, s=20, c=‘b’, marker=‘o’, alpha=None, ) | 散点图:x,y:将要绘制的数据,s:表示一个点的大小,可以为一个数或者数组,c:颜色,可为数组,marker:标记样式,alpha:点的透明度 |
流程三
图像的保存与显示
函数 | 作用 |
---|---|
plt.show() | 显示绘制的图表 |
plt.savefig(fname, dpi=None ) | fname:指定格式图片或者指定文件位置 dpi:画质 |
如果plt.show() 在plt.savefig()前,就会导致保存图片是空白的情况。
其它函数与注意事项
注意事项
(1)在画布上使用子图进行标题,x,y轴的刻度,范围,名称等设置时可能会出现以下报错TypeError: 'Text' object is not callable
检查你的代码如下
axes.title('number ten')
改为
axes.set_title('number ten')
就行了。因为title和set_title是matplotlib的两种接口,对于子图只能使用set_title的接口,其它的函数也类似加上set_
(2)在上面忘了介绍网格化,这里补充一下
plt.grid(visible=None, which=‘major’, axis=‘both’, **kwargs)
函数 | 作用 |
---|---|
visible | 可选参数,布尔值;是否显示网格线,若设置了网格线的关键字参数,则表明要设置网格线且可见;默认visible=None 则网格线不可见 |
which | 可选参数,要操作的网格线类型:‘major’, ‘minor’, ‘both’,默认取值: major,绘制主要刻度网格线 |
axis | 可选参数,要操作哪个轴的网格线:‘x’, ‘y’, ‘both’,默认: both ,同时绘制x轴和y轴网格线 |
alpha | 网格线透明度 |
color | 网格线颜色 |
linestyle | 网格线线条类型 |
linewidth | 网格线线条粗细 |
(3)中文不显示问题,只需要加上
plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题
3D图表
首先,我们先创建3D对象
#方法一,利用关键字
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#定义坐标轴
fig = plt.figure()
ax1 = plt.axes(projection='3d') #直接在画布上创建
ax = fig.add_subplot(111,projection='3d') #多个子图的3D图表
#方法二,利用三维轴方法
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#定义图像和三维格式坐标轴
fig=plt.figure()
ax2 = Axes3D(fig)
这里创建3D对象的第二种方法个人感觉不如第一种方法好用,下面的例子基于第一种方法实现
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
x = np.array([i for i in range(10)])
y = np. array([i for i in range(10)])
z = 3*x+y
#定义坐标轴
fig = plt.figure()
#3D折线图
ax = fig.add_subplot(2,2,1,projection = '3d' ) #多个子图的3D图表
ax.set_title('one')
ax.plot3D(x,y,z)
#3D散点图
ax = fig.add_subplot(2,2,2,projection = '3d' ) #多个子图的3D图表
ax.set_title('two')
ax.scatter3D(x,y,z)
#3D散点图的第二种写法
ax =fig.add_subplot(2,2,3,projection = '3d' ) #多个子图的3D图表
ax.set_title('four')
ax.scatter(x,y,z)
plt.show()
结尾
整理这些东西真是不容易,希望能帮到大家,也希望大家能多多支持