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


Posted in Python onJanuary 13, 2019

前言

数据分析就是将数据以各种图表的形式展现给领导,供领导做决策用,因此熟练掌握饼图、柱状图、线图等图表制作是一个数据分析师必备的技能。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()

效果图:

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

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

实现代码:

# 导入绘图模块
import matplotlib.pyplot as plt
# 构建数据
sales = [7125,12753,13143,8635]

# 中文乱码的处理
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = False

x = ['苹果','香蕉','梨','猕猴桃']
# 绘图
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()

效果图:

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

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

柱状图和折线图混合使用

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

代码:

# 导入绘图模块
import matplotlib.pyplot as plt

jan_sales = [3010,4029,5021,3056]
# 构建数据
sales = [7125,12753,13143,8635]


# 中文乱码的处理
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = False

x = ['苹果','香蕉','梨','猕猴桃']

plt.plot(x,jan_sales,'r')# 折线 1 x 2 y 3 color
plt.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()

效果图:

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

2、折线图

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

# 导入绘图模块
import matplotlib.pyplot as plt

#构建数据
jan_sales = [3010,4029,5021,3056]


# 中文乱码的处理
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = False

x = ['苹果','香蕉','梨','猕猴桃']

#第一个参数是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()

效果图:

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

折线图通过调用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()

效果图:

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

简单介绍下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 np
import 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()

效果图:

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

5、箱线图

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

使用boxplot()方法绘制。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
np.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()

效果图:

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

6、雷达图

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

import numpy as np
import 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()

效果图:

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

7、气泡图

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

import pandas as pd
import matplotlib.pyplot as plt
import pandas as pd

d = {"时间":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()

效果图:

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

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

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

总结

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

Python 相关文章推荐
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
May 05 Python
100行python代码实现跳一跳辅助程序
Jan 15 Python
使用python存储网页上的图片实例
May 22 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
Jun 14 Python
Linux下python制作名片示例
Jul 20 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
Oct 09 Python
python简易实现任意位数的水仙花实例
Nov 13 Python
浅谈python多进程共享变量Value的使用tips
Jul 16 Python
python的pygal模块绘制反正切函数图像方法
Jul 16 Python
Python GUI学习之登录系统界面篇
Aug 21 Python
python进程间通信Queue工作过程详解
Nov 01 Python
一些让Python代码简洁的实用技巧总结
Aug 23 Python
python中使用 xlwt 操作excel的常见方法与问题
Jan 13 #Python
用Python实现大文本文件切割的方法
Jan 12 #Python
python实时获取外部程序输出结果的方法
Jan 12 #Python
python实现控制台打印的方法
Jan 12 #Python
python 自定义对象的打印方法
Jan 12 #Python
python设定并获取socket超时时间的方法
Jan 12 #Python
python 限制函数执行时间,自己实现timeout的实例
Jan 12 #Python
You might like
PHPMailer 中文使用说明小结
2010/01/22 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
PHP实现的一致性哈希算法完整实例
2015/11/14 PHP
Web层改进II-用xmlhttp 无声息提交复杂表单
2007/01/22 Javascript
jquery 事件对象属性小结
2010/04/27 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
js实现上传图片及时预览
2016/05/07 Javascript
Jquery ajax请求导出Excel表格的实现代码
2016/06/08 Javascript
jQuery事件处理的特征(事件命名机制)
2016/08/23 Javascript
关于vue.js弹窗组件的知识点总结
2016/09/11 Javascript
webpack+vue.js实现组件化详解
2016/10/12 Javascript
bootstrap实现每隔5秒自动轮播效果
2016/12/20 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
vue.js实例todoList项目
2017/07/07 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
微信小程序自定义导航栏
2018/12/31 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
2019/11/01 Javascript
Vue export import 导入导出的多种方式与区别介绍
2020/02/12 Javascript
Postman无法正常返回结果问题解决
2020/08/28 Javascript
[01:24]DOTA2上海特锦赛OG战队抵达 专车接机入驻总统套房
2016/02/23 DOTA
python简单实现旋转图片的方法
2015/05/30 Python
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
使用python检查yaml配置文件是否符合要求
2020/04/09 Python
Django在Model保存前记录日志实例
2020/05/14 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
html5表单及新增的改良元素详解
2016/06/07 HTML / CSS
有趣的睡衣和礼物:LazyOne
2019/11/27 全球购物
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android