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类参数self使用示例
Feb 17 Python
python实现堆栈与队列的方法
Jan 15 Python
在Python中使用判断语句和循环的教程
Apr 25 Python
如何使用python爬取csdn博客访问量
Feb 14 Python
Python 内置函数complex详解
Oct 23 Python
Python开发微信公众平台的方法详解【基于weixin-knife】
Jul 08 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
Jun 18 Python
Python 获取windows桌面路径的5种方法小结
Jul 15 Python
python字符串的拼接方法总结
Nov 18 Python
使用Python实现批量ping操作方法
May 06 Python
Python3爬虫mitmproxy的安装步骤
Jul 29 Python
python 检测图片是否有马赛克
Dec 01 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编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
2014/01/17 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
php根据生日计算年龄的方法
2015/07/13 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
2011/07/04 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
Angular用来控制元素的展示与否的原生指令介绍
2015/01/07 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
Bootstrap前端开发案例二
2016/06/17 Javascript
js在ie下打开对话窗口的方法小结
2016/10/24 Javascript
mui上拉加载功能实例详解
2017/04/13 Javascript
微信小程序 登录的简单实现
2017/04/19 Javascript
JavaScript纯色二维码变成彩色二维码
2020/07/23 Javascript
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
在Python中使用全局日志时需要注意的问题
2015/05/06 Python
用Python遍历C盘dll文件的方法
2015/05/06 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
2017/07/24 Python
Django+Ajax+jQuery实现网页动态更新的实例
2018/05/28 Python
python对离散变量的one-hot编码方法
2018/07/11 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
python pandas库的安装和创建
2019/01/10 Python
VScode连接远程服务器上的jupyter notebook的实现
2020/04/23 Python
opencv 图像滤波(均值,方框,高斯,中值)
2020/07/08 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
Python eval函数原理及用法解析
2020/11/14 Python
Python学习之time模块的基本使用
2021/01/17 Python
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
出国留学介绍信
2014/01/13 职场文书
交通安全责任书范本
2014/07/24 职场文书
公司员工活动策划方案
2014/08/20 职场文书
贵阳市党的群众路线教育实践活动党(工)委领导班子整改方案
2014/10/26 职场文书
个人工作违纪检讨书
2015/05/05 职场文书