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标准库之随机数 (math包、random包)介绍
Nov 25 Python
python实现协同过滤推荐算法完整代码示例
Dec 15 Python
Python实现账号密码输错三次即锁定功能简单示例
Mar 29 Python
浅谈Python编程中3个常用的数据结构和算法
Apr 30 Python
Python异步编程之协程任务的调度操作实例分析
Feb 01 Python
Python Tornado之跨域请求与Options请求方式
Mar 28 Python
在spyder IPython console中,运行代码加入参数的实例
Apr 20 Python
在django中form的label和verbose name的区别说明
May 20 Python
Python使用socketServer包搭建简易服务器过程详解
Jun 12 Python
python设置中文界面实例方法
Oct 27 Python
python如何查找列表中元素的位置
May 30 Python
Python+pyaudio实现音频控制示例详解
Jul 23 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
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
以文件形式缓存php变量的方法
2015/06/26 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
使用phpQuery获取数组的实例
2017/03/13 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
用js实现手把手教你月入万刀(转贴)
2007/11/07 Javascript
Jquery iframe内部出滚动条
2010/02/11 Javascript
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
js关闭父窗口时关闭子窗口
2013/04/01 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
2014/01/09 Javascript
innerText 使用示例
2014/01/23 Javascript
jquery中show()、hide()和toggle()用法实例
2015/01/15 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
Vuex 进阶之模块化组织详解
2018/01/12 Javascript
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
如何用Python实现简单的Markdown转换器
2018/07/16 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
Python将string转换到float的实例方法
2019/07/29 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
python主要用于哪些方向
2020/07/05 Python
详解CSS3中使用gradient实现渐变效果的方法
2015/08/18 HTML / CSS
H5 canvas实现贪吃蛇小游戏
2017/07/28 HTML / CSS
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
工作人员思想汇报
2014/01/09 职场文书
财务主管自我鉴定
2014/01/17 职场文书
大学生两会学习心得体会
2014/03/10 职场文书
要账委托书范本
2014/09/15 职场文书
监理中标通知书
2015/04/16 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL
Oracle中update和select 关联操作
2022/01/18 Oracle