Matplotlib是一个Python 2D绘图库,它以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形。 Matplotlib可用于Python脚本,Python和IPython (opens new window)Shell、Jupyter (opens new window)笔记本,Web应用程序服务器和四个图形用户界面工具包。
Matplotlib 尝试使容易的事情变得更容易,使困难的事情变得可能。 您只需几行代码就可以生成图表、直方图、功率谱、条形图、误差图、散点图等。 更多的示例,请参见基础绘图例子和示例陈列馆。
为了简单绘图,该 pyplot
模块提供了类似于MATLAB的界面,尤其是与IPython结合使用时。 对于高级用户,您可以通过面向对象的界面或MATLAB用户熟悉的一组功能来完全控制线型,字体属性,轴属性等。
pip install matplotlib # 使用pip包管理器安装
poetry add matplotlib # 使用poetry安装
中文文档:https://matplotlib.org.cn/
英文文档:https://matplotlib.org/
一些绘图基础知识
figure
,画纸Sublpot
画质,可多图绘画title
,用来给图形起名字Axis
,横轴叫x
坐标轴label
,纵轴叫y
坐标轴ylabel
Legend
代表图形里的内容Grid
,图形中的虚线,True显示网格Markers
:表示点的形状。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9EuEWiJD-1671340186727)(null)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JQCM2sEa-1671340186817)(null)]
基本的视觉元素有三种:点、线、柱状。
scatter plot
,可以查看两者之间的相关性。line plot
。bar plot
。heatmap
,通过用渐进颜色显示用户热衷的区域或所在地理区域的图。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YApxq19Y-1671340186683)(null)]
语法:
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)
参数说明:
x,y:长度相同的数组,也就是我们即将绘制散点图的数据点,输入数据。
s:点的大小,默认 20,也可以是个数组,数组每个参数为对应点的大小。
c:点的颜色,默认蓝色 ‘b’,也可以是个 RGB 或 RGBA 二维行数组。
marker:点的样式,默认小圆圈 ‘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’, None。
plotnonfinite::布尔值,设置是否使用非限定的 c ( inf, -inf 或 nan) 绘制点。
**kwargs::其他参数。
使用示例:
# -*- coding: utf-8 -*-
"""
Created on Sun Dec 18 10:58:35 2022
@author: Administrator
"""
import matplotlib.pyplot as plt
import numpy as np
import time
np.random.seed(np.int64(time.time())) # 设置随机种子
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
color = np.random.rand(x.size) # 随机颜色
plt.title("Draw Scatter") # 设置标题
plt.scatter(
x,
y,
c=color, # 设置点的颜色
s=x * 100, # 设置每一个点的大小
cmap="viridis", # 设置颜色条
)
plt.colorbar() # 显示颜色条
plt.show() # 显示图片
其余的参数可以自行去尝试.,更多参数可以在官方文档查看,链接:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html
语法:
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
参数说明:
x:浮点型数组,柱形图的 x 轴数据。
height:浮点型数组,柱形图的高度。
width:浮点型数组,柱形图的宽度。
bottom:浮点型数组,底座的 y 坐标,默认 0。
align:柱形图与 x 坐标的对齐方式,‘center’ 以 x 位置为中心,这是默认值。 ‘edge’:将柱形图的左边缘与 x 位置对齐。要对齐右边缘的条形,可以传递负数的宽度值及 align=‘edge’。
**kwargs::其他参数。
示例:
# -*- coding: utf-8 -*-
"""
Created on Sun Dec 18 10:58:35 2022
@author: Administrator
"""
import matplotlib.pyplot as plt
import numpy as np
import time
np.random.seed(np.int64(time.time())) # 修改随机种子
width = 0.5
N = 10
x = np.arange(N)
y = np.random.rand(N)
plt.bar(x, y, width=width)
plt.show()
同时,还可以配置color等参数,可以在官方文档中查看。链接:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.bar.html
语法:
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)
参数说明:
x:浮点型数组,表示每个扇形的面积。
explode:数组,表示各个扇形之间的间隔,默认值为0。
labels:列表,各个扇形的标签,默认值为 None。
colors:数组,表示各个扇形的颜色,默认值为 None。
autopct:设置饼图内各个扇形百分比显示格式,%d%% 整数百分比,%0.1f 一位小数, %0.1f%% 一位小数百分比, %0.2f%% 两位小数百分比。
labeldistance:标签标记的绘制位置,相对于半径的比例,默认值为 1.1,如 <1则绘制在饼图内侧。
pctdistance::类似于 labeldistance,指定 autopct 的位置刻度,默认值为 0.6。
shadow::布尔值 True 或 False,设置饼图的阴影,默认为 False,不设置阴影。
radius::设置饼图的半径,默认为 1。
startangle::起始绘制饼图的角度,默认为从 x 轴正方向逆时针画起,如设定 =90 则从 y 轴正方向画起。
counterclock:布尔值,设置指针方向,默认为 True,即逆时针,False 为顺时针。
wedgeprops :字典类型,默认值 None。参数字典传递给 wedge 对象用来画一个饼图。例如:wedgeprops={‘linewidth’:5} 设置 wedge 线宽为5。
textprops :字典类型,默认值为:None。传递给 text 对象的字典参数,用于设置标签(labels)和比例文字的格式。
center :浮点类型的列表,默认值:(0,0)。用于设置图标中心位置。
frame :布尔类型,默认值:False。如果是 True,绘制带有表的轴框架。
rotatelabels :布尔类型,默认为 False。如果为 True,旋转每个 label 到指定的角度。
使用示例:
# -*- coding: utf-8 -*-
"""
Created on Sun Dec 18 10:58:35 2022
@author: Administrator
"""
import matplotlib.pyplot as plt
import numpy as np
y = np.array([35, 25, 25, 15])
color = np.array(["#d5695d", "#5d8ca8", "#65a479", "#a564c9"])
labels = np.array(['A','B','C','D'])
plt.pie(
y,
labels=labels, # 设置饼图标签
colors=color, # 设置饼图颜色
explode=y/sum(y), # 根据y值突出显示,值越大,距离中心越远
)
plt.show()
更多參數請到官方網站查看:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.pie.html
使用语法:
matplotlib.pyplot.plot(x, y, fmt='b', scalex=True, scaley=True, data=None, **kwargs)
参数说明
x:浮点型数组
y:浮点型数组
fmt:点的形状,格式字符串只是快速设置基本行属性的缩写。所有这些以及更多都可以通过关键字参数进行控制,此参数不能作为关键字传递。默认是蓝色的线。[marker][line][color],可以在官方网站的查找
scalex:横向缩放比例
scaley:纵向缩放比例
使用示例:
# -*- coding: utf-8 -*-
"""
Created on Sun Dec 18 10:58:35 2022
@author: Administrator
"""
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(2, 26, 2) # 数据在X轴的位置,是一个可迭代对象
y = np.array([15, 13, 14.5, 17, 20, 25, 26, 26, 24, 22, 18, 15]) # 数据在Y轴的数据,是一个可迭代对象
# x轴和y轴的数据一起组成了所有要绘制出的坐标
plt.plot(x, y, 'g^') # 传入x和y,通过plot绘图
plt.show() # 程序在执行的时候展示图形
更多參數請到官方網站查看:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html
我们可以使用 pyplot 中的 subplot() 和 subplots() 方法来绘制多个子图。
subplot() 方法在绘图时需要指定位置,subplots() 方法可以一次生成多个,在调用时只需要调用生成对象的 ax 即可。
官方文档地址:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplot.html
使用语法:
subplot(nrows, ncols, index, **kwargs)
subplot(pos, **kwargs)
subplot(**kwargs)
subplot(ax)
以上函数将整个绘图区域分成 nrows 行和 ncols 列,然后从左到右,从上到下的顺序对每个子区域进行编号 1…N ,左上的子区域的编号为 1、右下的区域编号为 N,编号可以通过参数 index 来设置。
设置 numRows = 1,numCols = 2,就是将图表绘制成 1x2 的图片区域, 对应的坐标为:
(1, 1), (1, 2)
使用示例:
# -*- coding: utf-8 -*-
"""
Created on Sun Dec 18 10:58:35 2022
@author: Administrator
"""
import matplotlib.pyplot as plt
import numpy as np
#plot 1:
xpoints = np.array([0, 6])
ypoints = np.array([0, 100])
plt.subplot(1, 2, 1) # 坐标为(1,1),总共有两个子图,1行2列
plt.plot(xpoints,ypoints)
plt.title("plot 1")
#plot 2:
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.subplot(122) # 坐标为(1,2),总共有两个子图,1行2列
plt.plot(x,y)
plt.title("plot 2")
plt.suptitle("Subplot Test")
plt.show()
语法:
matplotlib.pyplot.subplots(nrows=1, ncols=1, *, sharex=False, sharey=False, squeeze=True, width_ratios=None, height_ratios=None, subplot_kw=None, gridspec_kw=None, **fig_kw)
参数说明:
- nrows:默认为 1,设置图表的行数。
- ncols:默认为 1,设置图表的列数。
- sharex、sharey:设置 x、y 轴是否共享属性,默认为 false,可设置为 ‘none’、‘all’、‘row’ 或 ‘col’。 False 或 none 每个子图的 x 轴或 y 轴都是独立的,True 或 ‘all’:所有子图共享 x 轴或 y 轴,‘row’ 设置每个子图行共享一个 x 轴或 y 轴,‘col’:设置每个子图列共享一个 x 轴或 y 轴。
- squeeze:布尔值,默认为 True,表示额外的维度从返回的 Axes(轴)对象中挤出,对于 N1 或 1N 个子图,返回一个 1 维数组,对于 N*M,N>1 和 M>1 返回一个 2 维数组。如果设置为 False,则不进行挤压操作,返回一个元素为 Axes 实例的2维数组,即使它最终是1x1。
- subplot_kw:可选,字典类型。把字典的关键字传递给 add_subplot() 来创建每个子图。
- gridspec_kw:可选,字典类型。把字典的关键字传递给 GridSpec 构造函数创建子图放在网格里(grid)。
- **fig_kw:把详细的关键字参数传给 figure() 函数。
使用示例:
# -*- coding: utf-8 -*-
"""
Created on Sun Dec 18 10:58:35 2022
@author: Administrator
"""
import matplotlib.pyplot as plt
import numpy as np
# 创建一些测试数据
x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)
# 创建一个画像和子图
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')
# 创建两个子图
f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.plot(x, y)
ax1.set_title('Sharing Y axis')
ax2.scatter(x, y)
# 创建四个子图
fig, axs = plt.subplots(2, 2, subplot_kw=dict(projection="polar"))
axs[0, 0].plot(x, y)
axs[1, 1].scatter(x, y)
# 共享 x 轴
plt.subplots(2, 2, sharex='col')
# 共享 y 轴
plt.subplots(2, 2, sharey='row')
# 共享 x 轴和 y 轴
plt.subplots(2, 2, sharex='all', sharey='all')
# 这个也是共享 x 轴和 y 轴
plt.subplots(2, 2, sharex=True, sharey=True)
# 创建标识为 10 的图,已经存在的则删除
fig, ax = plt.subplots(num=10, clear=True)
plt.show()
我们可以使用 pyplot 中的 grid() 方法来设置图表中的网格线。
grid() 方法语法格式如下:
matplotlib.pyplot.grid(b=None, which='major', axis='both', )
参数说明:
- b:可选,默认为 None,可以设置布尔值,true 为显示网格线,false 为不显示,如果设置 **kwargs 参数,则值为 true。
- which:可选,可选值有 ‘major’、‘minor’ 和 ‘both’,默认为 ‘major’,表示应用更改的网格线。
- axis:可选,设置显示哪个方向的网格线,可以是取 ‘both’(默认),‘x’ 或 ‘y’,分别表示两个方向,x 轴方向或 y 轴方向。
- **kwargs:可选,设置网格样式,可以是 color=‘r’, linestyle=‘-’ 和 linewidth=2,分别表示网格线的颜色,样式和宽度。
使用示例:
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.title("Plot grid() Test")
plt.xlabel("x - label")
plt.ylabel("y - label")
plt.plot(x, y)
plt.grid()
plt.show()
更多参数请到官方文档查看:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.grid.html
我们可以使用 xlabel() 和 ylabel() 方法来设置 x 轴和 y 轴的标签,使用 title() 方法来设置标题。
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.plot(x, y)
plt.title("Plot TEST TITLE And LABEL")
plt.xlabel("x - label")
plt.ylabel("y - label")
plt.show()
可以通过查看标题的相关参数来配置标签的参数,官网地址:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.title.html
注意:matplotlib是不支持中文的,如果我们要使用中文的话,我们需要使用
fontdict
来指定字体
使用语法:
legend()
legend(handles, labels)
legend(handles=handles)
legend(labels)
使用示例:
ax.plot([1, 2, 3], label='Inline label')
ax.legend()
--------------------------------------
line, = ax.plot([1, 2, 3])
line.set_label('Label via method')
ax.legend()
--------------------------------------
ax.legend([line1, line2, line3], ['label1', 'label2', 'label3'])
--------------------------------------
line1, = ax.plot([1, 2, 3], label='label1')
line2, = ax.plot([1, 2, 3], label='label2')
ax.legend(handles=[line1, line2])
还有
loc
参数可以指定图例的位置等,更多参数请到官方文档查看:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html
我们可以使用rcParams
来设置全局的一个组的整体配置
设置方式一:
语法:
plt.rcParams['property'] = 'value'
使用示例:
# -*- coding: utf-8 -*-
"""
Created on Sun Dec 18 10:58:35 2022
@author: Administrator
"""
import matplotlib.pyplot as plt
import numpy as np
# 创建一些测试数据
x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)
# 关于plt画图的一些配置
plt.rcParams['font.family'] = 'SimHei' # 设置字体
plt.rcParams['axes.unicode_minus'] = False # 在坐标轴上可以显示负号
plt.rcParams["axes.labelsize"] = 15 # 设置轴标签的大小
plt.rcParams["axes.titlesize"] = 25 # 设置标题字体大小
plt.rcParams['legend.fontsize'] = 15 # 设置图例字体大小
plt.plot(x, y)
plt.xlabel("x轴的数据")
plt.ylabel("y轴的值")
plt.title("折线图测试")
plt.show()
更多关于rcParams
的属性,可以通过官方文档查看:https://matplotlib.org/stable/api/matplotlib_configuration_api.html#matplotlib.rcParams
设置方式二:
我们可以使用rc
来配置
我们可以将上面的配置这样进行配置:
# 关于plt画图的一些配置
plt.rc("font", **{"family": 'SimHei'})
plt.rc("axes", **{"unicode_minus": False, "labelsize": 15, "titlesize": 25})
plt.rc("legend", fontsize=15)