用于日常学习的积累,如有不足请多多指教。
一、了解Matplotlib库
1 Matplotlib是什么
Matplotlib可以看成是3个缩写单词拼接而成:
·mat(matrix) 矩阵
·plot 绘图
·lib(library)库
Matplotlib 是一个 Python 的二维图表库。
2 Matplotlib的作用
将数据可视化,是数据更加置换
3利用Matplotlib做一个简单的画图
3.1matplotlib.pyplot模块
matplotlib.pyplot模块包含了一系列类似于matlab的画图函数。
import matplotlib.pyplot as plt
3.2画图
import matplotlib.pyplot as plt
plt.figure() #创建画布
plt.plot([1, 2, 3, 4, 5, 6], [1, 4, 9, 16, 25, 36]) #绘制图像
plt.show() #显示图像
4 Matplotlib的三层结构
4.1容器层
- 画板层Canvas(位于最底层,一般用户接触不到)
位于最底层的系统层,充当画板的角色。 - 画布层Figure(在Canvas层之上)
是用户操作的第一层应用层,充当画布的角色。
plt.figure()
- 绘图区/坐标系Axes(在Figure层之上)
应用层的第二层。
plt.subplots()
- 相互关系
- 一个figure可以包含多个axes,一个axes只能属于一个figure。
- 一个axes(绘图区/坐标系)可以包含多个axis(坐标轴)。
4.2 辅助显示层
辅助显示层为Axes(绘图区)内的除了根据数据绘制出的图像以外的内容,主要包括Axes外观(facecolor)、边框线(spines)、坐标轴(axis)、坐标轴名称(axis label)、坐标轴刻度(tick)、坐标轴刻度标签(tick label)、网格线(grid)、图例(legend)、标题(title)等内容。
4.3图像层
图像层指Axes内通过plot、scatter、bar、histogram、pie等函数根据数据绘制出的图像。
二、折线图
1 折线图的绘制与显示
- 折线图绘制的步骤
- 创建画布
- 绘制图像
- 显示图像
具体和上面的做一个简单的画图的代码一致:
import matplotlib.pyplot as plt
plt.figure() #创建画布
plt.plot([1, 2, 3, 4, 5, 6], [1, 4, 9, 16, 25, 36]) #绘制图像
plt.show() #显示图像
1.1设置图形的风格
plt.plot(x,y,color='k',linestyle=':')
#color设置线条颜色
#linestyle设置线条风格
对上述代码进行修改:
import matplotlib.pyplot as plt
x=[1,2,3,4,5,6]
y=[1,4,9,16,25,36]
plt.figure() #创建画布
plt.plot(x,y,color='k',linestyle=':') #绘制图像
plt.show() #显示图像
结果:
2 设置画布属性
plt.figure(figsize=(),dpi=)
#figsize:指定图的长宽
#dpi:图像的清晰度
2.1 代码示例
import matplotlib.pyplot as plt
plt.figure(figsize=(5,5),dpi=100) #创建画布
plt.plot([1, 2, 3, 4, 5, 6], [1, 4, 9, 16, 25, 36]) #绘制图像
plt.show() #显示图像
3 图片的保存
import matplotlib.pyplot as plt
plt.figure(figsize=(5,5),dpi=100) #创建画布
plt.plot([1, 2, 3, 4, 5, 6], [1, 4, 9, 16, 25, 36]) #绘制图像
plt.savefig("1.png") #保存在相对路径上
plt.show() #显示图像
注意:plt.savefig(path)不能写在plt.show() 之后。(plt.show()会释放figgure的资源,此时在保存图片就是空图片)
4 设置辅助显示层
4.1 自定义x,y刻度
#自定义x轴
plt.xticks(x,tick labels) #刻度标签(tick labels)可以对应替换x
#自定义y轴
plt.yticks(y,tick labels) #刻度标签(tick labels)可以对应替换y
- 代码示例:
import matplotlib.pyplot as plt
x=[1,2,3,4,5]
y=[1,4,9,16,25]
plt.figure(figsize=(5,5),dpi=100)
plt.plot(x,y)
plt.xticks(x,["一","二","三","四","五"])
plt.show()
结果:
注意:默认字体不支持中文,会变成上图的白色框框。
import matplotlib.pyplot as plt
x=[1,2,3,4,5]
y=[1,4,9,16,25]
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示问题
plt.figure(figsize=(5,5),dpi=100)
plt.plot(x,y)
plt.xticks(x,["一","二","三","四","五"])
plt.show()
结果:
4.2 添加网格显示
plt.grid(True,linestyle,alpha)
#linestyle是指线条风格
#alpha是指透明度
- 代码示例:
import matplotlib.pyplot as plt
x=[1,2,3,4,5]
y=[1,4,9,16,25]
plt.figure(figsize=(5,5),dpi=100)
plt.plot(x,y)
plt.grid(True,linestyle="--",alpha=0.8) #添加网格显示
plt.show()
结果:
4.3添加描述信息
plt.xlabel(str)
plt.ylabel(str)
plt.title(str)
- 代码示例:
import matplotlib.pyplot as plt
x=[1,2,3,4,5]
y=[1,4,9,16,25]
plt.figure(figsize=(5,5),dpi=100)
plt.plot(x,y)
plt.xlabel("x")
plt.ylabel("x的平方")
plt.title("x平方的函数图像")
plt.grid(True,linestyle="--",alpha=0.8)
plt.show()
结果:
5 设置图像层
5.1 再添加一条折线
再次使用plt.plot()就可以再添加一条曲线。
其中,可以在plot()中设置对应曲线的标签:
plt.plot(x,y_2x,label='2x')
并加入以下图像层的代码将其展示出来:
plt.legend()
- 代码示例:
import matplotlib.pyplot as plt
x=[0,1,2,3,4,5]
y_2x=[2*i for i in range(6)]
y_3x=[3*i for i in range(6)]
#创建画布
plt.figure(figsize=(5,5),dpi=100)
#绘制图像
plt.plot(x,y_2x,label='2x')
plt.plot(x,y_3x,label='3x') #再添加一条折线
plt.legend()
plt.show() #显示图像
结果:
6 多个坐标系显示折线图
figure, axes = plt.subplots(nrows=1, ncols=2)
#nrows:行
#ncols:列
注意:此时为面向对象的编程,注意代码的不同。
- 代码示例:
import matplotlib.pyplot as plt
x=[0,1,2,3,4,5]
y_2x=[2*i for i in range(6)]
y_3x=[3*i for i in range(6)]
#创建画布
#plt.figure(figsize=(5,5),dpi=100)
figure, axes = plt.subplots(nrows=1, ncols=2,figsize=(10,5),dpi=100)
#绘制图像
#plt.plot(x,y_2x,label='2x')
axes[0].plot(x,y_2x,label='2x')
#plt.plot(x,y_3x,label='3x')
axes[1].plot(x,y_3x,label='3x')
#显示图例
#plt.legend()
axes[0].legend()
axes[1].legend()
#修改刻度
axes[0].set_xticks(x[::1])
axes[0].set_yticks(range(0,20)[::2])
axes[1].set_xticks(x[::1])
axes[1].set_yticks(range(0,20)[::2])
#添加描述信息
axes[0].set_xlabel("x")
axes[0].set_ylabel("2x")
axes[0].set_title("y=2x")
axes[1].set_xlabel("x")
axes[1].set_ylabel("3x")
axes[1].set_title("y=3x")
#显示图像
plt.show()
三、散点图
分析不同变量之间的关系/规律
plt.scatter(x,y)
3.1散点图的绘制
import matplotlib.pyplot as plt
#数据
math_score=[140,96,134,108,88]
physics_score=[95,78,86,81,72]
#创建画布
plt.figure()
#绘制散点图
plt.scatter(math_score,physics_score)
#显示图像
plt.show()
结果:
四、柱状图
统计不同类别的数量大小,比较数据之间的差异
plt.bar(x,width,...)
#x为数据
#width为柱宽
4.1一个类别单个柱状图
- 代码示例:
import matplotlib.pyplot as plt
#数据
students=["小明","小红","小刚","小智","小华"]
math_score=[140,96,134,108,88]
#创建画布
plt.figure()
#绘制图像
plt.bar(range(0,5),math_score,color=['r','y','g','c','b']) #采用不同颜色绘制柱状图
#修改刻度
plt.xticks(range(0,5),students)
#添加标题
plt.title("数学成绩")
#添加网格显示
plt.grid(linestyle=":",alpha=0.5)
#显示图像
plt.show()
结果:
4.2一个类别多个柱状图
- 代码示例:
import matplotlib.pyplot as plt
#数据
students=["小明","小红","小刚","小智","小华"]
math_score=[i/150 for i in [140,96,134,108,88]]
physics_score=[i/100 for i in [95,78,86,81,72]]
#创建画布
plt.figure()
#绘制图像
plt.bar(range(0,5),math_score,color='r',width=0.2)
plt.bar([i-0.2 for i in range(0,5)],physics_score,color='b',width=0.2)#注意刻度要作出调整,不然会重叠在一起
#修改刻度
plt.xticks([i-0.1 for i in range(0,5)],students)
#添加标题
plt.title("数学和物理成绩得分情况")
#添加网格显示
plt.grid(linestyle=":",alpha=0.5)
#显示图像
plt.show()
结果:
五、直方图
表示数据分布状况
plt.hist(x,bins,density,...)
#x为数据
#bins为组数
#density为是否显示频率(默认不显示)
5.1 直方图与柱状图的区别
直方图 | 柱状图 |
---|---|
展示数据的分布 | 比较数据的大小 |
x轴展示的是数字区间 | x轴展示的是分类数据 |
柱子间无间隔 | 柱子间有间隔 |
柱子宽度有意义 |
5.2 直方图的绘制
import matplotlib.pyplot as plt
#数据
math_score=[140,96,134,108,138,128,128,117,126,116,100,114,115,116,112,116,101,102,89,96,85,108,92,75,116,92,124,150]
#创建画布
plt.figure(figsize=(20,10),dpi=100)
#绘制图像
d=3
group_num = (max(math_score)-min(math_score))//d #组数=(最大值-最小值)//组距
plt.hist(math_score,bins=group_num,density=True)
#修改刻度
plt.xticks(range(min(math_score),max(math_score)+d,d))
#添加标题
plt.title("数学成绩直方图")
#添加网格显示
plt.grid(linestyle=":",alpha=0.5)
#显示图像
plt.show()
结果:
六、饼图
不同数据占比情况(类别太多不建议使用)
plt.pie(x,labels,autopct,colors,...)
#x:数量
#labels:每部分的名称
#autopct:占比显示
#colors:每部分颜色
6.1 饼图的绘制
import matplotlib.pyplot as plt
#数据
students=["小明","小红","小刚","小智","小华"]
duty_days=[3,5,8,6,8]
#创建画布
plt.figure()
#绘制图像
plt.pie(duty_days,labels=students,autopct="%1.2f%%",colors=['r','y','c','b','g'])
plt.axis('equal')#保证饼图长宽一致
#显示图例
plt.legend()
#修改刻度
plt.xticks()
#添加标题
plt.title("上月同学值日天数")
#添加网格显示
plt.grid(linestyle=":",alpha=0.5)
#显示图像
plt.show()
结果: