侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python数据可视化教程之Matplotlib实现各种图表实例

Python  /  管理员 发布于 7年前   440

前言

数据分析就是将数据以各种图表的形式展现给领导,供领导做决策用,因此熟练掌握饼图、柱状图、线图等图表制作是一个数据分析师必备的技能。Python有两个比较出色的图表制作框架,分别是Matplotlib和Pyechart。本文主要讲述使用Matplotlib制作各种数据图表。

Matplotlib是最流行的用于绘制2D数据图表的Python库,能够在各种平台上使用,可以绘制散点图、柱状图、饼图等。

1、柱状图

是一种以长方形或长方体的高度为变量的表达图形的统计报告图,由一系列高度不等的纵向条纹表示数据分布的情况,用来比较两个或以上的价值(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析。柱状图可以用来比较数据之间的多少,可以用来观察某一事件的变化趋势,柱状图亦可横向排列,或用多维方式表达。

实现代码:

# 导入绘图模块import matplotlib.pyplot as plt# 构建数据sales = [7125,12753,13143,8635]# 中文乱码的处理,rcParams也可以用于设置图的分辨率,大小等信息plt.rcParams['font.sans-serif'] =['SimHei']plt.rcParams['axes.unicode_minus'] = False# 绘图,第一个参数是x轴的数据,第二个参数是y轴的数据,第三个参数是柱子的大小,默认值是1(值在0到1之间),color是柱子的颜色,alpha是柱子的透明度plt.bar(range(4), sales, 0.4,color='r', alpha = 0.8)# 添加轴标签plt.ylabel('销量')# 添加标题plt.title('水果2018年度销量')# 添加刻度标签plt.xticks(range(4),['苹果','香蕉','梨','猕猴桃'])# 设置Y轴的刻度范围plt.ylim([5000,15000])# 为每个条形图添加数值标签for x,y in enumerate(sales): plt.text(x,y+100,'%s' %y,ha='center')# 显示图形plt.show()

效果图:

只需绘制柱状图的函数bar()改成barh()就可以将柱状图长方形或长方体从垂直方向变为水平方向。

实现代码:

# 导入绘图模块import matplotlib.pyplot as plt# 构建数据sales = [7125,12753,13143,8635]# 中文乱码的处理plt.rcParams['font.sans-serif'] =['SimHei']plt.rcParams['axes.unicode_minus'] = Falsex = ['苹果','香蕉','梨','猕猴桃']# 绘图plt.barh(range(4), sales, 0.4,color='r', alpha = 0.8)# 添加轴标签plt.ylabel('销量')# 添加标题plt.title('水果2018年度销量')# 添加刻度标签plt.yticks(range(4),['苹果','香蕉','梨','猕猴桃'])# 设置Y轴的刻度范围plt.xlim([5000,15000])# 为每个条形图添加数值标签for x,y in enumerate(sales): plt.text(y+0.2,x,'%s' %y,va='center')# 显示图形plt.show()

效果图:


除了bar()函数变成barh()之外。还有其他几个地方要做修改,在给每个条形图添加数值标签时,将ha='center'改为va='center',将添加x轴标签的方法从xlabel改为ylabel。

柱状图和折线图混合使用

柱状图可以和折线图混合使用,用来表示某一个数据的变化趋势,下面是例子的柱状图表示水果的年度销量,折线图表示水果1月份的销量。

代码:

# 导入绘图模块import matplotlib.pyplot as pltjan_sales = [3010,4029,5021,3056]# 构建数据sales = [7125,12753,13143,8635]# 中文乱码的处理plt.rcParams['font.sans-serif'] =['SimHei']plt.rcParams['axes.unicode_minus'] = Falsex = ['苹果','香蕉','梨','猕猴桃']plt.plot(x,jan_sales,'r')# 折线 1 x 2 y 3 colorplt.plot(x,jan_sales,'g',lw=5)# 4 line w# 绘图plt.bar(range(4), sales, 0.4,color='b', alpha = 0.8)# 添加轴标签plt.ylabel('销量')# 添加标题plt.title('水果2018年度销量')# 添加刻度标签plt.xticks(range(4),['苹果','香蕉','梨','猕猴桃'])# 设置Y轴的刻度范围plt.ylim([2000,15000])# 为每个条形图添加数值标签for x,y in enumerate(sales): plt.text(x,y+100,'%s' %y,ha='center')# 显示图形plt.show()

效果图:

2、折线图

折线图主要用于表示数据变化的趋势。折线图是直线将不同的点连接起来。

# 导入绘图模块import matplotlib.pyplot as plt#构建数据jan_sales = [3010,4029,5021,3056]# 中文乱码的处理plt.rcParams['font.sans-serif'] =['SimHei']plt.rcParams['axes.unicode_minus'] = Falsex = ['苹果','香蕉','梨','猕猴桃']#第一个参数是x轴,第二参数时y轴数据,第三个参数是线的颜色,第二个参数是线条的粗细plt.plot(x,jan_sales,'r',lw=5)# 4 line w# 添加标题plt.title('水果2018年度1月份销量图')plt.ylim([2000,15000])# 为每个点添加数值标签for x,y in enumerate(jan_sales): plt.text(x,y+100,'%s' %y,ha='center')# 显示图形plt.show()

效果图:

折线图通过调用plot()方法绘制。

3、饼图

饼图主要是用来表示数据的占比,给人一眼就可以看出数据的占比大小。饼图使用pie()函数绘制。

import matplotlib.pyplot as plt# 设置绘图的主题风格(不妨使用R中的ggplot分隔)plt.style.use('ggplot')# 构造数据edu = [0.2515,0.3724,0.3336,0.0368,0.0057]labels = ['苹果','香蕉','梨','猕猴桃','桔子']explode = [0,0.1,0,0,0] # 用于突出显示大专学历人群colors=['#FEB748','#EDD25D','#FE4F54','#51B4FF','#dd5555'] # 自定义颜色# 中文乱码和坐标轴负号的处理plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False# 将横、纵坐标轴标准化处理,保证饼图是一个正圆,否则为椭圆plt.axes(aspect='equal')# 控制x轴和y轴的范围plt.xlim(0,4)plt.ylim(0,4)# 绘制饼图plt.pie(x = edu,# 绘图数据 explode=explode, # 突出显示香蕉人群 labels=labels, # 添加水果销量水平标签 colors=colors, # 设置饼图的自定义填充色 autopct='%.1f%%', # 设置百分比的格式,这里保留一位小数 pctdistance=0.8,# 设置百分比标签与圆心的距离 labeldistance = 1.15, # 设置销量水平标签与圆心的距离 startangle = 180, # 设置饼图的初始角度 radius = 1.5, # 设置饼图的半径 counterclock = False, # 是否逆时针,这里设置为顺时针方向 wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'},# 设置饼图内外边界的属性值 textprops = {'fontsize':12, 'color':'k'}, # 设置文本标签的属性值 center = (1.8,1.8), # 设置饼图的原点 frame = 1)# 是否显示饼图的图框,这里设置显示# 删除x轴和y轴的刻度plt.xticks(())plt.yticks(())# 添加图标题plt.title('2018年水果销量分析')# 显示图形plt.show()

效果图:

简单介绍下pie函数参数:

  • x: 指定绘图的数据
  • explode:指定饼图某些部分的突出显示,即呈现爆炸式
  • labels:为饼图添加标签说明,类似于图例说明
  • colors:指定饼图的填充色
  • autopct:设置百分比格式,如'%.1f%%'为保留一位小数
  • shadow:是否添加饼图的阴影效果
  • pctdistance:设置百分比标签与圆心的距离
  • labeldistance:设置各扇形标签(图例)与圆心的距离;
  • startangle:设置饼图的初始摆放角度, 180为水平;
  • radius:设置饼图的半径大小;
  • counterclock:是否让饼图按逆时针顺序呈现, True / False;
  • wedgeprops:设置饼图内外边界的属性,如边界线的粗细、颜色等, 如wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'}
  • textprops:设置饼图中文本的属性,如字体大小、颜色等;
  • center:指定饼图的中心点位置,默认为原点
  • frame:是否要显示饼图背后的图框,如果设置为True的话,需要同时控制图框x轴、y轴的范围和饼图的中心位置;

4、散点图

散点图主要的作用是判断两个变量之间关系的强弱或者是否存在关系。

散点图由scatter()方法绘制。

import numpy as npimport matplotlib.pyplot as plt# 数据个数n = 50# 均值为0, 方差为1的随机数x = np.random.normal(0, 1, n)y = np.random.normal(0, 1, n)# 计算颜色值color = np.arctan2(y, x)# 绘制散点图plt.scatter(x, y, s = 75, c = color, alpha = 0.5)# 设置坐标轴范围plt.xlim((-1.5, 1.5))plt.ylim((-1.5, 1.5))# 不显示坐标轴的值plt.xticks(([-1,0,1,2,3,4]))plt.yticks(([-1,0,1,2,3,4]))plt.show()

效果图:

5、箱线图

箱线图一般用来展现数据大小、占比、趋势等等的呈现,其包含一些统计学的均值、分位数、极值等等统计量,因此,该图信息量较大,不仅能够分析不同类别数据平均水平差异(需在箱线图中加入均值点),还能揭示数据间离散程度、异常值、分布差异等等。

使用boxplot()方法绘制。

import numpy as npimport matplotlib.pyplot as pltimport pandas as pdnp.random.seed(2) #设置随机种子df = pd.DataFrame(np.random.rand(5,4),columns=['A', 'B', 'C', 'D'])#先生成0-1之间的5*4维度数据,再装入4列DataFrame中df.boxplot() #也可用plot.box()plt.show()

效果图:

6、雷达图

雷达图可以用来显示一个周期数值的变化,也可以用来展示对个对象/维度之间的关系

import numpy as npimport matplotlib.pyplot as plt#标签labels = np.array(['语文','数学','英语','生物','物理','化学'])#数据个数dataLenth = 6#数据data = np.array([7,4,3,6,4,8])angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False)data = np.concatenate((data, [data[0]])) # 闭合angles = np.concatenate((angles, [angles[0]])) # 闭合fig = plt.figure()ax = fig.add_subplot(111, polar=True)# polar参数!!ax.plot(angles, data, 'bo-', linewidth=2)# 画线ax.fill(angles, data, facecolor='r', alpha=0.25)# 填充ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")ax.set_title("matplotlib雷达图", va='bottom', fontproperties="SimHei")ax.set_rlim(0,10)ax.grid(True)plt.show()

效果图:

7、气泡图

气泡图用于判断3个变量之间是否存在某种关系。它跟散点图有点类似,只不过气泡图以气泡大小作为新的维度

import pandas as pdimport matplotlib.pyplot as pltimport pandas as pdd = {"时间":pd.Series([2006,2007,2008,2009,2010]),  "数量":pd.Series([10,200,120,150,300]),  "大小":pd.Series([50,130,40,50,160]),  "分类":pd.Series([1,2,0,1,2]),  "判断":pd.Series([True,True,True,True,True])}df=pd.DataFrame(d)#先定义气泡大小,rank 函数将大小列进行大小分配,越大的值分配结果也越高#n 为倍数,用来调节气泡的大小,且看后头size=df['大小'].rank()n=20#定义一个字典,将颜色跟对应的分类进行绑定color={0:'red',1:'blue',2:'orange'}#增加color的参数,用列表解析式将data分类中的每个数据的数字映射到前面color的颜色中plt.scatter(df['数量'],df['大小'],color=[color[i] for i in df['分类']],s=size*n,alpha=0.6)plt.show()

效果图:

气泡图用也是scatter方法绘制,和散点图一样。差别在于点的大小不一样,散点图的点都是一样的,而气泡图点的大小不一样。

以上就是柱状图、散点图、气泡图、折线图的实现方式。希望给大伙带来帮助。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家的支持。


  • 上一条:
    python 将大文件切分为多个小文件的实例
    下一条:
    python中使用 xlwt 操作excel的常见方法与问题
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客