matplotlib基本使用
Posted deaseyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matplotlib基本使用相关的知识,希望对你有一定的参考价值。
三种方法
读图: jin = plt.imread(‘./jinzhengen.png‘)
最小值 作为灰度值
jin_min = jin.min(axis=2)
最大值 作为灰度值
jin_max = jin.max(axis=2)
平均值 作为灰度值
jin_mean = jin.mean(axis=2)
加权平均值 作为灰度值 (使用最多)
weight = np.array([0.299,0.587,0.114]) # 权重jin_weight = np.dot(jin, weight)/3
Matplotlib基础知识
Matplotlib中的基本图表包括的元素
-
x轴和y轴 : 水平和垂直的轴线
-
x轴和y轴刻度 : 刻度标示坐标轴的分隔,包括最小刻度和最大刻度
-
x轴和y轴刻度标签 : 表示特定坐标轴的值
-
绘图区域 : 实际绘图的区域
可以理解为 画板(包含边框), 画布(绘图区)
只含单一曲线的图
plt.plot(x,y)
plt.plot(y) # 只给一个值,默认为y轴,以y数据索引0 到 N-1 作为x轴
包含多个曲线的图
1、可以使用多个plot函数(推荐),在一个图中绘制多个曲线 (碰到 plt.show() 函数结束本次绘图)
plt.plot(x,y)
plt.plot(x,np.sin(x))
plt.show() # show方法显示前面画布的所有图,之后画图会重建一个画布
plt.plot(x,x)
2、也可以在一个plot函数中传入多对X,Y值,在一个图中绘制多个曲线
plt.plot(x,y,x,np.sin(x)) # x, y需成对出现
网格线
plt.grid(True) 方法为图添加网格线
-
lw(linewidth) : 线的粗细
-
ls(linestyle): ‘-‘ ,‘--‘ , ‘-.‘, ‘:‘
-
alpha : 线的明暗程度
-
color : 颜色
-
which : major 主网格
-
axis: ‘x‘ ,‘y‘,‘both‘ 显示哪方向网格线
plt.grid(which=‘major‘)
在一个画布中画多个子图
方式1:
x= np.linspace(-20,20,200)
plt.figure(figsize=(3*5,4)) # 创建画布 宽为15(一行三个子图3*5), 高为4
?
axes1 = plt.subplot(1,3,1) # 创建子图 一行三列第一个
axes1.plot(x,np.sin(x))
plt.grid()
?
axes2 = plt.subplot(1,3,2)
axes2.plot(x,np.sin(x))
plt.grid()
?
axes3 = plt.subplot(1,3,3)
axes3.plot(x,x**2)
plt.grid()
方式2:
?
坐标轴界限
axis方法
如果axis方法没有任何参数,则返回当前坐标轴的上下限axis(xmin =,ymax = )
?
设置坐标轴类型:
plt.axis(‘equal‘)
-
‘off‘: 关闭坐标轴
-
‘equal‘: x,y轴刻度精度相等
-
‘scaled‘: 效果和equal一样,x,y轴刻度范围一样
xlim方法和ylim方法
除了plt.axis方法,还可以通过xlim,ylim方法设置坐标轴范围
plt.plot(x,x**2)
plt.xlim(xmin=-1, xmax=1) # 关键字形式
plt.ylim((0,1)) # 还可以元组形式
坐标轴标签
xlabel方法和ylabel方法
注意: plt.xlabel() 子图使用: 对象.set_xlabel()
-
fontdict : 设置字体, 字典形式
-
-
c(color): ‘r‘
-
rotation 旋转角度 (可写字典外面)
-
position=(0,1)) (可写字典外面)
-
x = np.linspace(-1,1,1000)
y = (1-x**2)**0.5
plt.plot(x,y,x,-y)
xlabel = plt.xlabel(‘x‘, fontdict=dict(fontsize=50, c=‘r‘,rotation=90)) # 直接参数设置
# xlabel.set_rotation(60) # 通过xlabel对象设置
plt.ylabel(‘y=(1-x^2)^0.5‘, fontdict=dict(fontsize=20), rotation=0, position=(0,1))
标题
注意: plt.title() 子图使用: 对象.set_title()
-
loc=‘right‘ 标题显示位置 center(默认) left
-
fontdict : 字典形式 同标签
plt.title(‘circle‘, loc=‘right‘, fontdict={‘fontsize‘:50, ‘rotation‘:60})
# 子图没有.title(),需使用.set_title()
图例
legend()方法
两种传参方法:
【推荐使用】在plot函数中增加label参数
?
在legend方法中传入字符串列表
-
loc参数
plt.legend(loc=8)
plt.legend(loc=(0,1)) # 相对坐标(画板坐标)
字符串 | 数值 | 字符串 | 数值 |
---|---|---|---|
best | 0 | center left | 6 |
upper right | 1 | center right | 7 |
upper left | 2 | lower center | 8 |
lower left | 3 | upper center | 9 |
lower right | 4 | center | 10 |
right | 5 |
-
ncol参数
ncol控制图例中有几列
plt.legend(loc=8,ncol=3)
保存图片
figure.savefig(): 需创建figure对象
-
filename含有文件路径的字符串或Python的文件型对象。图像格式由文件扩展名推断得出,例如,.pdf推断出PDF,.png推断出PNG (“png”、“pdf”、“svg”、“ps”、“eps”……)
-
dpi图像分辨率(每英寸点数),默认为100
-
facecolor图像的背景色,默认为“w”(白色)
-
transparent=True 透明
-
edgecolor: 边缘颜色
figure = plt.figure(figsize=(10,6))
plt.plot(n1,label=‘one‘,ls=‘-.‘)
figure.savefig(‘./art.png‘, facecolor=‘g‘, dpi=200, transparent=True)
设置plot的风格和样式
点和线的样式
颜色
参数color或c
颜色值的方式
-
别名
-
color=‘r‘
-
-
合法的html颜色名
-
color = ‘red‘
-
颜色 | 别名 | HTML颜色名 | 颜色 | 别名 | HTML颜色名 |
---|---|---|---|---|---|
蓝色 | b | blue | 绿色 | g | green |
红色 | r | red | 黄色 | y | yellow |
青色 | c | cyan | 黑色 | k | black |
洋红色 | m | magenta | 白色 | w | white |
-
HTML十六进制字符串
color = ‘#eeefff‘
-
归一化到[0, 1]的RGB元组
color = (0.3, 0.3, 0.4)
透明度
alpha参数 值为0-1范围
plt.plot(x,np.sin(x), c=‘b‘, alpha=0.1)
背景色
设置坐标轴的背景色(画布)
# 方式1
axes = plt.subplot(facecolor=‘g‘) # 设置画布背景色
axes.plot(x, np.sin(x))
?
# 方式2
plt.gca(facecolor=‘g‘) # 获取当前轴面
plt.plot(x, np.sin(x))
设置画板背景色
plt.figure(facecolor=‘r‘)
plt.plot(x, np.sin(x))
线型
参数linestyle或ls
线条风格 | 描述 | 线条风格 | 描述 |
---|---|---|---|
‘-‘ | 实线 | ‘:‘ | 虚线 |
‘--‘ | 破折线 | ‘steps‘ | 阶梯线 |
‘-.‘ | 点划线 | ‘None‘ / ‘,‘ | 什么都不画 |
线宽
参数linewidth或lw
plt.plot(x, np.sin(x), linewidth=5, c=‘r‘)
不同宽度的破折线
dashes参数 设置破折号序列各段的宽度
# dashes的元素个数必须是偶数个 [线宽,空白宽] 交替
plt.plot(x, np.sin(x), linewidth=5, c=‘r‘, dashes=[3,5,1,2,6,7])
点型
marker : 点形状
markersize: 点大小
x = np.linspace(0, 2*np.pi, 10)
plt.plot(x, np.sin(x), c=‘r‘, marker=‘2‘, markersize=50)
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
‘1‘ | 一角朝下的三脚架 | ‘3‘ | 一角朝左的三脚架 |
‘2‘ | 一角朝上的三脚架 | ‘4‘ | 一角朝右的三脚架 |
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
‘s‘ | 正方形 | ‘p‘ | 五边形 |
‘h‘ | 六边形1 | ‘H‘ | 六边形2 |
‘8‘ | 八边形 |
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
‘.‘ | 点 | ‘x‘ | X |
‘*‘ | 星号 | ‘+‘ | 加号 |
‘,‘ | 像素 |
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
‘o‘ | 圆圈 | ‘D‘ | 菱形 |
‘d‘ | 小菱形 | ‘‘,‘None‘,‘ ‘,None | 无 |
多参数连用
颜色、点型、线型
x = np.linspace(0, 2*np.pi, 10)
plt.figure(figsize=(10,8))
plt.plot(x, np.sin(x), ‘g-o‘, markersize=50) # g-o 表示 线颜色,线型,点型 可不写全
更多点和线的设置
x = np.linspace(0,10, 10)
plt.plot(x,x,c=‘b‘, lw=2, ls=‘-.‘, marker=‘o‘, markersize=10, markeredgecolor=‘g‘,markeredgewidth=3,markerfacecolor=‘r‘)
参数 | 描述 | 参数 | 描述 |
---|---|---|---|
color或c | 线的颜色 | linestyle或ls | 线型 |
linewidth或lw | 线宽 | marker | 点型 |
markeredgecolor | 点边缘的颜色 | markeredgewidth | 点边缘的宽度 |
markerfacecolor | 点内部的颜色 | markersize | 点的大小 |
在一条语句中为多个曲线进行设置
x = np.linspace(0,2*np.pi, 10)
plt.plot(x,np.sin(x),‘g:o‘,x,np.cos(x),‘b-.*‘,markersize=10 )
多个曲线同一设置
# 统一相同设置,使用关键参数, 会覆盖前面单独设置属性
x = np.linspace(0,2*np.pi, 10)
plt.plot(x, np.sin(x), ‘g:d‘,x, np.cos(x),color=‘r‘) # g:d 失效
三种设置方式
向方法传入关键字参数
plt.plot(x,np.sin(x), c=‘r‘)
对实例使用一系列的setter方法
line, = plt.plot(x,np.sin(x))line.set_color(‘g‘)
使用setp()方法
line, = plt.plot(x,np.sin(x))plt.setp(line, ‘color‘, ‘y‘) # setp : set property
X、Y轴坐标刻度
xticks()和yticks()方法
plt.plot(x,np.sin(x), c=‘r‘)
# ticks 刻度 labels 标签
plt.xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi], [‘0‘, ‘np.pi/2‘, ‘np.pi‘, ‘3np.pi/2‘, ‘2np.pi‘])
plt.yticks([-1, 0 ,1], [‘-1‘, ‘0‘, ‘1‘])
面向对象方法
axes = plt.subplot() # 创建子图
使用子图对象调用:
set_xticks、set_yticks、set_xticklabels、set_yticklabels方法
正弦余弦
LaTex语法,用??π等表达式在图表上写上希腊字母
α alpha , Π pi , θ theta , σ sigma , λ lambda
?
2D图形
直方图
【直方图的参数只有一个x!!!不像条形图需要传入x,y】
hist() 参数
-
bins可以是一个bin数量的整数值,也可以是表示bin的一个序列。默认值为10
-
normed如果值为True,直方图的值将进行归一化处理,形成概率密度,默认值为False
-
color指定直方图的颜色。可以是单一颜色值或颜色的序列。如果指定了多个数据集合,颜色序列将会设置为相同的顺序。如果未指定,将会使用一个默认的线条颜色
-
orientation设置orientation为horizontal创建水平直方图。默认值为vertical
?
条形图¶
【条形图有两个参数x,y!】
bar() 水平显示、barh() 垂直显示
plt.bar(np.arange(0,10), x, width=1 ) # 条形图的x必须写.
饼图
【饼图也只有一个参数x!】
pie()饼图适合展示各部分占总体的比例,条形图适合比较各部分的大小
n = [1,2,3]
plt.pie(n) # n 个元素和超过1, 会计算个元素所占综合总和比例
?
n = [0.4, 0.2, 0.3, 0.1] # 各部分刚好占满饼图
plt.pie(n)
?
n = [0.4, 0.2, 0.3,] # 普通未占满饼图
plt.pie(n)
?
饼图阴影、分裂等属性设置
#labels参数设置每一块的标签;labeldistance参数设置标签距离圆心的距离(比例值)
#autopct参数设置比例值的显示格式(%1.1f%%);pctdistance参数设置比例值文字距离圆心的距离
#explode参数设置每一块顶点距圆形的长度(比例值);colors参数设置每一块的颜色;
#shadow参数为布尔值,设置是否绘制阴影
# autopct: auto percentage 显示比例 explode: 裂开, 饼尖距圆心距离 labels: 各部分标签名
# labeldistance: 标签距圆心距离 pctdistance: 比例距圆心距离,默认0.6 shadow=True 加阴影
# startangle: 起始角度 textprops={‘size‘,20} 字体
plt.pie([0.4, 0.2, 0.3, 0.1],autopct=‘%.2f%%‘, explode=[0.1,0.2,0.1,0.3], labels=list(‘ABCD‘),labeldistance=1,colors=[‘red‘, ‘green‘, ‘magenta‘, ‘cyan‘],pctdistance=0.8,shadow=True,startangle=60,textprops={‘size‘:20})
散点图
【散点图需要两个参数x,y,但此时x不是表示x轴的刻度,而是每个点的横坐标!】
scatter()
x = np.linspace(0, 2* np.pi, 20)
y = np.sin(x)
plt.scatter(x,y, s=100,c=‘r‘, marker=‘d‘, alpha=0.6, ) # s 点的大小 alpha 透明度
生成随机大小,随机颜色,随机透明 的饼图
x = np.random.randn(1000)
y = np.random.randn(1000)
plt.figure(figsize=(10,6))
colors = np.random.rand(1000,4) # RGBA 随机点颜色,透明度
size = np.random.randint(0,100,size=1000) # 随机点大小
plt.scatter(x,y,marker=‘d‘,c=colors, s=size)
颜色表示:
向量 - 对每个标记使用不同的颜色,并以线性方式将 c
中的值映射到当前颜色图中的颜色。c
的长度必须等于 x
和 y
的长度。
plt.scatter(x,y,marker=‘d‘,c=[0,1,2,1,3], s=size) # c 中每个数字代表一个颜色,映射图中点的颜色, c长度等于x和y长度
图形内的文字、注释、箭头
控制文字属性的方法:
所有的方法会返回一个matplotlib.text.Text对象
Pyplot函数 | API方法 | 描述 |
---|---|---|
text() | mpl.axes.Axes.text() | 在Axes对象的任意位置添加文字 |
xlabel() | mpl.axes.Axes.set_xlabel() | 为X轴添加标签 |
ylabel() | mpl.axes.Axes.set_ylabel() | 为Y轴添加标签 |
title() | mpl.axes.Axes.set_title() | 为Axes对象添加标题 |
legend() | mpl.axes.Axes.legend() | 为Axes对象添加图例 |
figtext() | mpl.figure.Figure.text() | 在Figure对象的任意位置添加文字 |
suptitle() | mpl.figure.Figure.suptitle() | 为Figure对象添加中心化的标题 |
annnotate() | mpl.axes.Axes.annotate() | 为Axes对象添加注释(箭头可选) |
图形内的文字
text() 和 figtext()
# 显示文字到坐标轴内
plt.text(0,0,‘sin(0)=0‘)
plt.text(np.pi/2, 1, ‘sin($pi/2$)=1‘,fontdict=dict(fontsize=20))
?
# 显示文字到坐标轴外
plt.figtext(1,0.5, ‘y=sin(x)‘)
注释
annotate()xy参数设置箭头指示的位置,xytext参数设置注释文字的位置arrowprops参数以字典的形式设置箭头的样式width参数设置箭头长方形部分的宽度,headlength参数设置箭头尖端的长度,headwidth参数设置箭头尖端底部的宽度,facecolor(color)设置箭头颜色shrink参数设置箭头顶点、尾部与指示点、注释文字的距离(比例值)
# 第一个坐标代表指示点, 第二个代表注释文字位置
plt.annotate(‘this is me‘,(5,10),(8,15),arrowprops=dict(width=10,headwidth=20,headlength=20, color=‘r‘,shrink=0.1))
设置图例
bbox_to_anchor,ncol mode,borderaxespad设置注解 arrowstyle
plt.plot(n1, label=‘plot‘)
plt.plot(n2, label=‘2nd plot‘)
plt.plot(n3, label=‘last plot‘)
plt.legend(loc=(0,1), ncol=3, mode=‘expand‘,borderaxespad=0,bbox_to_anchor=[0,1,1,0.08] )
plt.ylim(ymax=43) # 设置y轴上限
plt.annotate(‘important value‘, (50,20),(20,40),arrowprops=dict(arrowstyle=‘->‘))
箭头
样式arrstyles = [‘-‘, ‘->‘, ‘-[‘, ‘<-‘, ‘<->‘, ‘fancy‘, ‘simple‘, ‘wedge‘]
3D图
曲面图
from mpl_toolkits.mplot3d.axes3d import Axes3D
x = np.linspace(0,8,100)
y = np.linspace(0,8,100)
X,Y = np.meshgrid(x,y) # 生成网格
Z = np.sin(X) + np.cos(Y) + 3
?
plt.figure(figsize=(7*2, 6))
axes1 = plt.subplot(1,2,1,projection=‘3d‘) # 定义画三维图的子图
axes1.plot_surface(X,Y,Z) # 画三维图
?
axes2 = plt.subplot(1,2,2,projection=‘3d‘)
axes2 = axes2.plot_surface(X,Y,Z,cmap=‘rainbow‘)
plt.colorbar(axes2,shrink=0.5) # 设置颜色柱, shrink 宽高缩小为0.5倍
玫瑰图/极坐标条形图
x = np.arange(0,2*np.pi,np.pi/4) # x 使用弧度
y = 一个 ndarray
plt.subplot(projection=‘polar‘, facecolor=‘g‘)plt.bar(x,y,width=np.pi/4,color=np.random.rand(8,3))
以上是关于matplotlib基本使用的主要内容,如果未能解决你的问题,请参考以下文章
在 matplotlib 内联和 QT 后端之间切换 Python 脚本