matplotlib 模块
matplotlib 库的介绍
线形图
import matplotlib.pyplot as plt# 时间 x = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] # 销量 y = [61, 42, 52, 72, 86, 91, 73] # 设置字体,解决中文乱码问题,指定中文黑体字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 确保-负号显示正常 plt.rcParams['axes.unicode_minus'] = False plt.plot(x, y) plt.show()
上面是某商品一周的销量走势。x 轴传入时间,y 轴传入对应的销量,应该不难理解。因为图中有中文,所以需要通过
plt.rcParams['font.sans-serif'] = ['SimHei']
来设置中文字体,否则中文将会乱码。plt.figure() # 新建图形,空白背景
加图例很简单,只要在调用
plt.plot()
方法时传入label
参数,接着调用plt.legend()
方法显示图例即可。x = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] y1 = [61, 42, 52, 72, 86, 91, 73] y2 = [23, 26, 67, 38, 46, 55, 33] # 传入 label 参数 plt.plot(x, y1, label='商品 A') plt.plot(x, y2, label='商品 B') # 显示图例 plt.legend() plt.show()
设置线条形式
以
'ro--'
为例,它分为 3 部分:r
代表红色(red),o
代表的是圆点标记,--
代表着虚线。ro--
的意思就是线条为红色虚线、坐标点标记为圆点。格式化参数的这 3 部分都是可选的,也没有顺序要求。你可以只传入一个
'r'
来指定颜色,也可以写成--or
。格式化参数的每部分都有很多选项,因此能形成很多组合,下图列出了格式化参数常用的选项及其含义:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TmVuUH7J-1669814010701)(E:\python 听课笔记\图片\折线图的 线条.jpg)]
小贴士:后面示例代码将省略设置字体这行代码,只保留关键代码。遇到中文乱码问题,记得设置中文字体即可
plt.legend()
用于给图像加图例。图例被放在了图表的左上方,图例位置其实是可以设置的,不设置的情况下 matplotlib 会帮你自动找一个合适的位置放置。
图例是集中于地图一角或一侧的地图上各种符号和颜色所代表内容与指标的说明,有助于更好的认识地图。
如果想自行选择图例位置的话可以通过
plt.legend()
方法的loc
参数实现,loc
参数共有如下 11 种方式可供选择:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KpAw4UTh-1669814010702)(E:\python 听课笔记\图片\plt作图 线标位置放置.jpg)]
我们还可以通过
plt.xlabel()
和plt.ylabel()
方法来设置 x 轴和 y 轴的标签,还能通过plt.title()
给图表设置标题。我们来看一下具体用法:x = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] y1 = [61, 42, 52, 72, 86, 91, 73] y2 = [23, 26, 67, 38, 46, 55, 33] plt.plot(x, y1, label='商品 A') plt.plot(x, y2, label='商品 B') # 设置 x 轴标签 plt.xlabel('时间') # 设置 y 轴标签 plt.ylabel('销量') # 设置图表标题 plt.title('商品销量对比图') plt.legend() plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-94pam4jA-1669814010703)(E:\python 听课笔记\图片\plt 例图.png)]
设置坐标刻度
调用xticks函数和ytickes函数就可以设置折线图的坐标轴了。中间的列表就是设置各个坐标轴上有几个点,且每个点的值是多少。中间数据的多少和取值多少随意,看自己的需要。
# 设置横纵坐标plt.xticks([0, 2, 4, 6, 8, 10, 12])plt.yticks([0, 5, 10, 15, 20, 25])# 再柱状图中存在的特殊用法 # 可以将 刻度 改为 自定义内容 # 例 x = np.arange(3) names = ['篮球', '羽毛球', '乒乓球'] plt.xticks(x, names)
增加背景表格
plt.grid() # 添加辅助线网络
调整显示范围
plt.xlim(2.5, 4.5)plt.ylim(1.5, 6.5)# plt.xlim() 显示的是x轴的作图范围 # b但是如果图片已经画好了,plt.xlim在图片完成之后,则会直接输出x轴的范围值
绘制柱状图
普通柱状图的画法很简单,调用
plt.bar()
方法即可。我们需要传入两个参数,第一个参数是 x 轴上刻度的标签序列(列表、元组、数组等),第二个参数则用于指定每个柱子的高度,也就是具体的数据。我们来看一个例子,下面代码画出了编程一班体育课选课的情况的柱状图:
names = ['篮球', '羽毛球', '乒乓球'] nums = [26, 20, 19]plt.bar(names, nums) plt.show()
将图表和代码结合起来看,你应该就明白了
plt.bar()
前两个必选参数的作用。plt.bar()
还有一些可选参数,常用的有width
和color
,分别用于设置柱子的宽度(默认 0.8)和颜色。比如我们可以将柱子宽度调小到 0.6,将柱子的颜色设成好看的天蓝色。
names = ['篮球', '羽毛球', '乒乓球'] nums = [26, 20, 19]plt.bar(names, nums, width=0.6, color='skyblue') plt.show()
其实,我们学过的
plt.xlabel()
、plt.ylabel()
、plt.title()
和plt.legend()
方法都是通用方法,并不只限制于一种图表,所有的图表类型都支持这些方法。这里就不再重复演示,你可以在后面的练习中动手试试。
堆叠柱状图
柱状图能直观地展现出不同分类数据上的差异,但有时候我们想更进一步地分析每个分类数据的分布,比如每门选修课的男女比例,这时就需要用到堆叠柱状图。
总体和前面画的柱状图是一样的,只是每个柱子被分成了多块。
堆叠柱状图不仅可以展示每一个分类的总量,还能展示该分类包含的每个小分类的大小及占比,因此非常适合处理部分与整体的关系。
与饼图显示单个部分到整体的关系不同的是,堆叠柱状图可以显示多个部分到整体的关系。例如编程一班选课的各项目人数统计,你可以用柱状图或饼图来展示。
但是,当需要进一步区分男生和女生参与到不同项目中的人数分别是多少时,就需要把每个项目中包含的男生数和女生数都展示出来。如图选用堆叠柱状图,不仅能显示每个项目的总人数,还能展示出每个项目中的一部分与整体的关系。
names = ['篮球', '羽毛球', '乒乓球'] nums_boy = [16, 5, 11] nums_girl = [10, 15, 8]plt.bar(names, nums_boy, width=0.6, color='skyblue', label='男') plt.bar(names, nums_girl, bottom=nums_boy, width=0.6, color='pink', label='女') plt.legend() plt.show()
上面的代码和之前相比,多调用了一次
plt.bar()
方法,并传入了bottom
参数。每调用一次plt.bar()
方法就会画出对应的柱状图,而bottom
参数作用就是控制柱状图低端的位置。我们将前一个柱状图的高度传进去,这样就形成了堆叠柱状图。而如果我们没有设置
bottom
参数,后面的图形会盖在原来的图形之上,就像下面这样:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Olsk1PM6-1669814010704)(E:\python 听课笔记\图片\bar() buttom.jpg)]
分组柱状图
分组柱状图分组柱状图经常用于不同组间数据的比较,这些组都包含了相同分类的数据。我们还是先来看一下最终绘制的图表长什么样,这有助于你对代码的理解。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nuOkQMNz-1669814010705)(E:\python 听课笔记\图片\分组柱状图.jpg)]
# 代码绘制 x = np.arange(3) width = 0.3 names = ['篮球', '羽毛球', '乒乓球'] nums_boy = [16, 5, 11] nums_girl = [10, 15, 8] plt.bar(x - width / 2, nums_boy, width=width, color='skyblue', label='男') plt.bar(x + width / 2, nums_girl, width=width, color='pink', label='女')plt.xticks(x, names) plt.legend() plt.show()# 这次的方法和之前略有不同, # 首先使用 np.arange(3) 方法创建了一个数组 x,值为 [0 1 2]。 # 并定义了一个变量 width 用于指定柱子的宽度。 # 在调用 plt.bar() 时,第一个参数不再是刻度上的标签,而是对应的刻度。以 [0 1 2] 为基准,分别加上和减去柱子的宽度得到 [-0.15 0.85 1.85] 和 [0.15 1.15 2.15],这些刻度将分别作为两组柱子的中点,并且柱子的宽度为 0.3。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qhqj173b-1669814010706)(E:\python 听课笔记\图片\分组柱状地标表示.jpg)]
因为传入的是刻度,而不是刻度的标签。因此,我们还要调用
plt.xticks()
方法来将 x 轴上刻度改成对应的标签。该方法的第一个参数是要更改的刻度序列,第二个参数是与之对应的标签序列。同理,还可以用
plt.yticks()
方法来更改 y 轴上刻度的标签,这里就不再演示了。
练习:表示一年的降水情况
# 下面是某地 2019 年一年中蒸发量和降水量的数据(单位毫米),请你选择合适的图表来对比每个月的蒸发量和降水量,并将其画出来
import numpy as np
import matplotlib.pyplot as pltplt.rcParams['font.family'] = ['Noto Sans CJK JP']times = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
# 蒸发量
data1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3]
# 降水量
data2 = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3]x = np.arange(12)
width = 0.2plt.bar(x-width/2, data1, width=width, color='skyblue', label='蒸发量')
plt.bar(x+width/2, data2, width=width, color='pink', label='降水量')plt.xticks(x, times)
plt.title('每月的蒸发与降水量')
plt.legend()
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IgYfYniH-1669814010707)(E:\python 听课笔记\图片\蒸发与降水.png)]
饼图
饼图广泛地应用在各个领域,用于表示不同分类的占比情况,通过弧度大小来对比各种分类。饼图通过将一个圆饼按照分类的占比划分成多个区块,整个圆饼代表数据的总量,每个区块(圆弧)表示该分类占总体的比例大小,所有区块(圆弧)的加和等于 100%。
饼图的画法很简单,只要传入数据和对应的标签给
plt.pie()
方法即可。但为了让饼图更加直观清晰,需要了解一些额外的参数。以 2018 年国内生产总值(GDP)三大产业的占比为例,可以画出这样的饼图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O9vPcNFt-1669814010707)(E:\python 听课笔记\图片\饼图.jpg)]
data = [64745.2, 364835.2, 489700.8] labels = ['第一产业', '第二产业', '第三产业']plt.pie(data, labels=labels, autopct='%0.1f%%') plt.show()
我来给你解释一下
plt.pie()
方法每个参数的作用:第一个参数是绘图需要的数据;参数labels
指定了数据对应的标签;参数autopct
则给饼图自动添加百分比显示。这里详细说一下
autopct
参数的格式,这里用到了字符串格式化输出的知识。上述代码中'%0.1f%%'
可以分为两部分,一部分是%0.1f
表示保留一位小数,同理%0.2f
表示保留两位小数。另一部分是
%%
,其实它就表示输出一个%
,因为%
还字符串格式化输出中有特殊的含义,所以想要输出%
就得写成%%
。所以,'%0.1f%%'
的含义是保留一位小数的百分数,例如:53.3%。
强调数据
特殊的表示:我们还能通过
explode
参数来让饼图中的某一部分突出显示,来强调某项数据。data = [64745.2, 364835.2, 489700.8] labels = ['第一产业', '第二产业', '第三产业'] explode = (0.1, 0, 0)plt.pie(data, explode=explode, labels=labels, autopct='%0.1f%%') plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Y5xBTbl-1669814010708)(E:\python 听课笔记\图片\exploded 突出显示.jpg)]
默认
explode
参数里的元素都是 0,我们将需要突出显示的部分对应位置的值设大一点,就能将对应的区块抽离出来突出显示。这个数值越大,抽离的效果就越明显。例图:表示文化程度
'''根据第六次全国人口普查显示,15 岁及以上人口文化程度如下:没上过学:59428036 人 小学:263535521 人 初中:484750032 人 高中:185402141 人 大学专科:68608795 人 大学本科:45625173 人 研究生:4138550 人 请将这些数据用饼图展示出来,并突出显示初中的数据。'''import matplotlib.pyplot as pltplt.rcParams['font.family'] = ['Noto Sans CJK JP']data = [59428036, 263535521, 484750032, 185402141, 68608795, 45625173, 4138550] labels = ['没上过学', '小学', '初中', '高中', '大学专科', '大学本科', '研究生']explode = (0,0,0.1,0,0,0,0)plt.pie(data,explode = explode, labels = labels, autopct = '%0.1f%%')plt.show()
子图绘制
绘制子图:到目前我们学到的都是绘制一张图表的方法。但是一张图表很难同时分析多个维度,我们需要把多张图绘制在一起,进行多个维度的查看比较。
Matplotlib 提供了子图的概念,通过使用子图,你可以在一张图里绘制多个图表。
在 matplotlib 中,我们可以调用
plt.subplot()
方法来添加子图。plt.subplot()
方法的前两个参数分别是子图的行数和列数,第三个参数是子图的序号(从 1 开始)。我给你举个例子你就明白了:ax1 = plt.subplot(2, 2, 1) ax2 = plt.subplot(2, 2, 2) ax3 = plt.subplot(2, 2, 3) ax4 = plt.subplot(2, 2, 4)
plt.subplot(2, 2, 1)
的作用是生成一个两行两列的子图,并选择其中序号为 1 的子图。所以上面的代码将一张图表分成了 4 个子图,并用 1、2、3、4 来选择对应位置的子图。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vQPqIOPX-1669814010708)(E:\python 听课笔记\图片\子图.jpg)]
我们也可以不规则的子图,比如上面两张子图,下面一张子图。方法如下:
ax1 = plt.subplot(2, 2, 1) ax2 = plt.subplot(2, 2, 2) ax3 = plt.subplot(2, 1, 2)
前两个子图的创建你能明白,第三个子图的创建你可能就不太懂了,为什么是
plt.subplot(2, 1, 2)
呢?因为子图序号是独立的,与前面的创建的子图没有关系。
plt.subplot(2, 2, 1)
选择并展示了 22 的子图中的第一个,plt.subplot(2, 2, 2)
选择并展示了 22 子图中的第二个,它俩合起来占了 2*2 的子图的第一行。而
plt.subplot(2, 1, 2)
则是将生成了两行一列的子图,并选择了第二个。即占满第二行的子图,正好填补了之前 2*2 的子图剩下来的空间。因此生成的图表是这样的:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qbAuGuif-1669814010709)(E:\python 听课笔记\图片\特殊子图.jpg)]
图表的框架画好了,我们还要往里面绘图。方法很简单,之前调用的是
plt
上的方法绘图,只要将其改成在plt.subplot()
方法的返回值上调用相应的方法绘图即可。举个例子,下面代码在一张图上绘制了 sin、cos 和 tan 三个函数的图像。x = np.arange(0, 2 * np.pi, 0.1)# 子图 1 ax1 = plt.subplot(2, 2, 1) y1 = np.sin(x) ax1.plot(x, y1)# 子图 2 ax2 = plt.subplot(2, 2, 2) y2 = np.cos(x) ax2.plot(x, y2)# 子图 3 ax3 = plt.subplot(2, 1, 2) y3 = np.tan(x) ax3.plot(x, y3)plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tRGnvHr6-1669814010709)(E:\python 听课笔记\图片\表示子图.jpg)]
最后,我们还能使用
set_title()
来为每个子图设置单独的标题。需要注意的是,如果想要给带有子图的图表设置总的标题的话,不是使用plt.title()
方法,而是通过plt.suptitle()
方法来设置带有子图的图表标题。最后,我们还能使用
set_title()
来为每个子图设置单独的标题。需要注意的是,如果想要给带有子图的图表设置总的标题的话,不是使用plt.title()
方法,而是通过plt.suptitle()
方法来设置带有子图的图表标题。plt.suptitle('带有子图的图表标题') # 总标题ax1 = plt.subplot(2, 2, 1) ax1.set_title('子图标题')
三角子图
现在你来绘制三个三角函数的图像,然后分别设置其标题为 sin 函数、cos 函数、tan 函数,并将整个图表的标题设置为三角函数可视化。最终效果如下:
import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.family'] = ['Noto Sans CJK JP'] plt.suptitle('三角函数的图像可视化') x = np.arange(0, 2 * np.pi, 0.1)ax1 = plt.subplot(2,2,1) y = np.sin(x) ax1.plot(x, y) ax1.set_title('sin 函数')ax2 = plt.subplot(2,2,2) y = np.cos(x) ax2.plot(x, y) ax2.set_title('cos 函数')ax3 = plt.subplot(2, 1, 2) y = np.tan(x) ax3.plot(x, y) ax3.set_title('tan 函数')plt.show()
标签不显示?
解决图像标签重叠或边界不显示情况
方法:
plt.tight_layout()
matplotlib 模块相关推荐
- 能带曲线图绘制python_如何使用python的matplotlib模块画折线图
python是个很有趣的语言,可以在cmd命令窗口运行,还有很多的功能强大的模块.这篇经验告诉你,如何利用python的matplotlib模块画图. 工具/原料 windows系统电脑一台 pyth ...
- 掷骰子python代码_Python 使用matplotlib模块模拟掷骰子
掷骰子 骰子类 # die.py 骰子类模块 from random import randint class Die(): """骰子类""&quo ...
- python画抛物线_如何使用python的matplotlib模块画抛物线
1 第一步,点击键盘 win+r,打开运行窗口:在窗口中输入"cmd",点击确定,打开windows命令行窗口. 2 第二步,在cmd命令行窗口中输入"python&qu ...
- python matplotlib模块画出的图像转换为.tiff格式
利用python matplotlib模块(python3.7.1)画出的图表暂不支持直接导出.tiff格式的图片,但是可以导出eps, pdf, pgf, png, ps, raw, rgba, s ...
- windows 命令行cmd安装python matplotlib模块后pycharm显示“ModuleNotFoundError: No module named ‘matplotlib‘解决方法
问题描述: 通过cmd查看已安装的python模块: 显示已经安装了matplotlib模块,但在pycharm中导入该模块时提示: 解决方法: 发生这种问题的原因是pycharm当前项目所使用的解释 ...
- python怎么安装matplotlib-为python安装matplotlib模块
matplotlib是python中强大的画图模块. 首先确保已经安装python,然后用pip来安装matplotlib模块. 进入到cmd窗口下,执行python -m pip install - ...
- linux系统python截图不显示中文_Linux运维知识之解决linux系统下python中的matplotlib模块内的pyplot输出图片不能显示中文的问题...
本文主要向大家介绍了Linux运维知识之解决linux系统下python中的matplotlib模块内的pyplot输出图片不能显示中文的问题,通过具体的内容向大家展现,希望对大家学习Linux运维知 ...
- Module 'matplotlib' has no 'contourf' member 使用Python导入matplotlib模块报错
错误提示 使用Python编译画图时提示Module 'matplotlib' has no 'contourf' member 原因分析 导入matplotlib模块错误 matplotlib为程序 ...
- python中matplotlib条形图数值大的在最底层显示_如何使用python的matplotlib模块绘制水平条形图...
python是一个很有趣的语言,可以在命令行窗口运行.python中有很多功能强大的模块,这篇经验告诉你,如何利用python的matplotlib模块,绘制水平条形图. 工具/原料 windows系 ...
- 基于 Python Matplotlib 模块的高质量图形输出
1 关于 Matplotlib 模块 Matplotlib 是一个由 John Hunter 等开发的,用以绘制二维图形的 Python 模块.它利用了 Python 下的数值计算模块 Numeric ...
最新文章
- 模板资源管理器的使用
- CVPR 2021|可操控的GAN——Hijack-GAN
- MySQL 基本查询、条件查询、投影查询
- (2)JavaScript书写语法
- error LNK2019: unresolve d external symbol _DriverEntry@8 referenced in function _GsDriverEntry@8
- R语言信用评分卡:探索性数据分析
- 使用Docker镜像部署Coupons淘宝客项目
- Linux:红帽操作系统介绍
- MultiDock——专门为 macOS 设计的增强型 Dock
- 1534 棋子游戏(博弈论)
- iphone8位置无法连接服务器,iphone8无法连接App Store怎么办?沈阳苹果维修点教你轻松解决!...
- VS Code报错:Java 11 or more recent is required to run. Please download and install a recent JDK
- 程序员编程规范之注释
- Codesys使用电子凸轮实现追剪功能
- 用c++写一个简单的钓鱼(集卡)程序
- FI---FI tables的结构和关系总览图
- 论文结尾标注的引用的参考文献批量导入Endnote
- Latex CJK,tex使用中文
- javaweb中404,资源无法访问或找不到问题的解决办法——终结篇
- php网页地图上自定义,网页嵌入百度地图和使用百度地图api自定义地图的详细步骤...