matplotlib知识点

1.绘图基础

1.1创建画布与子图

要想使用matplotlib绘图,必须得先创建一个figure(画布)对象。

函数函数作用
figure创建一个空白画布
add_subplot创建子图

画布与子图之间的关系:一个画布(figure)可以选择是否分为多个区域,而每个区域都有一个坐标系,一个坐标系上可以绘制一个图形(子图)。也就是说,当我们创建画布并选择分为多个区域时,那么我们可以在每个区域都创建一个子图。但隐式创建画布除外,因为在隐式创建画布中我们自己实际并没有创建画布对象,所以不能选择将画布分为多个区域。也就是说,当我们选择隐式创建画布时,系统帮我们创建的figure对象只会有一个区域,也就只能绘制一个图形(子图)。

隐式创建画布

x=[1,2,3,4]
y=[1,2,3,4]
plt.plot(x,y)

输出结果:
在这里插入图片描述

当第一次执行绘图代码时,系统会去判断是否存在figure对象,如果没有则自动创建。

显示创建画布

# 创建一个画布对象
fig=plt.figure()
# 选择将画布分为两个区域,每个区域可以绘制一个子图
axes1=fig.add_subplot(221)
axes2=fig.add_subplot(222)

axes1.plot([1,2,3,4],[5,6,7,8])
axes2.plot([1,2,3,4],[4,3,2,1])

输出结果:
在这里插入图片描述

1.2 画布中常用的函数

函数说明
title添加标题
xlabel添加x轴名称
ylabel添加y轴名称
xlim指定当前x轴范围
ylim指定当前y轴范围
xticksx轴刻度
yticksy轴刻度
legend图例
grid添加网格

plt.legend()图例的说明:
参数loc用于设置图例的位置,取值有’best’,‘upper right’,‘upper left’,‘lower left’,‘lower right’,'center‘等。
常用设置:
plt.legend(loc=‘best’,frameon=False):去掉图例边框。
plt.legend(loc=‘best’,edgecolor=‘blue’):设置边框颜色。

1.3 绘图的保存与显示

函数作用
savefig保存绘制的图片,可指定参数
show显示图片

savefig函数的参数说明:
·fname:保存的路径
·dpi:分辨率,默认100
·format:文件格式(png,pdf,ps等)
·bbox_inches:要保存的图片范围,设置为’tight’则去除图片周围的空白。

2.绘图

2.1 折线图

格式:plt.plot(data,color,marker=线条上点的形状,linestyle=线条样式)

·隐式创建figure

plt.plot([2,6,4,8],color='r',ls='-.',marker='o')

输出结果:
在这里插入图片描述
·显示创建figure

fig=plt.figure()
# 区域1
axes1=fig.add_subplot(221)
# 点线,五角星
axes1.plot([4,9,1,7],c='b',ls=':',marker='*')
# 区域2
axes2=fig.add_subplot(222)
# 虚线,小菱形
axes2.plot(['a','b','c','d'],[4,9,1,7],c='y',ls='--',marker='d')

输出结果:
在这里插入图片描述
当只传入一组参数时,那么这组数据的每个元素的索引作为x轴坐标;当传入两组参数时,前一组最为x坐标,后一组作为y轴坐标。

参数说明

color取值意义
r红色
y黄色
g绿色
b蓝色
c青色
k黑色
w白色
linestyle取值意义
-直线
-.点画线
:点线
- -虚线
marker取值意义
o圆圈
D大菱形
d小菱形
h六边形
-水平线
8八边形
p五边形
s正方形
*五角星
<左三角形
>右三角形
^上三角形
xX标记

注意:由于默认的pyplot字体不支持中文显示,需要在开头加上如下代码:

plt.rc('font',family='SimHei')

2.2 条形图(柱状图)

格式:plt.bar(x,height,width=0.8,color,bottom,align='center,hatch)

·x:表示在x轴数据。
·width:每个柱子的宽度。
·bottom:每个柱子的底部的y坐标,默认为0。
·align:表示柱子的位置与x值的对应关系。可选center(x值中心位置),edge(x值边缘位置)。
·edgecolor:柱子边缘颜色。
·hatch:填充样式,取值(/,|,-,+,x,o,O,*)

绘制成绩表

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 设置黑体
plt.rc('font',family='SimHei')

name=np.array([1,2,3,4,5,6,7])
math=np.array([88,75,59,31,66,60,55])
english=np.array([77,88,79,63,61,62,63])
plt.figure(dpi=100)
plt.bar(name-0.15,math,width=0.3,label='数学成绩')
plt.bar(name+0.15,english,width=0.3,label='英语成绩')
# 添加图例,因为条形图中指定了label,所以legend中不需要再指定图例的标签
plt.legend(loc='best',title='课程')
# 设置x轴刻度
plt.xticks(name,['张三','李四','王五','晓东','晓楠','小西','小贝'])
# 设置y轴范围
plt.ylim(0,101)
# 添加x,y轴信息
plt.xlabel('学生姓名')
plt.ylabel('成绩/分')
# 添加标题
plt.title('数学-英语成绩表')

for x,math in zip(name,math):
    plt.text(x-0.15,math,math,ha='center',va='bottom')
for x,eng in zip(name,english):
    plt.text(x+0.15,eng,eng,ha='center',va='bottom')

输出结果:
在这里插入图片描述
堆叠柱状图

plt.figure(dpi=100)
x1=[f'{i}月' for i in range(1,13)]
y1=np.array([25,30,45,28,27,32,32,24,20,19,35,36])
y2=np.array([55,33,42,39,46,50,37,41,48,47,35,40])
plt.bar(x1,y1,label='产品A')
# 添加bottom参数,使图形堆叠起来
plt.bar(x1,y2,bottom=y1,label='产品B')
plt.legend()
plt.ylim(10,100)
plt.ylabel('数量/个')
plt.title('产品销量分析',fontsize=10)

输出结果:
在这里插入图片描述

2.3 饼图

格式:plt.pie(x,labels,explode=None,color=None,autopct=None,align=‘center’,counterclock=True,starttangle=None,radius=None)

·x:绘图的数据。
·labels:每一项的名称。
·explode:指定每个部分距离圆心的偏移量。
·color:指定每部分的颜色。
·autopct:设置每个部分显示的比例。
·counterclock:是否逆时针绘图。
·startangle:初始绘图点的位置。
·radius:表示饼图的半径,默认为1。

绘制小朋友所拥有的糖果所占比

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 设置黑体
plt.rc('font',family='SimHei')

plt.figure(dpi=100)
# 每个小朋友糖的数量
x1=np.array([10,23,8,14,20,25])
# 所占比
x=x1/np.sum(x1)
# 每个小朋友的名字
name=['张三','李四','王五','金毛','拉布拉多','哈士奇']
# 每块区域的颜色
color=['r','b','g','y','m','c']
# 每块区域的偏移量
explode=[0.05,0,0,0,0,0]

# counterclock=False顺时针画图,startangle=90相当于从y轴开始,autopct='%.1f%%'保留一位小数
plt.pie(x,labels=name,colors=color,explode=explode,autopct='%.1f%%',counterclock=False,startangle=90)
plt.title('小朋友糖果所占比',fontsize=10)

输出结果:
在这里插入图片描述

2.4 直方图

含义:直方图首先要对数据进行分组,然后统计每个分组内数据的数量。在坐标系中,横轴表示每个组的端点,纵轴表示频数,每个矩形的高代表频数。由于分组数据具有连续性,直方图各矩形通常是连续排列,而柱状图是分开排列。

格式:plt.hist(x,bins=None,facecolor,histtype,alpha,edgecolor)

·x:表示数据。
·bins:设置长条形数目。
·facecolor:长条形颜色。
·histtype:设置样式,取值(bar:柱状形数据并排,默认值;barstacked:柱状形数据重叠并排;step:柱状形颜色不填充;stepfilled:填充的线性)。
·alpha:透明度。
·edgecolor:边框颜色。

随机生成100个数

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 设置黑体
plt.rc('font',family='SimHei')

plt.figure()
x=np.random.randint(100,150,100)
# 长条数20个
plt.hist(x,bins=20)
plt.title('随机数')

输出结果:
在这里插入图片描述
柱状图不填充

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 设置黑体
plt.rc('font',family='SimHei')

plt.figure()
x=np.random.randint(100,150,100)
# 长条数20个,样式为不填充
plt.hist(x,bins=20,histtype='step',edgecolor='y')
plt.title('随机数')

输出结果:
在这里插入图片描述
堆叠直方图

plt.figure()
# 随机生成100个数据
x1=np.random.randint(100,150,100)
x2=np.random.randint(100,150,100)
# 参数stacked=True允许堆叠
plt.hist([x1,x2],bins=20,histtype='bar',stacked=True)
plt.title('堆叠直方图')

输出结果:
在这里插入图片描述
不等距直方图

plt.figure()
# 成绩
x=np.array([89,34,99,26,78,39,38,67,85,81,92,64,76,47,88,75,71,63])
plt.hist(x,bins=[0,60,80,100],facecolor='y')
# 小于60不及格,60-79良好,大于80优秀
plt.xticks([0,60,80,100],['0','不及格','良好','优秀'])
plt.title('成绩等级情况')
plt.ylabel('人数')
plt.xlabel('等级')

输出结果:
在这里插入图片描述

2.5 散点图

格式:plt.scatter(x,y,s,c,marker,alpha,linewidths)
·x,y:表示散点的坐标。
·s:表示散点的大小。
·c:表示散点颜色。
·marker:表示每个点的标记。
·linewidths:表示散点的线宽。
·alpha:表示散点的透明度,取值0-1之间。

测试商场手机信号强度

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 设置黑体
plt.rc('font',family='SimHei')

df=pd.read_table('../资料/商场一楼手机信号强度.txt',header=None,sep=',').sample(frac=0.7)
plt.figure(dpi=100)
x=df[0]
y=df[1]
# 点的大小,也是信号的强度
s=df[2]
plt.xlabel('距测试点的横轴(米)')
plt.ylabel('距测试点的纵轴(米)')
plt.scatter(x,y,s=s,c='r',marker='*')
plt.title('商场不同位置的手机信号强度',fontsize=10)

输出结果:
在这里插入图片描述

2.6 雷达图

绘制学生成绩信息

plt.figure(figsize=(10,6),dpi=80)
# 数据
scores=[82,95,78,85,45,88,76,88]
# 标签
label=['数据结构','数据可视化','高数','英语','软件工程','组成原理','c语言','体育']
# 数据长度
datalength=len(scores)
# 把圆等分为datalength份
angles=np.linspace(0,2*np.pi,datalength,endpoint=False)
# 使数据源形成一个闭合的环
scores.append(scores[0])
label.append(label[0])
# 将角度形成一个闭合的环
angles=np.append(angles,angles[0])
# 绘图,angles设置角度,scores各角度的数据,rv--颜色线型,linewidth=2线宽
plt.polar(angles,scores,'rv--',linewidth=2)
# 设置标签
plt.thetagrids(angles*180/np.pi,label)
# 设置y轴范围
plt.ylim(0,100)
# 填充雷达图内部
plt.fill(angles,scores,facecolor='r',alpha=0.2)
# 添加标题
plt.title('学生成绩信息图',fontsize=10)

输出结果:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值