Matplotlib

介绍

  • Matplotlib是一个Python的基础绘图库,它可与 NumPy 一起使用,代替Matlab使用。

  • 将数据进行可视化,使数据更直观

  • 使数据更加更具有说服力

  • 安装命令

图片与子图

  • plt.figure()生成新图片
    • 在IPython中,执行该代码一个空白的绘图窗口就会出现,但在Jupyter中则没有任何显示
1
2
from matplotlib import pyplot as plt
fig = plt.figure()
  • 除此之外,Matplotlib包含一个便捷方法plt.subplots创建一个新的图片,然后返回包含了已生成子图对象的Numpy数组。

  • plt.subplots(nrows, ncols, sharex, sharey)

    • nrows子图的行数
    • ncols子图的列数
    • sharex 所有子图使用相同的x轴刻度
    • sharey 所有子图使用相同的y轴刻度

那么实际上,当我们不需要使用子图时,可以通过plt对象直接绘制图形。

配置

方法 描述
plt.figure(figsize=None,dpi=None) 生成新的图片,figsize:图片大小,dpi:透明度
plt.savefig(fname) 保存图片
plt.xticks(ticks=None) 设置x轴刻度的值
plt.yticks(ticks=None) 设置y轴刻度的值
plt.xlabel(xlabel) 设置x轴标签
plt.ylabel(ylabel) 设置y轴标签
plt.title() 设置图标题
plt.grid() 根据x轴和y轴的数值展示轴网格

索引-折线图

  • plt.plot(x,y)创建折线图 marker可以更改点的类型
1
2
3
4
5
from matplotlib import pyplot as plt
x = [i for i in range(2,26,2)]
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
plt.plot(x,y,marker = ".")
plt.show()

image-20210125194152631

  • 显示刻度 plt.xticks(x,xb) 显示x刻度 并用xb标签替换
  • plt.figure(figsize=(12,8)) 更改图片大小
  • plt.savefig(mat.jpg) 保存图片
1
2
3
4
5
6
7
8
9
10
11
from matplotlib import pyplot as plt
x = [i for i in range(2,26,2)]
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
plt.plot(x,y,marker = ".")
#将刻度以X情况来显示
plt.xticks(x)
#将刻度以X情况来显示
xt = [i/2 for i in range(0,48)]
#rotation 可以旋转刻度
plt.xticks(xt,rotation = 90)
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from matplotlib import pyplot as plt
x = [i for i in range(2,26,2)]
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
plt.figure(figsize=(12,8))
plt.plot(x,y,marker = ".")
#将刻度以X情况来显示 xt为刻度
xt = [i/2 for i in range(0,48)]
#rotation 可以旋转刻度
#x刻度显示0h,0.5h xl为刻度标签
xl = [f"{i/2}h" for i in range(0,48)]
plt.xticks(xt,xl,rotation = 90)
plt.xlabel("time") #设置x轴标签
plt.yticks(range(min(y),max(y)+1))
plt.ylabel("temp") #设置y轴标签
#添加网格
plt.grid()
#保存图片
plt.savefig("mat.jpg")
plt.show()
  • 中文显示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#全局设置 只能支持ttf字体
# import matplotlib
# font = {
# "family":"SimHei",
# "weight":"bold",
# "size":12
# }
# matplotlib.rc("font",**font)
#通过rcParams配置参数
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #替换sans-serif字体为SimHei
plt.rcParams['axes.unicode_minus'] = False #解决坐标轴负数的负号显示问题
#局部设置字体
# from matplotlib.font_manager import FontProperties
# from matplotlib import pyplot as plt
# font = FontProperties(fname = r"C:/Windows/Fonts/simsun.ttc",size = 14) #可传入字体位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#通过rcParams配置参数
import random
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #替换sans-serif字体为SimHei
plt.rcParams['axes.unicode_minus'] = False #解决坐标轴负数的负号显示问题


y = [random.randint(20,35) for i in range(120)]
x = range(0,120)
plt.plot(x,y)
# x刻度显示需求 十点0分 十点10分......
# 设置刻度
xt = range(0,120,10)
xl1 = [f"十点{i}分" for i in range(0,60,10)]
xl2 = [f"十一点{i}分" for i in range(0,60,10)]
xl = xl1 + xl2
plt.xticks(xt,xl,rotation = 45)
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#局部设置字体
from matplotlib.font_manager import FontProperties
from matplotlib import pyplot as plt
font = FontProperties(fname = r"C:/Windows/Fonts/simsun.ttc",size = 14)
import random


y = [random.randint(20,35) for i in range(120)]
x = range(0,120)
plt.plot(x,y)
# x刻度显示需求 十点0分 十点10分......
# 设置刻度
xt = range(0,120,10)
xl1 = [f"十点{i}分" for i in range(0,60,10)]
xl2 = [f"十一点{i}分" for i in range(0,60,10)]
xl = xl1 + xl2
plt.xticks(xt,xl,rotation = 45,fontproperties = font)#局部设置字体 fontproperties = font
plt.show()
  • 文本坐标注释
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from matplotlib import pyplot as plt
import random


x = [i for i in range(10)]
y = [random.randint(10,30) for i in range(10)]
# label可以设置曲线注释
plt.plot(x,y,marker = ".",label = "text")
#给第一个点添加注释文本 传入注释文本 点坐标 文本坐标 arrowprops为箭头 可以不加
# plt.annotate("(0,20)",xy=(0,20),xytext=(0,20),arrowprops = {"width":1})
#每个点都实现注释文本
for xi,yi in list(zip(x,y)):
plt.annotate(f"{(xi,yi)}",xy=(xi,yi),xytext=(xi,yi))
plt.legend()
plt.show()

散点图

  • plt.scatter(x,y)
  • 可以查看查看规律
1
2
3
4
5
6
import matplotlib.pyplot as plt
y_4 = [11,17,16,11,12,11,12,13,10,14,8,13,12,15,14,17,18,21,16,17,30,14,15,15,15,19,21,22,22,22,23]
y_10 = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,15,10,11,13,12,13,6]
x = range(1,32)
plt.scatter(x,y_4)
plt.scatter(x,y_10)

条形图

  • plt.bar(x,y)
1
2
3
4
5
6
7
8
"""
plt.bar??
x: x坐标点
y: hight 高度
width :宽度 默认0.8
bottom 基线 默认是0 改变hight起始值
align:对齐方式 默认center中间 若align = "edge"则在边缘 其中width为负值则在左边
"""
  • 分组条形图:水果 Q1销售额 Q2销售额 苹果 1000 1200 梨 800 700 车厘子 3000 2800
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from matplotlib.font_manager import  FontProperties
import matplotlib.pyplot as plt


font = FontProperties(fname = r"C:/Windows/Fonts/simsun.ttc",size = 14)
shuiguo = ["苹果","梨","车厘子"]
Q1_S = [1000,800,3000]
Q2_S = [1200,700,2800]
# plt.bar(shuiguo,Q1_S)
# plt.bar(shuiguo,Q2_S)
width = 0.35
# plt.bar(list(range(len(shuiguo))),Q1_S,width = width)
# plt.bar(list(range(len(shuiguo))),Q2_S,width = width)
#蓝黄柱子宽度设定完成 实现左右平移
# 蓝色{0,1,2} 左移 -width/2
# 橘色右移 +width/2
po_l = [i-width/2 for i in range(len(shuiguo))]
plt.bar(po_l,Q1_S,width=width,label = "Q1_S")
po_r = [i+width/2 for i in range(len(shuiguo))]
plt.bar(po_r,Q2_S,width=width,label = "Q2_S")
#添加图例
plt.legend()
#添加刻度
plt.xticks(range(len(shuiguo)),shuiguo,fontproperties = font)
plt.show()
  • 堆叠条形图 使用bottom进行堆叠
1
2
3
4
5
6
7
8
9
10
11
12
13
from matplotlib.font_manager import  FontProperties
import matplotlib.pyplot as plt


font = FontProperties(fname = r"C:/Windows/Fonts/simsun.ttc",size = 14)
shuiguo = ["苹果","梨","车厘子"]
Q1_S = [1000,800,3000]
Q2_S = [1200,700,2800]
plt.bar(shuiguo,Q1_S,width=0.5,label="Q1")
plt.bar(shuiguo,Q2_S,width=0.5,label="Q2",bottom = Q1_S) #bottom以第一季度为基础堆叠
plt.legend()
plt.xticks(range(len(shuiguo)),shuiguo,fontproperties = font)
plt.show()
  • 水平条形图 plt.barh
  • y 为原本的x width 是数值大小 height是宽
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties


font = FontProperties(fname = r"C:/Windows/Fonts/simsun.ttc",size = 14)
shuiguo = ["苹果","梨","车厘子"]
Q1_S = [1000,800,3000]
Q2_S = [1200,700,2800]
# plt.bar(shuiguo,Q1_S)
# plt.bar(shuiguo,Q2_S)
width = 0.35
# plt.bar(list(range(len(shuiguo))),Q1_S,width = width)
# plt.bar(list(range(len(shuiguo))),Q2_S,width = width)
#蓝黄柱子宽度设定完成 实现左右平移
# 蓝色{0,1,2} 下移 -width/2
# 橘色上移 +width/2
po_l = [i-width/2 for i in range(len(shuiguo))]
plt.barh(po_l,Q1_S,height=width,label = "Q1_S")
po_r = [i+width/2 for i in range(len(shuiguo))]
plt.barh(po_r,Q2_S,height=width,label = "Q2_S")
#添加图例
plt.legend()
#添加刻度
plt.yticks(range(len(shuiguo)),shuiguo,fontproperties = font)
plt.show()

直方图

  • plt.hist(x,bins) x 数据 bins 组数 直方图的组数 长条形的数目

  • 频数直方图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from matplotlib import pyplot as plt
temp_li = [6.9,4.1,6.6,5.2,6.4,7.9,8.6,3.0,4.4,6.7,7.1,4.7,9.1,6.8,8.6,5.2,5.8,7.9,5.6,8.8,8.1,5.7,8.4,4.1,6.4,6.2,5.2,6.8,5.6,5.6,6.8,8.2,6.4,4.8,6.9,7.1,9.7,6.4,7.3,6.8,7.1,4.8,5.8,6.5,5.9,7.3,5.5,7.4,6.2,7.7]
# print(max(temp_li)) 9.7
# print(min(temp_li)) 3.0
#可以分7组 组距为1
#计算极差
cha = max(temp_li) - min(temp_li)
#自定义组距
b = 1
#求组数
bi = round(cha/b)
#频数直方图
plt.hist(temp_li,bi)
plt.show()
  • 频率直方图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from matplotlib import pyplot as plt
temp_li = [6.9,4.1,6.6,5.2,6.4,7.9,8.6,3.0,4.4,6.7,7.1,4.7,9.1,6.8,8.6,5.2,5.8,7.9,5.6,8.8,8.1,5.7,8.4,4.1,6.4,6.2,5.2,6.8,5.6,5.6,6.8,8.2,6.4,4.8,6.9,7.1,9.7,6.4,7.3,6.8,7.1,4.8,5.8,6.5,5.9,7.3,5.5,7.4,6.2,7.7]
# print(max(temp_li)) 9.7
# print(min(temp_li)) 3.0
#可以分7组 组距为1
#计算极差
cha = max(temp_li) - min(temp_li)

#自定义组距
b = 1
#求组数
bi = round(cha/b)
#频率直方图
plt.hist(temp_li,bi,density=True)
plt.show()

扇形图

  • plt.pie(比例,标签,标签原理中心程度)

  • 扇形图通过**pie()**函数绘制

    • plt.pie(**x,** explode=None, labels=None)

      • x 扇形数据
      • explode 设置某几个分块是否要分离饼图
      • labels 每块扇形标签
      • autopct 百分比数据标签
      • shadow 是否显示阴影
    • plt.pie()有3个返回值

      • patches 绘制饼图每一块的对象
      • texts 文本的列表
      • autotexts 百分比的文本列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from matplotlib import pyplot as plt
frac = [1/50,6/50,11/50,15/50,9/50,6/50,2/50]
#扇形标签
label = ['[3,4]','(4,5]','(5,6]','(6,7]','(7,8]','(8,9]','(9,10]']
#explode 远离中心程度 必须是元祖,有多少块写多少块
explode = [0,0,0,0.1,0,0,0]
#绘制饼图
res = plt.pie(frac,labels=label,explode=explode,autopct='%.2f%%')
pathes,text,autotext = res
print(pathes) #扇形对象
print(text) #每个文本对象
print(autotext) #每个百分比对象

#需求 修改百分比对象字体颜色
# for color in autotext:
# autotext.set_color("w") #设置字体颜色
plt.setp(autotext,size = 8 ,weight="bold",color="w")

#添加图例 BBOX x y weight height
plt.legend(loc="upper right",bbox_to_anchor=(0.8,0,0.5,1))
plt.show()

雷达图

  • 雷达图(Radar Chart)又被叫做蜘蛛网图,适用于显示三个或更多的维度的变量的强弱情况。比如某个企业在哪些业务方面的投入等,都可以用雷达图方便的表示。

  • 通过plt.polar来绘制雷达图,这个方法的参数跟plt.plot非常的类似,只不过是x轴的坐标点应该为弧度(2*PI=360°)。

  • 注意:

    • 因为polar并不会完成线条的闭合绘制,所以我们在绘制的时候需要在theta中和values中在最后多重复添加第0个位置的值,然后在绘制的时候就可以和第1个点进行闭合了。
    • polar只是绘制线条,所以如果想要把里面进行颜色填充,那么需要调用fill函数来实现。
    • polar默认的圆圈的坐标是角度,如果我们想要改成文字显示,那么可以通过xticks来设置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import matplotlib.pyplot as plt
import numpy as np
quaters = ['Q1','Q2','Q3','Q4','Q5','Q6','Q7']
sales = [40,91,44,90,20,54,80]
#求弧度 需求将2PI分成7份
#等分为多少分
angles = list(np.linspace(0,2*np.pi,len(sales),endpoint=False))
# plt.polar(angles,sales)
#数据处理 将雷达图尾部与头部连接
#给弧度列表添加数据:第一个点的弧度
angles.append(angles[0])
sales.append(sales[0])
quaters.append(quaters[0])
plt.polar(angles,sales,color='purple',linewidth=1,marker='.')
#填充颜色和颜色深浅
plt.fill(angles,sales,facecolor='red',alpha=0.2)
#设置刻度
plt.xticks(angles,quaters)
plt.show()

箱型图

箱线图是一种直观简洁的方式去呈现一组数据的分布。 箱线图广泛用于各个数据分析领域,它能非常简单明了地显示一组数据中5个重要数值,并且还能发现一组数据中的存在的异常值

  • 最大值
  • 最小值
  • 中位数
  • 下四分位数(Q1)
  • 上四分位数(Q3)

plt.boxplot()

  • x:需要绘制的箱型图的数据
  • notch:是否展示置信区间 默认为False
  • sym:代表异常点的符号表示 默认为圆点
  • vert:是否是垂直的 默认是True
  • whis:上下限系数 默认为1.5
  • positions:设置每个盒子的位置
  • widths:设置每个盒子的宽度
  • labels:每个盒子的label
  • meanline和showmean:都为True的时候 会展示平均线
1
2
3
4
5
6
7
import matplotlib.pyplot as plt
import random
data = [random.randint(1,100) for i in range(100)]
data.extend([-100,500,400,200,-300])
# sym异常点设置 meanline 均值 showmeans显示均值 vert显示倒转
plt.boxplot(data,sym='.',widths=0.2,meanline=True,showmeans=True,vert=True)
plt.show()