Python数据可视化之用Matplotlib绘制常用图形


Posted in Python onJune 03, 2021

一、散点图

散点图用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联总结坐标点的分布模式
特点:判断变量之间是否存在数量关联趋势,表示离群点的分布规律。

散点图绘制

plt.scatter(x,y) # 以默认的形状颜色绘制散点图

实例: 假设我们获取到了上海2020年5,10月份每天白天的最高气温(分别位于列表a、b),那么此时如何观察气温和随时间变化的某种规律。

# 绘制图形所需的数据
y_5 = [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]

代码如下:

import matplotlib.pyplot as plt

# 设置字体
plt.rcParams['font.sans-serif']=['SimHei'] # 替换sans_serif字体
plt.rcParams['axes.unicode_minus']=False # 解决坐标轴负数的负号显示问题

plt.figure(figsize=(12,5), dpi=100)

y_5 = [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]
x = range(1, 32)

plt.scatter(x, y_5, label='五月份')
plt.scatter(x, y_10, label='十月份')

# 增加标题,坐标描述
plt.xlabel("时间")
plt.ylabel("日期")
plt.title("气温和随时间变化的某种规律")

# 添加图形注释
plt.legend(loc='best')

plt.show()

Python数据可视化之用Matplotlib绘制常用图形

上图虽然绘制出5、10月气温随日期的变化,但两者混在一起,不便于观察,现通过修改x数据,将10月的坐标点集体往坐标轴右侧移动,改进的代码如下:

import matplotlib.pyplot as plt

# 设置字体
plt.rcParams['font.sans-serif']=['SimHei'] # 替换sans_serif字体
plt.rcParams['axes.unicode_minus']=False # 解决坐标轴负数的负号显示问题

plt.figure(figsize=(12,5), dpi=100)

y_5 = [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]
x_5 = range(1, 32)
x_10 = range(33, 64)

plt.scatter(x_5, y_5, label='五月份')
plt.scatter(x_10, y_10, label='十月份')

# 刻度显示
x_t = list(x_4)+list(x_10)
x_l = ["5月{}号".format(i) for i in x_4]
x_l += ["10月{}号".format(i-31) for i in x_10]
plt.xticks(x_t[::3], x_l[::3], rotation=45)

# 添加图形注释
plt.legend(loc='best')

plt.show()

Python数据可视化之用Matplotlib绘制常用图形

二、柱状图

柱状图是用宽度相同的条形的高度或长短来表示数据多少的图形。柱状图可以横置或纵置,纵置时也称为柱形图。

特点

能够直观反映出各个数据的大小;
易于比较数据之间的差别。

柱状图绘制

plt.bar(x, width, align=‘center', **kwargs)

Parameters:    
x : sequence of scalars.

width : scalar or array-like, optional, 柱状图的宽度

align: {‘center', ‘edge'}, optional, default: ‘center'
Alignment of the bars to the x coordinates:
‘center': Center the base on the x positions.
‘edge': Align the left edges of the bars with the x positions.
每个柱状图的位置对齐方式, 默认柱状图的中心与x坐标中心对齐

**kwargs:
color: 选择柱状图的颜色

水平条形图绘制

plt.barh(y, width) # 绘制以y为y轴位置的水平条形图

实例:假设我们获取到了2019年内地电影票房前20的电影(列表a)和电影票房数据(列表b),绘制柱状图直观地展示数据,代码如下:

import matplotlib.pyplot as plt
# 设置字体
plt.rcParams['font.sans-serif']=['SimHei'] # 替换sans_serif字体
plt.rcParams['axes.unicode_minus']=False # 解决坐标轴负数的负号显示问题

plt.figure(figsize=(15,10),dpi=100)
# 准备电影的名字以及电影的票房数据
movie_name = ["流浪地球","复仇者联盟4:终局之战","哪吒之魔童降世","疯狂的外星人",
              "飞驰人生","蜘蛛侠:英雄远征","扫毒2天地对决","烈火英雄","大黄蜂",
              "惊奇队长","比悲伤更悲伤的故事","哥斯拉2:怪兽之王","阿丽塔:战斗天使",
              "银河补习班","狮子王","反贪风暴4","熊出没","大侦探皮卡丘","新喜剧之王",
              "使徒行者2:谍影行动","千与千寻"]
y = [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]
# 放进横坐标的数字列表
x = range(len(movie_name))

# 画出条形图
# 颜色color参数表示条形图的顺序颜色,可循环
plt.bar(x, y, width=0.5, color=['b','r','g','y','c','m','y','k','c','g','g'])

# 修改刻度名称,并旋转90度
plt.xticks(x, movie_name, rotation=90)

# 展示图形
plt.show()

Python数据可视化之用Matplotlib绘制常用图形

# 水平条形图
plt.figure(figsize=(15,10),dpi=100)
plt.barh(movie_name, y, color=['b','r','g','y','c','m','k'])
plt.show()

Python数据可视化之用Matplotlib绘制常用图形

有时候为了公平起见,我们需要对比不同电影首日和首周的票房收入,让数据更有说服力。假设数据如下:

movie_name = ['雷神3:诸神黄昏','正义联盟','寻梦环游记']
first_day = [10587.6,10062.5,1275.7] # 首日票房
first_weekend=[36224.9,34479.6,11830] # 首周票房

绘制不同电影首日和首周票房的数据图,代码如下:

import matplotlib.pyplot as plt
# 设置字体
plt.rcParams['font.sans-serif']=['SimHei'] # 替换sans_serif字体
plt.rcParams['axes.unicode_minus']=False # 解决坐标轴负数的负号显示问题

plt.figure(figsize=(15,10),dpi=100)
# 准备数据
movie_name = ['雷神3:诸神黄昏','正义联盟','寻梦环游记']

# 构造首日票房,首周票房数据
first_day = [10587.6,10062.5,1275.7]
first_weekend=[36224.9,34479.6,11830]
x = range(len(movie_name))

# 绘制第一个柱状图
plt.bar(x, first_day, width=0.25)
# 接着绘制第二个柱状图
plt.bar([i+0.25 for i in x], first_weekend, width=0.25)

# 修改刻度名称
# 显示x轴中文,固定在首日和首周的中间位置
plt.xticks([i+0.125 for i in x], movie_name)

plt.show()

Python数据可视化之用Matplotlib绘制常用图形

注意点

x轴坐标刻度显示位置的调整,既可以通过绘制图形时调整x数据,也可以通过绘制x轴刻度时调整刻度的方法来实现x轴刻度显示在两个柱状图中间。如果不做任何调整,它是默认与第一个柱状图中间对齐的。

三、直方图

直方图,形状类似柱状图却有着与柱状图完全不同的含义。直方图牵涉统计学的概念,首先要对数据进行分组,然后统计每个分组内数据元的数量。 在坐标系中,横轴标出每个组的端点,纵轴表示频数,每个矩形的高代表对应的频数,称这样的统计图为频数分布直方图。

特点:绘制连续性的数据,展示一组或者多组数据的分布情况,用于统计数据分布的特征。

相关概念

组数:在统计数据时,把数据按照不同的范围分成几个组,分成的组的个数称为组数;
组距:每一组两个端点的差。

直方图绘制

plt.hist(x,bins=None)
绘制以x为数值,bins为组数,组数 = 极差/组距

实例:假设我们获取到了一些电影的时长,绘制直方图展示电影时长的分布情况,代码如下:

import matplotlib.pyplot as plt
# 设置字体
plt.rcParams['font.sans-serif']=['SimHei'] # 替换sans_serif字体
plt.rcParams['axes.unicode_minus']=False # 解决坐标轴负数的负号显示问题

plt.figure(figsize=(15,10),dpi=100)
# 准备数据,电影时长
time =[131,  98, 125, 131, 124, 139, 131, 117, 128, 108, 
       135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 
       127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 
       115,  99, 136, 126, 134,  95, 138, 117, 111, 78, 
       132, 124, 113, 150, 110, 117,  86,  95, 144, 105, 
       126, 130,126, 130, 126, 116, 123, 106, 112, 138, 
       123,  86, 101,  99, 136,123, 117, 119, 105, 137, 
       123, 128, 125, 104, 109, 134, 125, 127,105, 120, 
       107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 
       114,105, 115, 132, 145, 119, 121, 112, 139, 125, 
       138, 109, 132, 134,156, 106, 117, 127, 144, 139, 
       139, 119, 140,  83, 110, 102,123,107, 143, 115, 
       136, 118, 139, 123, 112, 118, 125, 109, 119, 133, 
       112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 
       118, 112, 135,115, 146, 137, 116, 103, 144,  83, 
       123, 111, 110, 111, 100, 154,136, 100, 118, 119, 
       133, 134, 106, 129, 126, 110, 111, 109, 141, 120, 
       117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 
       125, 126,114, 140, 103, 130, 141, 117, 106, 114, 
       121, 114, 133, 137,  92,121, 112, 146,  97, 137, 
       105,  98, 117, 112,  81,  97, 139, 113,134, 106, 
       144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 
       110, 105, 129, 137, 112, 120, 113, 133, 112,  83, 
       94, 146, 133, 101, 131, 116, 111, 84, 137, 115, 
       122, 106, 144, 109, 123, 116, 111,111, 133, 150]

# 组距
bins = 2
# 组数,极差/组距
groups = int((max(time) - min(time)) / 2)

# 绘制直方图
plt.hist(time, groups)

# 指定x轴刻度的范围
plt.xticks(list(range(min(time), max(time)))[::2])

# 添加坐标描述
plt.xlabel('电影时长大小')
plt.ylabel('电影的数量')

# 增加网格显示
plt.grid(True, linestyle='--', alpha=0.5)
plt.show()

Python数据可视化之用Matplotlib绘制常用图形

四、扇形图

扇形图,用整个圆表示总数,用圆内各个扇形的大小表示各部分数量占总数的百分数。

扇形图绘制

plt.pie(x, explode=None, labels=None)

x:扇形数据
explode:设置某几个分块是否要分离饼图
labels:每块扇形标签
autopct:百分比数据标签
shadow:是否显示阴影
plt.pie()有3个返回值:
patches:绘制饼图每一块的对象
texts:文本的列表
autotexts:百分比的文本列表

实例:假设我们获取到了一些电影的排片数据,绘制扇形图展示电影的排片占比情况,代码如下:

import matplotlib.pyplot as plt
# 设置字体
plt.rcParams['font.sans-serif']=['SimHei'] # 替换sans_serif字体
plt.rcParams['axes.unicode_minus']=False # 解决坐标轴负数的负号显示问题

# 饼图绘制
plt.figure(figsize=(15, 10), dpi=100)
# 电影排片数据
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽','其它']
place_count = [60605,54546,45819,28243,13270,9945,7679,6799,6101,4621,20105]

# 绘制扇形图
plt.pie(place_count, labels=movie_name, autopct="%1.2f%%")

# 指定显示的pie是正圆
plt.axis('equal')

# 设置图例和标题
plt.legend(loc="best")
plt.title("排片占比情况")

plt.show()

Python数据可视化之用Matplotlib绘制常用图形

扇形图优化的手段添加阴影,分离特定数据等:

import matplotlib.pyplot as plt
# 设置字体
plt.rcParams['font.sans-serif']=['SimHei'] # 替换sans_serif字体
plt.rcParams['axes.unicode_minus']=False # 解决坐标轴负数的负号显示问题

plt.figure(figsize=(15, 10), dpi=100)
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽','其它']
place_count = [60605,54546,45819,28243,13270,9945,7679,6799,6101,4621,20105]

# 绘制扇形图,添加阴影效果,并让占比最大的雷神3分离
explode = [0.1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
res = plt.pie(place_count, labels=movie_name, explode=explode, autopct="%1.2f%%", shadow=True)
patches, texts, autotexts = res
print(patches)  # 表示每个扇形的对象
print(texts)  # 每个文本对象
print(autotexts)  # 每个百分比对象

# 指定显示的pie是正圆
plt.axis('equal')

# 设置图例和标题
plt.legend(loc="best")
plt.title("排片占比情况")

plt.show()

打印的扇形图返回值:

Python数据可视化之用Matplotlib绘制常用图形

优化后的扇形图:

Python数据可视化之用Matplotlib绘制常用图形

总结

本文讲述了使用Matplotlib绘制散点图、柱状图、直方图、扇形图的基本操作。

到此这篇关于Python数据可视化之用Matplotlib绘制常用图形的文章就介绍到这了,更多相关Matplotlib绘制图形内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python解析html开发库pyquery使用方法
Feb 07 Python
Python的re模块正则表达式操作
May 25 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
python 字典修改键(key)的几种方法
Aug 10 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
Oct 18 Python
python算法题 链表反转详解
Jul 02 Python
pytorch自定义二值化网络层方式
Jan 07 Python
基于python实现计算且附带进度条代码实例
Mar 31 Python
virtualenv介绍及简明教程
Jun 23 Python
flask开启多线程的具体方法
Aug 02 Python
python必学知识之文件操作(建议收藏)
May 30 Python
Python Numpy库的超详细教程
Apr 06 Python
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 #Python
详解Python生成器和基于生成器的协程
实例讲解Python中sys.argv[]的用法
Jun 03 #Python
Django与数据库交互的实现
Jun 03 #Python
Python代码风格与编程习惯重要吗?
Jun 03 #Python
python 经纬度求两点距离、三点面积操作
Jun 03 #Python
如何使用PyCharm及常用配置详解
You might like
PHP4中实现动态代理
2006/10/09 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
php字符串按照单词进行反转的方法
2015/03/14 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
jquery 上下滚动广告
2009/06/17 Javascript
javascript 文章截取部分无损html显示实现代码
2010/05/04 Javascript
js通过元素class名字获取元素集合的具体实现
2014/01/06 Javascript
js分页工具实例
2015/01/28 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
2016/03/05 Javascript
Web Uploader文件上传插件使用详解
2016/05/10 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
微信小程序联网请求的轮播图
2017/07/07 Javascript
vue组件实现文字居中对齐的方法
2017/08/23 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
2018/09/27 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
2019/09/19 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
在Python中使用lambda高效操作列表的教程
2015/04/24 Python
Python数据分析之双色球中蓝红球分析统计示例
2018/02/03 Python
解析python的局部变量和全局变量
2019/08/15 Python
关于Python中的向量相加和numpy中的向量相加效率对比
2019/08/26 Python
tensorflow 重置/清除计算图的实现
2020/01/19 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
Python代码中如何读取键盘录入的值
2020/05/27 Python
css3动画过渡实现鼠标跟随导航效果
2018/02/08 HTML / CSS
css3隔行变换色实现示例
2014/02/19 HTML / CSS
西班牙用户之间买卖视频游戏的平台:Wakkap
2020/03/21 全球购物
电子商务专员岗位职责
2013/12/11 职场文书
安全生产汇报材料
2014/02/17 职场文书
五好关工委申报材料
2014/05/31 职场文书
爱祖国爱家乡演讲稿
2014/09/02 职场文书
院党委组织查摆问题对照检查材料思想汇报2014
2014/10/08 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
法律意见书范文
2015/06/04 职场文书
生命的关键成分来自太空?陨石说是的
2022/04/29 数码科技