前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python学习笔记之Matplotlib模块入门(直线图、折线图、曲线图、散点图、柱状图、饼状图、直方图、等高线图和三维图的绘制)

Python学习笔记之Matplotlib模块入门(直线图、折线图、曲线图、散点图、柱状图、饼状图、直方图、等高线图和三维图的绘制)

作者头像
用户11062259
发布2024-04-10 14:44:14
8090
发布2024-04-10 14:44:14
举报
文章被收录于专栏:C语言基础C语言基础

一、Matplotlib简介

1. 什么是Matplotlib

Matplotlib 是一个Python的 2D绘图库。通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。 通过学习Matplotlib,可让数据可视化,更直观的真实给用户。使数据更加客观、更具有说服力。 Matplotlib是Python的库,又是开发中常用的库。

2. Matplotlib的安装
  1. Windows 系统安装 Matplotlib,执行如下命令:

  • pip install matplotlib

换源安装执行命令:

  • pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib

二、绘制基础

在使用Matplotlib绘制图形时,其中有两个最为常用的场景。一个是画点,一个是画线。pyplot基本方法的使用如下表。

1. 绘制直线

在使用Matplotlib绘制线性图时,其中最简单的是绘制线图。在下面的实例代码中,使用Matplotlib绘制了一个简单的直线。具体实现过程如下:

  • 导入模块pyplot,并给它指定别名plt,以免反复输入pyplot。在模块pyplot中包含很多用于生产图表的函数。
  • 将绘制的直线坐标传递给函数plot()。
  • 通过函数plt.show()打开Matplotlib查看器,显示绘制的图形。

【示例】根据两点绘制一条线

代码语言:javascript
复制
# 导入matplotlib模块
import matplotlib.pyplot as plt

# 准备要绘制点的坐标(1, 2) (4, 8)
# 调用绘制plot方法
plt.plot([1, 4], [2, 8])  # 第一个中括号里是绘制点的横坐标,第二个为绘制点的纵坐标
# 显示绘制的图
plt.show()

注意:在运行以上代码是可能会出现以下类似的报错:

这个错误是因为你的Matplotlib使用了一个名为backend_interagg的后端,但该后端没有FigureCanvas属性。可以尝试更改Matplotlib的后端配置。 例如在代码的开头添加以下代码来更改Matplotlib的后端为默认的TkAgg后端:

代码语言:javascript
复制
import matplotlib
matplotlib.use('TkAgg')

运行效果如下:

2. 绘制折线图

在上述的实例代码中,使用两个坐标绘制一条直线,接下来使用平方数序列1、9、25、49和81来绘制一个折线图。 【示例】绘制折线图

代码语言:javascript
复制
# 导入matplotlib模块
import matplotlib.pyplot as plt

# 准备绘制点的坐标
x = [1, 3, 5, 7, 9]  # 绘制点的横坐标
y = [1, 9, 25, 49, 81]  # 绘制点的纵坐标
# 调用绘制plot方法
plt.plot(x, y)
# 显示绘制的图
plt.show()

运行效果如下:

3. 设置样式

【示例】绘制折线图并设置样式

代码语言:javascript
复制
# 导入matplotlib模块
import matplotlib.pyplot as plt

# 准备绘制点坐标
x = [1, 2, 3, 4, 5]
y = [1, 8, 27, 64, 125]
# 调用绘制plot方法
# 利用linewidth属性设置线条的宽度
plt.plot(x, y, linewidth=5)
# 添加x,y轴名称
plt.xlabel('x', fontsize=14)  # fontsize: 设置字体大小
plt.ylabel('x^3', fontsize=14)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签,字体可自由设置电脑中自带的字体
# 给图标添加标题
plt.title('折线绘制图', fontsize=24)
# 显示绘制的图
plt.show()

运行效果如下:

Matplotlib 默认情况不支持中文,我们可以使用以下简单的方法来解决:

代码语言:javascript
复制
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
4. 绘制曲线图

【示例】绘制一元二次方程的曲线y=x^2 这里我们先遍历-100到100之间的整数,然后利用列表推导式求出他们的平方值

代码语言:javascript
复制
# 导入matplotlib模块
import matplotlib.pyplot as plt

# 准备绘制点坐标
x = range(-100, 100)  # range函数用于生成一个整数序列,这里用于生成-100到100的整数
y = [i ** 2 for i in x]  # 列表推导式生成了一个包含-100到100的平方的列表
# 调用绘制plot方法
plt.plot(x, y)
# 保存图片
# plt.savefig('一元二次方程曲线图')  # 默认图片格式为png
plt.savefig('一元二次方程曲线图.jpg')  # 设置图片格式
# 显示绘制的图
plt.show()

运行效果如下:

【示例】绘制正弦曲线和余弦曲线 使用plt函数绘制任何曲线的第一步都是生成若干个坐标点(x,y),坐标点越多越好。取0到10之间100个等差数作为x的坐标,然后将这100个x坐标值一起传入Numpy的sin和cos函数,就会得到100个y坐标值,最后就可以使用plot函数绘制正弦曲线和余弦曲线。

代码语言:javascript
复制
# 导入matplotlib和numpy模块
import matplotlib.pyplot as plt
import numpy as np

# 生成0-10之间100个等差数列
x = np.linspace(0, 10, 100)
sin_y = np.sin(x)  # sin函数用于计算给定角度的正弦值
cos_y = np.cos(x)  # cos函数用于计算给定角度的余弦值
# 调用绘制plot方法
plt.plot(x, sin_y)  # 默认第一条曲线颜色为蓝色,第二条为橘色
plt.plot(x, cos_y)
# 保存图片
plt.savefig('正弦余弦曲线图.jpg')
# 显示绘制的图片
plt.show()

运行效果如下:

上面的示例可以看到,调用两次plot函数,会将sin和cos曲线绘制到同一个二维坐标系中,如果想绘制到两张画布中,可以调用subplot()函数将画布分区。 【示例】将画布分为区域,将图画到画布的指定区域

代码语言:javascript
复制
# 导入matplotlib和numpy模块
import matplotlib.pyplot as plt
import numpy as np

# 生成0-10之间的100个等差数列
x = np.linspace(0, 10, 100)
sin_y = np.sin(x)
cos_y = np.cos(x)
# 对画布进行分区处理, (行数, 列数, 哪个区域) 将画布分为2行2列
plt.subplot(2, 2, 1)  # 将图画在区1
# 修改x, y轴的坐标
plt.xlim(-5, 20)
plt.ylim(-2, 2)
plt.plot(x, sin_y)

plt.subplot(2, 2, 2)  # 将图画在区2
plt.plot(x, cos_y)
# 显示绘制的图片
plt.show()

运行效果如下:

5. 绘制散点图

使用scatter函数可以绘制随机点,该函数需要接收x坐标和y坐标的序列。 【示例】sin和cos函数的散点图

代码语言:javascript
复制
# 导入matplotlib和numpy模块
import matplotlib.pyplot as plt
import numpy as np

# 生成0-10之间的100个等差数列
x = np.linspace(0, 10, 100)
sin_y = np.sin(x)
cos_y = np.cos(x)
# 绘制正弦余弦图
# plt.plot(x, sin_y, 'o')  # 加一个参数'o'效果与scatter是一样的
# plt.plot(x, cos_y, 'o')
# 绘制散点图
plt.scatter(x, sin_y)
plt.scatter(x, cos_y)
# 显示绘制的图
plt.show()

运行效果如下:

【示例】使用scatter画10中大小100中颜色的散点图

代码语言:javascript
复制
# 导入matplotlib和numpy模块
import matplotlib.pyplot as plt
import numpy as np

# 创建x, y
np.random.seed(0)  # 执行多次,通过设置相同的种子,可以确保每次运行生成的随机数序列是可重复的。
x = np.random.rand(100)  # 生成100个[0, 1)之间的随机数
y = np.random.rand(100)
# 生成100种不同大小
size = np.random.rand(100) * 1000  # 乘一千扩大范围,效果跟明显
# 生成100种不同的颜色
color = np.random.rand(100)
# print(x)
# 绘制散点图
plt.scatter(x, y, s=size, c=color, alpha=0.8)  # s表示大小, c表示颜色,alpha表示透明度
plt.show()

运行效果如下:

注意:这里生成的点的大小个数和颜色个数必须要与点的个数相同

作为线性图的替代,可以通过向 plot() 函数添加格式字符串来显示离散值。 可以使用以下格式化字符。

字符

描述

‘-’

实线样式

‘–’

短横线样式

‘-.’

点划线样式

‘:’

虚线样式

‘.’

点标记

‘,’

像素标记

‘o’

圆标记

‘v’

倒三角标记

‘^’

正三角标记

‘1’

下箭头标记

‘2’

上箭头标记

‘3’

左箭头标记

‘4’

右箭头标记

‘s’

正方形标记

‘p’

五边形标记

‘*’

星形标记

‘h’

六边形标记 1

‘H’

六边形标记 2

‘+’

加号标记

‘x’

X 标记

‘D’

菱形标记

‘d’

窄菱形标记

‘_’

水平线标记

以下是颜色的缩写:

字符

颜色

‘b’

蓝色

‘g’

绿色

‘r’

红色

‘c’

青色

‘m’

品红色

‘y’

黄色

‘k’

黑色

‘w’

白色

【示例】不同种类不同颜色的线

代码语言:javascript
复制
# 导入模块
import matplotlib.pyplot as plt
import numpy as np

# 创建0-10之间的100个等差数列
x = np.linspace(0, 10, 100)
# 调用绘制plot方法
plt.plot(x, x + 0, '-g')  # 实线 绿色
plt.plot(x, x + 1, '--c')  # 虚线 浅蓝色
plt.plot(x, x + 2, '-.k')  # 点划线 黑色
plt.plot(x, x + 3, 'or')  # 圆标记 红色
plt.plot(x, x + 4, 'xy')  # 叉叉 黄色
plt.plot(x, x + 5, 'dm')  # 砖石 品红色
# 显示绘制的图
plt.show()

运行效果如下:

【示例】不同种类不同颜色的线并添加图例

代码语言:javascript
复制
# 导入模块
import matplotlib.pyplot as plt
import numpy as np

# 创建0-10之间的100个等差数列
x = np.linspace(0, 10, 100)
# 调用绘制plot方法
# 给plot方法添加参数label
plt.plot(x, x + 0, '-g', label='-g')  # 实线 绿色
plt.plot(x, x + 1, '--c', label='--c')  # 虚线 浅蓝色
plt.plot(x, x + 2, '-.k', label='-.k')  # 点划线 黑色
plt.plot(x, x + 3, 'or', label='or')  # 圆标记 红色
plt.plot(x, x + 4, 'xy', label='xy')  # 叉叉 黄色
plt.plot(x, x + 5, 'dm', label='dm')  # 砖石 品红色
# 使用legend()添加图例
# 通过参数loc设置图例位置,默认在upper left左上角, fancybox边框  framealpha透明度  shadow阴影  borderpad边框宽度
plt.legend(loc='lower right', fancybox=True, framealpha=0.5, shadow=True, borderpad=1)
# 显示绘制的图
plt.show()

使用legend函数添加图例,通过参数loc设置图例位置,默认在upper left左上角, fancybox边框 framealpha透明度 shadow阴影 borderpad边框宽度。 运行效果如下:

6. 绘制柱状图

使用bar函数可以绘制柱状图。柱状图需要水平的x坐标值,以及每一个x坐标值对应的y坐标值,从而形成柱状的图。柱状图主要用来纵向对比和横向对比的。例如,根据年份对销售收据进行纵向对比,x坐标值就表示年份,y坐标值表示销售数据。 【示例】使用bar绘制柱状图,并设置柱的宽度

代码语言:javascript
复制
# 导入matplotlib模块
import matplotlib.pyplot as plt

# 创建x,y坐标
x = [1980, 1985, 1990, 1995]
y = [1000, 3000, 4000, 5000]
x_label = ['1980年', '1985年', '1990年', '1995年']
# 调用bar函数绘制柱状图
plt.bar(x, y, width=3)  # 通过width修改柱的宽度,数值为标准柱宽度的倍数
# 设置字体解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
# 通过xticks修改x坐标的值
# plt.xticks(x, x)
plt.xticks(x, x_label)
# 设置x,y轴的名称
plt.xlabel('年份')
plt.ylabel('销量')
# 设置图例名称
plt.title('年份销量对比图')
# 显示绘制图形
plt.show()

运行效果如下:

注意:bar函数的宽度并不是像素宽度。bar函数会根据二维坐标系的尺寸,以及x坐标值的多少,自动确定每一个柱的宽度,而width指定的宽度就是这个标准柱宽度的倍数。该参数值可以是浮点数,如0.5,表示柱的宽度是标准宽度的0.5倍。 【示例】使用bar和barh绘制柱状图

代码语言:javascript
复制
# 导入模块
import matplotlib.pyplot as plt
import numpy as np

# 创建x,y
np.random.seed(0)
x = np.arange(5)  # 生成[0, 5)之间的整数
y = np.random.randint(-5, 5, 5)  # 随机生成[-5, 5)之间的整数
# 将画布分为一行两列,在第一部分用bar函数画
plt.subplot(1, 2, 1)
# 在0位置处添加水平方向蓝色线条
plt.axhline(0, color='blue', linewidth=3)
plt.bar(x, y, color='blue')
# 在第二部分用barh函数画
plt.subplot(1, 2, 2)
# 在0位置处添加垂直方向红色线条
plt.axvline(0, color='red', linewidth=2)
plt.barh(x, y, color='red')
# 显示绘制图形
plt.show()

运行效果如下:

【示例】对部分柱状图,使用颜色区分

代码语言:javascript
复制
# 导入模块
import matplotlib.pyplot as plt
import numpy as np

# 创建x,y
np.random.seed(0)
x = np.arange(5)  # 生成[0, 5)之间的整数
y = np.random.randint(-5, 5, 5)  # 随机生成[-5, 5)之间的整数
v_bar = plt.bar(x, y, color='blue')
# 对y大于0的合作为蓝色,小于0设置为绿色
for bar, height in zip(v_bar, y):
    if height < 0:
        bar.set(color='green')
# 显示绘制图形
plt.show()

运行效果如下:

补充:zip函数将多个可迭代对象中对应位置的元素打包成一个个元组,然后返回一个新的可迭代对象(通常是一个zip对象)。 语法:

  • 语法:zip(iterable, …)
  • 参数: iterable: 一个或多个可迭代对象

【示例】将两个列表按位置打包成元组的列表

代码语言:javascript
复制
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
person_info = zip(names, ages)
print(list(person_info))  # 输出:[('Alice', 25), ('Bob', 30), ('Charlie', 35)]

【示例】柱状图使用实例

代码语言:javascript
复制
# 导入模块
import matplotlib.pyplot as plt
import numpy as np

# 准备数据如 电影名称以及电影票房数
movie_name = ['千与千寻', '玩具总动员4', '黑衣人:全球追缉']
# 连续3天的票房数
real_num1 = [7548, 4013, 1673]
real_num2 = [5435, 1845, 1028]
real_num3 = [4203, 3305, 1369]
x = np.arange(len(movie_name))
# 绘制柱状图
# 设置宽度
width = 0.3
plt.bar(x, real_num1, alpha=0.5, width=width, label=movie_name[0])
# 利用列表推导式设置宽度使其柱状图不重叠
plt.bar([i + width for i in x], real_num2, alpha=0.5, width=width, label=movie_name[1])
plt.bar([i + 2 * width for i in x], real_num3, alpha=0.5, width=width, label=movie_name[2])
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
# 利用列表推导式设置x坐标的值, 第一天 第二天 第三天
x_label = ['第{}天'.format(i + 1) for i in x]
plt.xticks([i + width for i in x], x_label)
# 添加y轴名称
plt.ylabel('票房数')
# 添加图例
plt.legend()
# 添加标题
plt.title('电影票房数')
# 显示绘制图形
plt.show()

运行效果如下:

7. 绘制饼状图

pie函数可以绘制饼状图,饼图主要是用来呈现比例的。只要传入比例数据即可。 【示例】绘制饼状图

代码语言:javascript
复制
# 导入模块
import matplotlib.pyplot as plt
# 男女人数及比例 单位:万人
man = 71135
woman = 68185
# 比例
man_perc = man / (man + woman)
woman_perc = woman / (man + woman)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
# 添加名称
labels = ['男', '女']
# 颜色
colors = ['biue', 'orange']
# 绘制饼状图 调用pie方法。
# explode参数用于指定饼图中各个扇形的偏移程度。
# autopct参数用于指定如何显示每个扇形的百分比值
plt.pie([man_perc, woman_perc], labels=labels, explode=(0, 0.05), autopct='%0.1f%%')
# 显示绘制图形
plt.show()

运行效果如下:

8. 绘制直方图

直方图与柱状图的分格类似,都是由若干个柱组成,但直方图和柱状图的含义却有很大的差异。直方图是用来观察分布状态的,而柱状图是用来看每一个X坐标对应的Y的值的。也就是说,直方图关注的是分布,并不关心具体的某个值,而柱状图关心的是具体的某个值。使用hist函数绘制直方图。 【示例】使用randn函数生成1000个正太分布的随机数,使用hist函数绘制这1000个随机数的分布状态

代码语言:javascript
复制
# 导入模块
import matplotlib.pyplot as plt
import numpy as np

# 生成1000个标准正态分布随机数
x = np.random.randn(1000)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
# 设置标题
plt.title('标准正态分布直方图')
# 绘制直方图
plt.hist(x, bins=100)  # 将数据分成100个箱子
# 显示绘制的图形
plt.show()

运行效果如下:

【示例】使用normal函数生成1000个正太分布的随机数,使用hist函数绘制这100个随机数的分布状态

代码语言:javascript
复制
# 导入模块
import matplotlib.pyplot as plt
import numpy as np

# 调用np.rangom.normal()指定期望和方差的正态分布,(期望, 标准差, 个数)
x = np.random.normal(0, 0.8, 1000)
y = np.random.normal(-2, 1, 1000)
z = np.random.normal(3, 2, 1000)
# 参数alpha用于设置透明度, 参数bins=100表示将数据分成100个箱子
kwargs = dict(bins=100, alpha=0.5)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
# 设置图形标题
plt.title('非标准正态分布直方图')
# 绘制直方图
plt.hist(x, **kwargs)
plt.hist(y, **kwargs)
plt.hist(z, **kwargs)
# 显示绘制的图形
plt.show()

运行效果如下:

9. 绘制等高线图

【示例】使用pyplot绘制等高线图

代码语言:javascript
复制
# 导入模块
import matplotlib.pyplot as plt
import numpy as np
# 生成100个-10-10之间的等差数列
x = np.linspace(-10, 10, 100)
y = np.linspace(-10, 10, 100)
# 计算出x,y相交的点X,Y
X, Y = np.meshgrid(x, y)
# 计算Z
Z = np.sqrt(X**2 + Y**2)  # 计算括号内值的开方
# 绘制等高线图
# plt.contour(X, Y, Z)
plt.contourf(X, Y, Z)  # 在contour()的基础上有颜色填充
# 显示绘制的图形
plt.show()

运行效果如下:

10. 绘制三维图

matplotlib支持绘制三维线框图, 三维曲面图, 三维散点图. 需要使用axes3d提供3d坐标系. 【示例】使用pyplot包和Matplotlib绘制三维图

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax3d = fig.add_subplot(121, projection='3d')

# filled为bool类型数组,在True的元素下标位置绘制体元素
i, j, k = np.indices((3, 3, 3))
filled = (i == j) & (j == k)  # 3行3列3层,对角线为True
c = plt.get_cmap('RdBu')(np.linspace(0, 1, 27)).reshape(3, 3, 3, 4)

# ax3d.voxels(filled)             #filled为True的位置绘制六面体
ax3d.voxels(filled, facecolors=c)  # filled为True的位置绘制六面体,并设置颜色

#
ax3d = fig.add_subplot(122, projection='3d')
# x,y,z=np.indices((3,4,5))
# ax3d.voxels(x,y,z,filled)

plt.show()

运行效果如下:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Matplotlib简介
    • 1. 什么是Matplotlib
      • 2. Matplotlib的安装
      • 二、绘制基础
        • 1. 绘制直线
          • 2. 绘制折线图
            • 3. 设置样式
              • 4. 绘制曲线图
                • 5. 绘制散点图
                  • 6. 绘制柱状图
                    • 7. 绘制饼状图
                      • 8. 绘制直方图
                        • 9. 绘制等高线图
                          • 10. 绘制三维图
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档