Python数据分析(一)(Matplotlib使用)

Python数据分析(一)(Matplotlib使用)
文章图片


目录

    • 1. Matplotlib介绍与安装
      • 1.1 Matplotlib介绍
      • 1.2 Matplotlib安装
    • 2. Matplotlib绘图
      • 2.1 创建画布
      • 2.2 添加子图
      • 2.3 plt.subplots用法
    • 3. Matplotlib绘制图形
      • 3.1 折线图
      • 3.2 散点图
      • 3.3 条形图
        • 3.3.1 条形图
        • 3.1.2 堆叠条形图
        • 3.1.3 分组条形图
        • 3.1.4 水平条形图
      • 3.4 直方图
      • 3.5 扇形图
      • 3.6 箱形图
      • 3.7 雷达图

1. Matplotlib介绍与安装 1.1 Matplotlib介绍
  • 介绍:Matplotlib是一个Python的基础绘图库,它可与Numpy一起使用,代替Matlab使用
1.2 Matplotlib安装
  • 安装:pip install matplotlib
2. Matplotlib绘图 2.1 创建画布
  • 在任何绘图之前,我们需要一个Figure对象,可以理解成我们需要一张画板才能开始绘图;Matplotlib所绘制的图位于图片(figure)对象中,我们可以通过plt.figure生成一个新的图片,
from matplotlib.pyplot as plt# # figsize:传入元组,英寸单位的宽和高 # dpi:图像的分辨率 fig = plt.figure(figsize=(10,10),dpi=60) print(fig) # 展示图片 fig.show()

Figure(640x480)

Python数据分析(一)(Matplotlib使用)
文章图片

2.2 添加子图
  • 可以通过plt.subplot创建一个或多个子图
# 添加一个子图 plt.subplot(221) plt.show()

【Python数据分析(一)(Matplotlib使用)】Python数据分析(一)(Matplotlib使用)
文章图片

# 创建多个子图 ax1 = plt.subplot(2,2,1) # 2*2,最多4个图形,index=1,选择了第一个 ax2 = plt.subplot(2,2,2) ax3 = plt.subplot(2,2,3) ax4 = plt.subplot(2,2,4)plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

  • 索引超出范围报错
ax5 = plt.subplot(2,2,5) plt.show()

ValueError: num must be 1 <= num <= 4, not 5

2.3 plt.subplots用法
  • 除上述方法外,Matplotlib包含一个快捷方法plt.subplots创建一个新的图片,返回包含了以生成子图对象的Numpy数组
  • plt.subplots(nrows, ncols, sharex, sharey)
    • nrows:子图的行数
    • ncols:组图的列数
    • sharex:所有子图使用相同的x轴刻度
    • sharey:所有子图使用相同的y轴刻度
# 2*2,nrows子图的行数,ncols子图的列数,sharex,sharey共享刻度 plt.subplots(2,2,sharex=True,sharey=True) plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

  • 返回值:return fig(画布), axs(子图)
  • 子图绘制散点图
fig, axs = plt.subplots(2,2,sharex=True,sharey=True)# 选中第一张图 axs[0,0].scatter(range(5)) # 选中第二张图 axs[0,1].scatter(range(5),list(range(5))[::-1]) plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

  • 调整子图的间距
plt.subplots_adjust(wspace=0,hspace=0) plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

3. Matplotlib绘制图形 matplotlib能够绘制折线图,散点图,条形图,直方图,饼图等等
3.1 折线图
  • 介绍:折线图以折线的上升或下降来表示统计数量的增减变化的统计图
  • 特点:能够显示数据的变化趋势,反应事物的变化情况
  • 折线图绘制:可以通过plot()函数来绘制
    • 语法:plt.plot(x, y)
    • 实例
from matplotlib import pyplot as pltx = [1,4,7,8,9] y = [5,6,3,5,6]plt.plot(x,y) plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

  • plt.plot()函数除了传入制图数据,还可以进行其他设置
    • color:设置线的颜色
    • linestyle:设置线的样式
    • marker:标记样式
    • 实例
plt.plot(x,y,color='r',linestyle='--',marker='4') plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

  • 实例
# 假设一天中每隔两个小时的气温分别是[15,13,14.5,17,20,25,26,26,27,22,18,15],绘制图形 from matplotlib import pyplot as plt# 每隔两个小时:2,4,6,8....24 x = list(range(2,26,2)) y = [15,13,14.5,17,20,25,26,26,27,22,18,15]plt.plot(x,y) plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

  • 图形组成:实际上图形组成除了x,y轴,还有其他很多组建,下图所示
    Python数据分析(一)(Matplotlib使用)
    文章图片
方法 描述
plt.figure(figsize=None,dpi=None) 生成新的图片,figsieze:图片大小,dpi:透明度
plt.savefig(fname) 保存图片
plt.xticks(ticks=None) 设置x轴刻度的值
plt.yticks(ticks=None) 设置y轴刻度的值
plt.xlable(xlable) 设置x轴标签
plt.ylable(ylable) 设置y轴标签
plt.title() 设置图片标题
plt.grid() 根据x轴和y轴的数值展示轴网格
  • 实例
from matplotlib import pyplot as plt# 每隔两个小时:2,4,6,8....24 x = list(range(2,26,2)) y = [15,13,14.5,17,20,25,26,26,27,22,18,15]# 设置画布大小 plt.figure(figsize=(14,8))# 设置x轴刻度:以0h,0.5h,1h,1.5h....23.5h显示 # ticks:刻度 # lables:刻度标签 # rotation:旋转角度 x_t = [i/2 for i in range(0,48)] x_l = ['{}h'.format(i/2) for i in range(0,48)] plt.xticks(x_t,x_l,rotation=45)# 设置y轴刻度:最大值,最小值 y_t = range(min(y),max(y)) plt.yticks(y_t)# 添加x轴标签 plt.xlable('time')# 添加y轴标签 plt.ylable('temperature')# 添加标题 plt.title('temperature change')# 添加网格 plt.grid()# 绘制图形 plt.plot(x,y)# 保存图片:要在show之前保存,否则就是空白图 plt.savefig('mat.png')# 展示图片 plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

  • 中文显示:当我们需要设置轴标签、标题等,通常会使用到中文,但是matplotlib默认不显示中文,例如:
# 如果列表a表示10点到12点的每一分钟的气温,如何绘制折线图观察每分钟气温的变化情况 from matplotlib import pyplot as plt import randomx = range(0,120) # 生成120个随机整数 y = [random.randint(30,38) for i in range(120)]# 刻度:0,10,20,30....110 x_t = range(0,120,10) # 显示x刻度标签:十点0分,十点10分....十一点0分,十一点10分....十一点50分 x_l = ['十点{}分'.format(i) for i in range(0,60,10)] x_l += ['十一点{}分'.format(i) for i in range(0,60,10)]plt.xticks(x_l,x_t,rotation=45) plt.plot(x,y) plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

  • 解决方法:
  • 方法一:
import matplotlibfont = { 'family':'Arial Unicode MS', 'weight':'bold', 'size':12 } matplotlib.rc("font",**font)

  • 方法二:
import matplotlib.pyplot as plt# plt.rcParams['font.family'] = 'Arial Unicode MS' plt.rcParams['font.sans-serif'] = 'Arial Unicode MS' # 解决坐标轴负数的负号显示问题 plt.rcParams['axes.unicode_minus'] = False

Python数据分析(一)(Matplotlib使用)
文章图片

  • 方法三:局部设置方式
from matplotlib import pyplot as plt from matplotlib.font_manager import FontProperties font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14) x = [1,2,3,4] y = [3,2,1,3]plt.plot(x,y) plt.xlabel("x轴标签",fontproperties=font) plt.show()

  • 以下代码可以查看matplotlib支持的字体文件
from matplotlib import font_managera = sorted([f.name for f in font_manager.fontManager.ttflist]) for i in a: print(i)

  • 添加图例:plt.legend()
''' 假设大家在30岁的时候,根据自己的实际情况,统计出来了你和同桌从11岁到30岁每年交的男女朋友的数量如列表a和b,请绘制出该数据的折线图,以便分析自己和同桌每年交男女朋友的数量走势 a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1] b = [1,0,3,1,2,2,2,3,1,1,1,1,1,2,1,1,2,3,2,2] 要求: ? y轴表示个数 ? x轴表示岁数,比如11岁,12岁 ''' from matplotlib import pyplot as plt# 显示中文 plt.rcParams['font.sans-serif'] = 'Arial Unicode MS'# 构建x,y my_y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1] my_cls_y = [1,0,3,1,2,2,2,3,1,1,1,1,1,2,1,1,2,3,2,2] x = range(11,31)# x刻度、标签 x_t = [i for i in range(11,31)] x_l = ['{}岁'.format(i) for i in range(11,31)] plt.xticks(x_t,x_l,ratation=45)# 绘图 plt.plot(x,my_y,label='自己') plt.plot(x,my_cls_y,label='同桌')# 添加图例 # 1、plt.plot()添加label属性 # 2、plt.legend()局部指定字体,要使用prop plt.legend()# 展示图片 plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

  • 添加数据标签:plt.annotate()
  • 参数:
    • text:注释的文本
    • xy:需要注释的点的坐标
    • xttext:注释文本的坐标
    • arrowprops:箭头的样式属性,参数类型为字典
      1、wedth:箭身的宽度
      2、facecolor:箭头的颜色
      3、headlength:箭头的头的长度
      4、headwidth:箭头的宽度
from matplotlib import pyplot as plt import randomx = range(10) y = [random.randint(10,30) for i in range(10)]plt.plot(x,y,marker='o')# 数据标签 plt.annotate('28',xy=(0,28),xytext=(-0.3,0),arrowsprops={'width':2})plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

# arrowsprops参数使用 from matplotlib import pyplot as plt import randomx = range(10) y = [random.randint(10,30) for i in range(10)]plt.plot(x,y,marker='o')# 数据标签 plt.annotate('This is a zhushi',xy=(0,18),xytext=(2,28),arrowsprops={'facecolor':'r','headlength':30,'headwidth':30,'width':30})plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

# 实现:将每个点都使用上数据标签 from matplotlib import pyplot as plt import randomx = range(10) y = [random.randint(10,30) for i in range(10)]plt.plot(x,y,marker='o')# 数据标签 for xy in zip(x,y): plt.annotate(xy, xy=xy, xytext=xy, arrowprops={'width':2,'facecolor':'y'})plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

3.2 散点图
  • 介绍:散点图用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式
  • 特点:判断变量之间是否存在数量关联趋势,表示离群点(分布规律)
  • 散点图绘制:通过scatter()函数绘制
    • 语法:plt.scatter(x,y)
    • 实例
''' 假设通过爬虫你获取到了长沙2019年4,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温和随时间变化的某种规律 a = [11,17,16,11,12,11,12,13,10,14,8,13,12,15,14,17,18,21,16,17,30,14,15,15,15,19,21,22,22,22,23] b = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,15,10,11,13,12,13,6] ''' from matplotlib import pyplot as plty_4 = [11,17,16,11,12,11,12,13,10,14,8,13,12,15,14,17,18,21,16,17,30,14,15,15,15,19,21,22,22,22,23] y_10 = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,15,10,11,13,12,13,6]# 中文显示 plt.rcParams['font.sans-serif'] = 'Arial Unicode MS'# 4,10月份的分布分开 x_4 = range(1,32) x_10 = range(51,82)# 绘制散点图 plt.scatter(x_4,y_4) plt.scatter(x_10,y_10)# 刻度:四月1号....四月31号 十月1号....十月31号 x_t = list(x_4) + list(x_10) x_l = ['四月{}号'.format(i) for i in range(x_4)] x_l += ['十月{}号'.format(i) for i in range(x_10)] plt.xticks(x_t[::4], x_l[::4], rotation=45)# 展示图片 plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

3.3 条形图
3.3.1 条形图
  • 介绍:条形图是用宽度相同的条形的高度或长短来表示数据多少的图形,条形图可以横置或纵置,纵置也称为柱形图
  • 特点:
    • 能够使人们一眼看出各个数据的大小
    • 易于比较数据之间的差别
  • 柱形图绘制:通过bar()函数绘制
    • 语法:plt.bar(x,height)
    • 实例
''' 假设你获取到了2019年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据 a = ["流浪地球","复仇者联盟4:终局之战","哪吒之魔童降世","疯狂的外星人","飞驰人生","蜘蛛侠:英雄远征","扫毒2天地对决","烈火英雄","大黄蜂","惊奇队长","比悲伤更悲伤的故事","哥斯拉2:怪兽之王","阿丽塔:战斗天使","银河补习班","狮子王","反贪风暴4","熊出没","大侦探皮卡丘","新喜剧之王","使徒行者2:谍影行动","千与千寻"] b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23,5.22]单位:亿 '''from matplotlib import pyplot as plt# 构建x,height a = ["流浪地球","复仇者联盟4:终局之战","哪吒之魔童降世","疯狂的外星人","飞驰人生","蜘蛛侠:英雄远征","扫毒2天地对决","烈火英雄","大黄蜂","惊奇队长","比悲伤更悲伤的故事","哥斯拉2:怪兽之王","阿丽塔:战斗天使","银河补习班","狮子王","反贪风暴4","熊出没","大侦探皮卡丘","新喜剧之王","使徒行者2:谍影行动","千与千寻"] b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23,5.22]# 中文显示 plt.rcParams['font.sans-serif'] = 'Arial Unicode MS'# 放大画布 plt.figure(figsize=(14,8))# 设置刻度 plt.xticks(rotation=90)# 绘制柱形图 # width:调整柱子的宽度,默认0.8 # bottom:y的起始值 # align:默认center居中,设置为edge边缘,取决于width的正负值 plt.bar(a,b,width=-0.3,bottom=30,align='edge')plt.show()

3.1.2 堆叠条形图
  • 实例
from matplotlib import pyplot as plt# 构建x,height fruits = ['水果', '梨子', '车厘子'] Q1_sales = [1000, 800, 3000] Q2_sales = [1200, 700, 2800]# 中文显示 plt.rcParams['font.sans-serif'] = 'Arial Unicode MS'# 绘制条形图 plt.bar(fruits, Q1_sales, bottom=Q2_sales, label='Q1') plt.bar(fruits, Q2_sales, label='Q2')# 添加图例 plt.legend()# 展示图片 plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

3.1.3 分组条形图
  • 实例
在这里插入代码片

3.1.4 水平条形图
  • 水平条形图绘制:通过barh()函数绘制
    • 语法:plt.barh(y,width)
    • 实例
from matplotlib import pyplot as plt# 构建y,width a = ["流浪地球","复仇者联盟4:终局之战","哪吒之魔童降世","疯狂的外星人","飞驰人生","蜘蛛侠:英雄远征","扫毒2天地对决","烈火英雄","大黄蜂","惊奇队长","比悲伤更悲伤的故事","哥斯拉2:怪兽之王","阿丽塔:战斗天使","银河补习班","狮子王","反贪风暴4","熊出没","大侦探皮卡丘","新喜剧之王","使徒行者2:谍影行动","千与千寻"] b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23,5.22]# 中文显示 plt.rcParams['font.sans-serif'] = 'Arial Unicode MS'# 绘制水平条形图 plt.barh(a,b)# 显示图片 plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

3.4 直方图
  • 介绍:直方图是由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般用横轴表示数据范围,纵轴表示分布情况
  • 特点:绘制连续性的数据,展示一组或者多组数据的分布情况
  • 直方图绘制:通过hist()函数绘制
    • 语法:plt.hist(x, bins=None)
    • bins为组数:组数=极差/组距
    • 实例
''' 练习 某地区连续50年中四月份平均气温数据如下: temp_li= [6.9,4.1,6.6,5.2,6.4,7.9,8.6,3.0,4.4,6.7,7.1,4.7,9.1,6.8,8.6,5.2,5.8,7.9,5.6,8.8,8.1,5.7,8.4,4.1,6.4,6.2,5.2,6.8,5.6,5.6,6.8,8.2,6.4,4.8,6.9,7.1,9.7,6.4,7.3,6.8,7.1,4.8,5.8,6.5,5.9,7.3,5.5,7.4,6.2,7.7] 根据以上数据,推断该地区四月份平均气温的分布类型 '''from matplotlib import pyplot as plt# 显示中文 plt.rcParams['font.sans-serif'] = 'Arial Unicode MS'temp_li= [6.9,4.1,6.6,5.2,6.4,7.9,8.6,3.0,4.4,6.7,7.1,4.7,9.1,6.8,8.6,5.2,5.8,7.9,5.6,8.8,8.1,5.7,8.4,4.1,6.4,6.2,5.2,6.8,5.6,5.6,6.8,8.2,6.4,4.8,6.9,7.1,9.7,6.4,7.3,6.8,7.1,4.8,5.8,6.5,5.9,7.3,5.5,7.4,6.2,7.7]# 组距 b = 1# bins组数:组数=极差/组距,round:四舍五入 bi = round(max(temp_li)-min(temp_li))//b# 绘制直方图 plt.hist(temp_li, bins=bi, density=True) # bins一定是整数类型,默认为10# 显示标签 plt.xlabel('区间') plt.ylabel('频数/频率') plt.title('直方图')# 展示图片 plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

3.5 扇形图
  • 介绍:扇形图,用整个圆表示总数,用园内各个扇形的大小表示各部分数量占总数的百分数
  • 扇形图绘制:通过pie()函数绘制
    • 语法:plt.pie(x, explode=None, labels=None)
    • x
    • explode:设置某几个分块是否有分离饼图
    • labels:每块扇形标签
    • autopct:百分比数据标签
    • shadow:是否显示阴影
    • 实例
''' 将以下frac数据绘制扇形图,并且设置其扇形标签为label frac = [1/50,6/50,11/50,15/50,9/50,6/50,2/50] label = ['[3,4]','(4,5]','(5,6]','(6,7]','(7,8]','(8,9]','(9,10]'] '''from matplotlib import pyplot as pltfrac = [1/50,6/50,11/50,15/50,9/50,6/50,2/50] label = ['[3,4]','(4,5]','(5,6]','(6,7]','(7,8]','(8,9]','(9,10]']# 绘制扇形图 # labels:扇形标签 # autopct:百分比数据标签 # explode:设置某几个分块是否要分离饼图,传入为元组 # shadow:是否显示阴影 # textprops:设置字体,传入为字典 explode_li = (0,0.3,0,0,0,0,0.2) plt.pie(frac, labels=label, autopct='%.2f%%', explode=explode_li, shadow=True, textprops={'size':20})# 展示图片 plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

  • plt.pie()有3个返回值
    • patches:绘制饼图每一块的对象
    • texts:文本的列表
    • autotexts:百分比的文本列表
3.6 箱形图
  • 介绍:箱型图是一种直观简洁的方式去呈现一组数据的分布。广泛用于各个数据分析领域,它能非常简单明了地显示一组数据中5个重要数值,并且还能发现一组数据中的存在的异常值
    • 最大值
    • 最小值
    • 中位数
    • 下四分位数(Q1)
    • 上四分位数(Q3)
  • 箱形图绘制:通过boxplot()函数绘制
    • 语法:plt.boxplot()
    • 参数:
    • x:需要绘制的箱型图的数据
    • notch:是否展示置信区间 默认为False
    • sym:代表异常点的符号表示,默认为圆点
    • vert:是否是垂直的,默认是True
    • whis:上下限系数,默认为1.5
    • positions:设置每个盒子的位置
    • widths:设置每个盒子的宽度
    • labels:每个盒子的label
    • meanline和showmeans:都为True的时候 会展示平均线
    • 实例
from matplotlib import pyplot as plt import random''' 随机生成100个 1-100的数据 ''' data = https://www.it610.com/article/[random.randint(1,100) for i in range(100)]# 列表添加异常值 data.extend([-100,500])# 绘制箱形图 # sym:异常点的符号表示,默认原点 # widths:每个盒子的宽度 # meanline/showmeans:都为True的时候,会展示平均线 plt.boxplot(data, sym='^', widths=0.2, meanline=True, showmeans=True)# 展示图片 plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

3.7 雷达图
  • 介绍:雷达图又被叫做蜘蛛网图,适用于显示三个或更多的维度的变量的强弱情况,比如某个企业在哪些业务方面的投入等,都可以使用雷达图方便的表示
  • 雷达图绘制:通过polar()函数绘制,在matplotlib.pyplot中,可以通过plt.polar来绘制雷达图,这个方法的参数跟plt.plot非常的类似,只不过是x轴的坐标点应该为弧度(2*PI=360°)
    • 实例
from matplotlib import pyplot as plt import numpy as npquaters = ['Q1','Q2','Q3','Q4'] sales = [40,91,44,90,40]# 弧度 = 2*PI=360° # 求theta,2*PI theta = np.linspace(0, np.pi*2, 5) # 创建等差数列# 绘制雷达图 plt.polar(theta, sales)# 设置刻度标签 # plt.xticks(theta,quaters)# 填充 plt.fill(theta, sales)# 展示图片 plt.show()

Python数据分析(一)(Matplotlib使用)
文章图片

    推荐阅读