前言
Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式;它可以绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等
在使用它之前,应导入:import matplotlib.pyplot as plt
1. 画布与子图
matplotlib所绘制的图位于画布(Figure)对象中,我们可以通过去设置一张画布,进而在画布上画出按我们希望的格式排版的多个子图
1.1 画布与子图的创建
1.1.1 生成画布
- 语法:plt.figure() #生成新的画布
常用参数说明:
num:画布编号或名称,数字为编号 ,字符串为名称
figsize:指定figure的宽和高,单位为英寸,输入格式为(宽,高)
dpi:分辨率(一般笔记本200,若要比较清楚可设置400、500左右)
facecolo:背景颜色
edgecolor:边框颜色
frameon:是否显示边框(默认显示)
1.1.2 创建单个子图
- 语法: 画布.add_subplot(nrows,ncols,index)
常用参数说明:
nrows,ncols:行数,列数(即创建 几乘几 的图片)
index:创建子图的序号位置(从1开始)
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用黑体显示中文
data = pd.read_excel(r"E:\python 资料\孙兴华 数据分析教程\matplotlib课件和笔记\课件\09.折线与柱状组合图.xlsx")
print(data)fig = plt.figure(num = "示例图") # 创建画布
first = fig.add_subplot(2,2,1) # 创建第一个子图
plt.plot(data['班级'],data['毛利率'],label = "毛利率",color="red",marker="*") #在第一个子图位置画一个折线图
second = fig.add_subplot(2,2,2) # 创建第二个子图
third = fig.add_subplot(2,2,3) # 创建第三个子图
fourth = fig.add_subplot(2,2,4) # 创建第四个子图
plt.bar(data["班级"],data["销售量"],color="yellow")#在第四个子图位置画一个柱状图
plt.show() #显示输出图像
1.1.3 创建多个子图
- 语法:fig,axes = plt.subplots(nrows,ncols)
参数:
sharex / sharey:所有子图是否使用相同的x轴 / y轴刻度
注:这里需要用两个变量来接收,fig指生成的画布,axes是包含n×n子图的数组
axes可以直接像二维数组那样索引,可以用 axes[ i,j ].plot / bar( )... 在指定位置作图
# 上述代码等价
fig,axes = plt.subplots(2,2)
axes[0,0].plot(data['班级'],data['毛利率'],label = "毛利率",color="red",marker="*")#第一个子图
axes[1,1].bar(data["班级"],data["销售量"],color="yellow")#第四个子图
plt.show()
1.2 新增子区域
所谓新增子区域可以理解为在一个图中,我们想再添加 / 叠加另外一个图
操作原理是通过设定图的大小和位置来进行子区域的插入
- 语法:fig.add_axes([ left,bottom,width,height ])
参数说明:
left、bottom:距离边框左侧、底部的距离
width、height:自身的宽和高度
#导入数据
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用黑体显示中文
data = pd.read_excel(r"E:\python 资料\孙兴华 数据分析教程\matplotlib课件和笔记\课件\09.折线与柱状组合图.xlsx")fig = plt.figure() #创建画布
axes1 = fig.add_axes([0.1,0.1,0.8,0.8])#设定图1的大小和位置
axes1.bar(data.班级,data.销售量) #在图1上作图
axes1.set_title("销售量") #设定图1的标题axes2 = fig.add_axes([0.65,0.6,0.25,0.25])#设定图2的大小和位置
axes2.plot(data.班级,data.毛利率)
axes2.set_title("毛利率")
plt.show()
1.3 调整边框与子图的间距
1.3.1 自动调整
- 语法:fig.tight_layout() # 不会让图片之间有重叠
1.3.2 手动调整
- 语法:fig.subplots_adjust()
常用参数:
left / right / top / bottom:子图与边框 左侧 / 右侧 / 顶部 /底部 距离百分比wspace / hspace:子图之间的 宽度 / 高度 百分比
1.4 案例:图形组合
- 要求:利用子区域方法,作出柱形图和折线图的组合图形(需掌握折线图和柱状图知识)
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用黑体显示中文
# 导入数据
data = pd.read_excel(r"E:\python 资料\孙兴华 数据分析教程\matplotlib课件和笔记\课件\09.折线与柱状组合图.xlsx")
# 创建画布
fig = plt.figure()# 创建图1————柱状图
picture1 = fig.add_subplot(1,1,1)
picture1.bar(data["班级"],data["销售量"],label = "销售量")
picture1.legend(loc = "best") # 打开图例,best指自动选择最佳位置
picture1.set_xlabel("班级") #设置x轴名称
picture1.set_ylabel("销售量") #设置y轴名称# 创建图2————折线图
picture2 = picture1.twinx() # 设置x轴为共享轴,图1使用左侧y轴,图2使用右侧y轴
picture2.plot(data["班级"],data["毛利率"],marker = "o",color = "red",label = "毛利率")
picture2.legend(bbox_to_anchor=(1,0.93)) # 打开图例
picture2.set_ylabel("毛利率") #设置y轴名称plt.show()
2. 图的样式
matplotlib的主函数plot接收带有x和y轴的数组,以及一些可选的参数来指明颜色和线的类型
- 语法:plot(x,y,[ fmt ],color = ,linestyle = ,marker = )
2.1 样式字符串
matplotlib的格式字符串 fmt 由 “ [ color ] [ marker ] [ linestyle ] ”组成,即线条的颜色、标记、线的形状 三部分
例子:ax.plot(x,y,“ko--”) 表示黑色,标记为实心圆的虚线
2.1.1 颜色(color)
- 单个颜色字符:取值范围为‘r’,‘g’,‘b’,‘c’,‘m’,‘y’,‘k’
- 也可以自定义颜色类型,例如:SeaGreen、#8FBC8F 等
2.1.2 标记(marker)
- 标记即数据点的图案样式,标记字符与外观对应关系如下图所示:
标记的大小与颜色:
- ms:标记的大小(markersize)
- mfc:标记内部的颜色(markerfacecolor)
- mec:标记边框的颜色(markeredgecolor)
2.1.3 线的形状(linestyle)
- 线形的取值范围为:
‘-’, ‘--’, ‘-.’, ‘:’
- 线形字符与外观对应关系如下图所示:
线的其他参数:
- lw:线的宽度(linewidth)
- drawstyle:点的插入方式(默认线性内插, “steps-post”:阶梯式)
2.2 刻度与标签
pyplot中有许多对象方法,可以控制刻度,标题,标签等
如果我们在调用时不传入参数,就会返回当前的参数值;如果传入参数,就会修改参数值
方法 | 作用 | 备注 |
---|---|---|
fig.suptitle() | 设置画布标题 | |
axes.set_title() | 设置图片标题 | |
axes.set_xlabel() | 设置x轴的名称 | y轴直接将x换成y即可 |
axes.set_xlim() | 设置x轴的范围 | 传入一个含min和max的列表 |
axes.set_xticks() | 设置x轴刻度 | 直接传入一个列表即可 也可直接传入两个列表,另一为对应标签 |
axes.set_xtickslabels() | 设置x轴刻度的对应标签 | 传入一个与刻度数量相同的字符串列表 |
关于标签的一些参数:
rotation:标签逆时针旋转度数(默认0)fontsize:标签字体大小(xx-small, x-small, small, medium, large, x-large,
xx-large, larger, smaller 或者输入数字也可)
2.3 图例
- 语法:axes.legend( [ handles= ,labels =] )
命名参数:
handles:可见对象(比如线条、形状)序列,传入一个元组labels:各个对象的名称,传入一个字符串列表
title:图例的名称
注: 前两个参数应该配合一起使用;
若在定义各个图 / 线时,使用label参数定义了名称,则可以什么都不传入,自行匹配
位置参数:
loc:默认为 “best” 即自动选择最优位置,该参数也可传入(left、right、center、
upper、lower)或者他们的组合来表示具体位置
bbox_to_anchor:该参数可直接传入一个坐标(x,y),x和y取值范围为0 ~ 1
样式参数:
prop:传入一个数字,调整图例大小
ncol:排列方式(默认1:并列展示,2:并排展示)
import matplotlib.pyplot as pltline1, = plt.plot([1, 1], marker='o')
line2, = plt.plot([2, 2])
plt.legend((line1, line2), ['1st', '2nd'], loc= "best",title='legends', ncol=2, # 按行排列facecolor='gray', edgecolor='r') #背景颜色 / 边框颜色
plt.show()
2.4 注释(数据标签)
所谓注释,即我们想在图上添加一些重要点的说明;或者我们想标出数据点所对应的y值
- 语法:plt.text(x,y,string,...)
参数说明:
x,y:坐标值 一一> 指注释的位置
string:注释的内容,若要写数据标签,直接传入str(y数据)即可
fontsize:注释字体大小
ha:水平对齐方式 ,参数:[ ‘center’(居中对齐) | ‘right’ (右对齐)| ‘left’(左) ]
va:垂直对齐方式 ,参数:[ ‘center’ | ‘top’ | ‘bottom’ | ‘baseline’ ]
rotation:注释的逆时针旋转角度
alpha:文字透明度
- 补充:enumerate()
在添加注释时,因为我们在填入坐标值时一次只能传入一对,所以我们不能利用dataframe的行列索引传入,我们需要分别获取对应的下标(x轴)和数据(y轴),我们就可以利用enumerate函数:for x,y in enumerate(列表名): x,y就分别得到对应下标和数据
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用黑体显示中文
# 导入数据
data = pd.read_excel(r"E:\python 资料\孙兴华 数据分析教程\matplotlib课件和笔记\课件\09.折线与柱状组合图.xlsx")
# 创建画布
fig = plt.figure()# 创建图1————柱状图
picture1 = fig.add_subplot(1,1,1)
picture1.bar(data["班级"],data["销售量"],label = "销售量")
picture1.legend(loc = "best") # 打开图例,best指自动选择最佳位置
picture1.set_ylim([0,12000]) #设置y轴范围# 添加数据标签
for x,y in enumerate(data["销售量"]):picture1.text(x,y+200,str(y),ha = "center")plt.show()
3. 图的保存
- 语法:plt.savefig(路径字符串,dpi = ,format = )
参数说明:
dpi:图片分辨率,默认为100(一般用200)facecoler / edgecolor:多余背景 / 边框 颜色(默认白色)
format:格式(‘png’,‘pdf’,‘jpg’...)
bbox_inches:保存的图片范围(若传入‘tight’,则去除周围空白)