matplotlib

发布时间 2023-05-22 16:36:53作者: 小王同学学编程

1. plt.和ax.区别

1. plt.

fig=plt.figure(num=1,figsize=(4,4))
plt.plot([1,2,3,4],[1,2,3,4])
plt.show()

2. ax.

fig=plt.figure(num=1,figsize=(4,4))
ax=fig.add_subplot(111)
ax.plot([1,2,3,4],[1,2,3,4])
plt.show()

可以看到上面两种画图方式可视化结果相同;

plt是先生成一个画布,然后在这个画布上隐式的生成一个画图区域来进行画图,

ax是先生成一个画布,然后,在此画布上选定一个子区域画一个子图。

 

2. 相关函数简介

matplotlib.pyplot是一个命令型函数集合,它可以让人们像使用matlab一样使用matplotlib。在matplotlib.pypylot库中有plt子库,该子库提供了7个用于读取和显示的函数,17个用于绘制基础图表的函数,3个区域填充函数,9个坐标轴设置函数,11个标签与文本设置函数。

plt库中的读取和显示函数:

plt库中的基础图表函数:

区域填充函数:

坐标轴设置函数:

标签与文本设置函数:

 

3. 一些常用的基础API

3.1 解决中文乱码,防止方块化

plt.rcParams["font.sans-serif"]="SimHei"

 

3.2 解决负号不能正常显示的问题

plt.rcParams["axes.unicode_minus"]=False

 

3.3 在jupyter notebook上面显示图片

%matplotlib inline

 

3.4 作图使用svg格式显示更为清洗

%config InlineBackend.figure_format="svg"

 

3.5 设置画布

# 创建一个全局绘图区域
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
num: 设置图像编号
figsize: 设置图像的宽度和高度,单位未英寸
facecolor: 设置图像的背景颜色
dpi: 设置图像的边框颜色
edgecplor: 设置图像的边框颜色

 

3.6 创建子图

3.6.1 矩阵式布局

将一个窗口等分的划成相等的几个区域,规定行,列数即可。

语法:plt.subplot(行数, 列数, 序号)或plt.subplot(行数列数序号)

#导入模块
import numpy as np
from matplotlib import pyplot as plt

#设置中文字体
plt.rcParams["font.sans-serif"]="SimHei"

#创建图形窗口,设置图形窗口名字
plt.figure('Subplot',facecolor='lightgray')

#设置两行两列序号为1的矩阵子图
plt.subplot(221)
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,'你好',ha='center',va='center',size=56,alpha=0.5)

#设置两行两列序号为2的矩阵子图
plt.subplot(222)
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,'中国',ha='center',va='center',size=56,alpha=0.5)

#设置两行两列序号为3的矩阵子图
plt.subplot(223)
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,'你好',ha='center',va='center',size=56,alpha=0.5)

#设置两行两列序号为4的矩阵子图
plt.subplot(224)
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,'世界',ha='center',va='center',size=56,alpha=0.5)

#设置紧凑式布局
plt.tight_layout()

 

3.6.2 网格式布局

网格式布局的话,可以让我们灵活的进行排版,相对来说,更方便我们进行展示。
但是,我们需要用到另一种方法,需要重新导入:

from matplotlib import gridspec as mg

语法:

gs=mg.GridSpec(行数, 列数)
plt.subplot(gs[占行, 占列])

分析:代码mg.GridSpec(行数, 列数) 其实就是已经将图形窗口划分为相等的几行几列,但是,他是不可见的,也就是说,我们一会儿分配位置的时候,还是根据的行、列来进行划分的。

#导入模块
from matplotlib import pyplot as plt
from matplotlib import gridspec as mg

#创建图形窗口
plt.figure("Grid",facecolor="lightgray")

#设置行列数
gs = mg.GridSpec(3,3)

#创建网格1
plt.subplot(gs[0,:2])
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,"1",ha="center",va="center",size=36,alpha=0.5)

#创建网格2
plt.subplot(gs[1:,0])
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,"2",ha="center",va="center",size=36,alpha=0.5)

#创建网格3
plt.subplot(gs[2,1:])
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,"3",ha="center",va="center",size=36,alpha=0.5)

#创建网格4
plt.subplot(gs[:2,2])
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,"4",ha="center",va="center",size=36,alpha=0.5)

#创建网格5
plt.subplot(gs[1,1])
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,"5",ha="center",va="center",size=36,alpha=0.5)

#紧凑布局
plt.tight_layout()

#保存
plt.savefig("路径")

 

3.6.3 自由式布局

自由式布局主要应用于,当某个场景需要一个大图里面欠小图

自由式布局就不再需要import导入其他的了,但是需要用到axes方法

语法:plt.axes([左坐标, 底坐标, 宽, 高])

这里我们会提过一个左坐标,一个底坐标,一个宽一个高。

注意:这里设置的左坐标和底坐标,宽、高,不是写死的具体坐标轴的信息,而是相对于坐标轴的比例

从而通过这四个比例来达到自由式布局的效果

from matplotlib import pyplot as plt
plt.figure("Axes",facecolor='lightgray',)

plt.axes([0.03,0.038,0.94,0.924])
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,'1',ha="center",va="center",size=36,alpha=0.5,color="red")

plt.axes([0.63,0.076,0.31,0.308])

plt.xticks(())
plt.yticks(())

plt.text(0.5,0.5,'2',ha="center",va="center",size=36,alpha=0.5,color="orange")

plt.savefig("路径")

 

4. 绘图3步

 

5. 几种常用图表

5.1 柱状图

bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)

5.1.1 垂直柱状图

import numpy as np
import matplotlib.pyplot as plt
size = 5
a = np.random.random(size)
b = np.random.random(size)
c = np.random.random(size)
d = np.random.random(size)
x = np.arange(size)

total_width, n = 0.8, 3     # 有多少个类型,只需更改n即可
width = total_width / n
x = x - (total_width - width) / 2

plt.bar(x, a,  width=width, label='a')
plt.bar(x + width, b, width=width, label='b')
plt.bar(x + 2 * width, c, width=width, label='c')
plt.legend()
plt.show()

5.1.2 水平条形图

1. 使用plt.bar()

参数orientation默认是’vertical’垂直,改为"horizontal"(水平)。

注:

(1)x的起始位置,水平条底部,以及长度的取值变化

(2)添加标签的时候enumerate()函数遍历出的结果(自动加序号),以及text()函数的参数。

import numpy as np
import matplotlib.pyplot as plt
size = 5
a = np.random.random(size)
b = np.random.random(size)
c = np.random.random(size)
d = np.random.random(size)
x = np.arange(size)

total_width, n = 0.8, 3     # 有多少个类型,只需更改n即可
width = total_width / n
x = x - (total_width - width) / 2

plt.bar(0,bottom=x,height=width,width=a, label='a',orientation="horizontal")
plt.bar(0,bottom=x+width,height=width,width=b,label='b',orientation="horizontal")
plt.bar(0,bottom=x+2*width,height=width,width=c,label='c',orientation="horizontal")

plt.legend()
plt.show()

 

2. 使用plt.barh()

语法:

barh(y, width, height=0.8, left=None, *, align='center', **kwargs)
import numpy as np
import matplotlib.pyplot as plt
size = 5
a = np.random.random(size)
b = np.random.random(size)
c = np.random.random(size)
d = np.random.random(size)
x = np.arange(size)

total_width, n = 0.8, 3     # 有多少个类型,只需更改n即可
width = total_width / n
x = x - (total_width - width) / 2

plt.barh(x, left=0,height=width,width=a,orientation="horizontal",alpha = 0.8)
plt.barh(x+width, left=0,height=width,width=b,orientation="horizontal",alpha = 0.8)
plt.barh(x+2*width, left=0,height=width,width=c,orientation="horizontal",alpha = 0.8)
plt.legend()
plt.show()

 

5.2 折线图

plt.plot(x,y,linestyle,linewidth,color,marker,markersize,markeredgecolor,markerfactcolor,label,alpha)

参数:

x,y:指定折线图的x轴/y轴的数据;
linestyle:指定折线的类型,可以是实线、虚线、点虚线等,默认文实线;
linewidth:指定折线的宽度
marker:设置点的形状
markersize:设置点的大小
markeredgecolor:设置点的边框色
markerfactcolor:设置点的填充色
label:为折线图添加标签

常用的marker风格:

“+”:十字          “O”:圆圈
“*”:星型          “s”:正方形
“p”:五边形         “h”:六边形
“d”:小菱形         “D”:钻石       

常用的color风格:

“b”:blue蓝色            “g”:green绿色  
“k”:黑色                “w”:white白色
“r”:red红色             “y”:yellow黄色
“c”:cyan青色            “m”:magenta品红
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10,6))
x = np.arange(-2*np.pi,2*np.pi,0.01)
#x = np.arange(-2*np.pi,2*np.pi,0.01)
x1 = np.arange(-2*np.pi,2*np.pi,0.2)
y1 = np.sin(3*x1)/x1
y2 = np.sin(2*x)/x
y3 = np.sin(x)/x
plt.plot(x1,y1,c='b',linestyle='--',marker='^',label="y1=sin(3*x1)/x1")#linestyle设置线的风格,marker设置点的风格
plt.plot(x,y2,c='r',linestyle='-.',label="y2=sin(2*x)/x")
plt.plot(x,y3,c='g',label="y3=sin(x)/x")
plt.legend()
plt.show()

 

5.3 饼图

pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, *, data=None)

参数:

x:指定绘图的数据;
explode:指定饼图某些部分的突出显示,即呈现爆炸式;
labels:为饼图添加标签说明,类似于图例说明;
colors:指定饼图的填充色;
autopct:自动添加百分比显示,可以采用格式化的方法显示;
pctdistance:设置百分比标签与圆心的距离;
shadow:是否添加饼图的阴影效果;
labeldistance:设置各扇形标签(图例)与圆心的距离;
startangle:设置饼图的初始摆放角度;
radius:设置饼图的半径大小;
counterclock:是否让饼图按逆时针顺序呈现;
wedgeprops:设置饼图内外边界的属性,如边界线的粗细、颜色等;
textprops:设置饼图中文本的属性,如字体大小、颜色等;
center:指定饼图的中心点位置,默认为原点
frame:是否要显示饼图背后的图框,如果设置为True的话,需要同时控制图框x轴、y轴的范围和饼图的中心位置;

例:

import matplotlib.pyplot as plt

labels = 'A', 'B', 'C', 'D'
fracs = [15, 30.55, 44.44, 10]
color = 'blue','red','yellow','green'
explode = [0, 0.1, 0, 0]  # 0.1 凸出这部分,
plt.pie(x=fracs,explode=explode, # 突出分裂的部分
        labels=labels, # 添加分类标签
        colors=color, # 设置饼图的自定义填充色
        autopct='%.1f%%', # 设置百分比的格式,这里保留一位小数
        pctdistance=0.6,  # 设置百分比标签与圆心的距离
        labeldistance = 1.15, # 设置各标签与圆心的距离
        startangle = 180, # 设置饼图的初始角度
        radius = 1, # 设置饼图的半径
        counterclock = False, # 是否逆时针,这里设置为顺时针方向
        wedgeprops = {'linewidth': 1.3, 'edgecolor':'green'},# 设置饼图内外边界的属性值
        textprops = {'fontsize':15, 'color':'k'}, # 设置文本标签的属性值
        center = (0.5,0.5), # 设置饼图的原点
        frame = 0 )# 是否显示饼图的图框,这里设置显示
plt.show()

 

5.4 散点图

scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, *, data=None, **kwargs)

参数:

x,y:表示即将绘制散点图的数据点
s:是一个可选的参数。
c:表示的是颜色,也是一个可选项。
marker:表示的是标记的样式,默认的是'o'。
alpha:实数,0-1之间。
#导入必要的模块
import numpy as np
import matplotlib.pyplot as plt
#产生测试数据
x = np.arange(1,10)
y = x
fig = plt.figure()
ax1 = fig.add_subplot(111)
#设置标题
ax1.set_title('Scatter Plot')
#设置X轴标签
plt.xlabel('X')
#设置Y轴标签
plt.ylabel('Y')
#画散点图
ax1.scatter(x,y,c = 'r',marker = 'o')
#设置图标
plt.legend('x1')
#显示所画的图
plt.show()