? ? ? ? ? ?Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式;它可以绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等
? ? ? ? ? ?在使用它之前,应导入:import? matplotlib.pyplot? as? plt
? ? matplotlib所绘制的图位于画布(Figure)对象中,我们可以通过去设置一张画布,进而在画布上画出按我们希望的格式排版的多个子图
? ?1.1.1 生成画布
常用参数说明:
? ? ? ? ? ? ? ? ? ?? ??
? ? ? ? ? ? ?num:画布编号或名称,数字为编号 ,字符串为名称
? ? ? ? ? ? ?figsize:指定figure的宽和高,单位为英寸,输入格式为(宽,高)
? ? ? ? ? ? ?dpi:分辨率(一般笔记本200,若要比较清楚可设置400、500左右)
? ? ? ? ? ? ?facecolo:背景颜色
? ? ? ? ? ? ?edgecolor:边框颜色
? ? ? ? ? ? ?frameon:是否显示边框(默认显示)
? ?1.1.2 创建单个子图
常用参数说明:? ? ? ??
? ? ? ? ? ? ? ?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 创建多个子图?
?参数:?
? ? ? ? ? ?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()
? ? ?所谓新增子区域可以理解为在一个图中,我们想再添加 / 叠加另外一个图
? ? ?操作原理是通过设定图的大小和位置来进行子区域的插入?
?参数说明:
? ? ? ? ? ? ?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 自动调整
? ?1.3.2 手动调整?
常用参数:
? ? ? ? ? ? ? left / right / top / bottom:子图与边框 左侧 / 右侧 / 顶部 /底部 距离百分比? ? ? ? ? ? ? wspace / hspace:子图之间的 宽度 / 高度 百分比
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()
? ? ? matplotlib的主函数plot接收带有x和y轴的数组,以及一些可选的参数来指明颜色和线的类型
? ? ? matplotlib的格式字符串 fmt 由 “ [ color ] [ marker?] [ linestyle ]?”组成,即线条的颜色、标记、线的形状 三部分
?例子:ax.plot(x,y,“ko--”)? ? ? ? ? ?表示黑色,标记为实心圆的虚线?
?
?2.1.1 颜色(color)
? 2.1.2 标记(marker)
标记的大小与颜色:
- ms:标记的大小(markersize)
- mfc:标记内部的颜色(markerfacecolor)
- mec:标记边框的颜色(markeredgecolor)
? 2.1.3 线的形状(linestyle)
‘-’, ‘--’, ‘-.’, ‘:’
线的其他参数:
- lw:线的宽度(linewidth)
- drawstyle:点的插入方式(默认线性内插, “steps-post”:阶梯式)
?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??或者输入数字也可)
命名参数:
? ? ? ? ? ? ?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 plt
line1, = 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()
???所谓注释,即我们想在图上添加一些重要点的说明;或者我们想标出数据点所对应的y值?
参数说明:
? ? ? ? ?
? ? ? ? ?x,y:坐标值 一一> 指注释的位置
? ? ? ? ?string:注释的内容,若要写数据标签,直接传入str(y数据)即可
? ? ? ? ?fontsize:注释字体大小
? ? ? ? ?ha:水平对齐方式 ,参数:[ ‘center’(居中对齐) | ‘right’ (右对齐)| ‘left’(左) ]
? ? ? ???va:垂直对齐方式 ,参数:[ ‘center’ | ‘top’ | ‘bottom’ | ‘baseline’ ]
? ? ? ? ?rotation:注释的逆时针旋转角度
? ? ? ? ?alpha:文字透明度
? ? ? ?在添加注释时,因为我们在填入坐标值时一次只能传入一对,所以我们不能利用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()
参数说明:
? ? ? ? ? ??dpi:图片分辨率,默认为100(一般用200)? ? ? ? ? ? facecoler / edgecolor:多余背景 / 边框 颜色(默认白色)
? ? ? ? ? ? format:格式(‘png’,‘pdf’,‘jpg’...)
? ? ? ? ? ? bbox_inches:保存的图片范围(若传入‘tight’,则去除周围空白)