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中内置的日志模块logging用法详解
Jul 12 Python
Django使用详解:ORM 的反向查找(related_name)
May 30 Python
总结python中pass的作用
Feb 27 Python
简单了解python PEP的一些知识
Jul 13 Python
Python DataFrame一列拆成多列以及一行拆成多行
Aug 06 Python
python sorted方法和列表使用解析
Nov 18 Python
Python函数的默认参数设计示例详解
Dec 01 Python
Python解释器以及PyCharm的安装教程图文详解
Feb 26 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
Jul 03 Python
用python 绘制茎叶图和复合饼图
Feb 26 Python
使用numpy nonzero 找出非0元素
May 14 Python
python基础之类属性和实例属性
Oct 24 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代码
2010/07/17 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
php查询操作实现投票功能
2016/05/09 PHP
php中array_unshift()修改数组key注意事项分析
2016/05/16 PHP
PHP数组访问常用方法解析
2020/09/05 PHP
轻量级 JS ToolTip提示效果
2010/07/20 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
2014/05/12 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
JavaScript子窗口调用父窗口变量和函数的方法
2015/10/09 Javascript
JS DOM实现鼠标滑动图片效果
2020/09/17 Javascript
Bootstrap模态对话框的简单使用
2016/04/29 Javascript
javascript简单写的判断电话号码实例
2017/05/24 Javascript
详解vue父子组件间传值(props)
2017/06/29 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
angular 服务随记小结
2019/05/06 Javascript
js设计模式之代理模式及订阅发布模式实例详解
2019/08/15 Javascript
vuex实现像调用模板方法一样调用Mutations方法
2019/11/06 Javascript
python将多个文本文件合并为一个文本的代码(便于搜索)
2011/03/13 Python
Python语法快速入门指南
2015/10/12 Python
简单了解Python中的几种函数
2017/11/03 Python
让Python更加充分的使用Sqlite3
2017/12/11 Python
python Dijkstra算法实现最短路径问题的方法
2019/09/19 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
2020/04/08 Python
python 无损批量压缩图片(支持保留图片信息)的示例
2020/09/22 Python
物流管理专业应届生求职信
2013/11/21 职场文书
搞笑婚礼主持词
2014/03/13 职场文书
房地产活动策划方案
2014/05/14 职场文书
个人安全生产承诺书
2014/05/22 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
介绍信怎么写
2015/05/05 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
银行求职信怎么写
2019/06/20 职场文书
诚信高考倡议书
2019/06/24 职场文书