matplotlib绘图详解

matplotlib绘图详解

一、 基础准备

1、 matplotlib简介

​ Matplotlib是一个Python 2D绘图库,它以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形。 Matplotlib可用于Python脚本,Python和IPython (opens new window)Shell、Jupyter (opens new window)笔记本,Web应用程序服务器和四个图形用户界面工具包。

​ Matplotlib 尝试使容易的事情变得更容易,使困难的事情变得可能。 您只需几行代码就可以生成图表、直方图、功率谱、条形图、误差图、散点图等。 更多的示例,请参见基础绘图例子示例陈列馆

​ 为了简单绘图,该 pyplot 模块提供了类似于MATLAB的界面,尤其是与IPython结合使用时。 对于高级用户,您可以通过面向对象的界面或MATLAB用户熟悉的一组功能来完全控制线型,字体属性,轴属性等。

2、 环境准备

2.1 安装

pip install matplotlib   # 使用pip包管理器安装
poetry add matplotlib  # 使用poetry安装

2.2 参考文档

中文文档:https://matplotlib.org.cn/

英文文档:https://matplotlib.org/

3、 图表结构

一些绘图基础知识

  • 画板figure,画纸Sublpot画质,可多图绘画
  • 画纸上最上方是标题title,用来给图形起名字
  • 坐标轴Axis,横轴叫x坐标轴label,纵轴叫y坐标轴ylabel
  • 图例Legend 代表图形里的内容
  • 网格Grid,图形中的虚线,True显示网格
  • Markers:表示点的形状。

4、 常用图表

基本的视觉元素有三种:点、线、柱状。

  • 对于数值类型,用点来进行可视化。例如想要知道学生为某科课程花费的时间和考试成绩两者之间的关系,可以把每个学生的数据绘制一个点,绘制出散点图 scatter plot,可以查看两者之间的相关性。
  • 对于时间序列的数据类型,用线条来进行可视化。用线条将相关的数据点连接在一起,帮助我们观察随着时间的变化数据的变化趋势,这样的图叫做折线图line plot
  • 对于分类数据,需要查看数据是如何在各个类别之间分布的,可以使用柱状图 bar plot
  • 用来表示第三个维度时,可以使用颜色。一般很难在二维平面上表示三维数据,这时可以使用颜色视觉元素。最典型是热图heatmap,通过用渐进颜色显示用户热衷的区域或所在地理区域的图。

二、绘图步骤

1、 常用图表

1.1 散点图

语法:

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

1.2 柱状图

语法:

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

1.3 饼图

语法:

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

1.4 折线图

使用语法:

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

2、 多图绘制

我们可以使用 pyplot 中的 subplot()subplots() 方法来绘制多个子图。

subplot() 方法在绘图时需要指定位置,subplots() 方法可以一次生成多个,在调用时只需要调用生成对象的 ax 即可。

2.1 subplot

官方文档地址: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()

2.2 subplots

语法:

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()

3、 绘图配置

3.1常用配置

3.1.1 网格线

我们可以使用 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

3.1.2 标题和标签

我们可以使用 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来指定字体

3.1.3 图例

使用语法:

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

3.2 配置组

我们可以使用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)
posted @ 2022-12-18 13:13  Kenny_LZK  阅读(243)  评论(0编辑  收藏  举报