matplotlib教程(一)—— 入门基础

发布时间:2024-01-12 20:53:05

前言

? ? ? ? ? ?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 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()

?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’,则去除周围空白

文章来源:https://blog.csdn.net/m0_61766362/article/details/135413912
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。