python中的matplotlib库的基本使用

3407次阅读 76人点赞 作者: WuBin 发布时间: 2025-02-25 08:42:32
扫码到手机查看

matplotlib库

使用matplotlib制作各种图表,可以访问https://matplotlib.org/的示例,点击示例图表,就可以查看用于生成图表的代码。

以下matplotlib库简称为matp。

绘制简单的折线图并设置线条粗细

# https://matplotlib.org/
import matplotlib.pyplot as plt
# 等价于 from matplotlib import pyplot as plt

# 设置支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体
# 解决负号显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False

squres = [1, 4, 9, 16, 25]
plt.plot(squres, linewidth=5)

# 设置图表标题 并给坐标轴加上标签
plt.title('squers数据', fontsize=24)
plt.xlabel('值',fontsize=14)
plt.ylabel('square的值', fontsize=14)

# 设置刻度标记大小
plt.tick_params(axis='both', labelsize=14)

plt.show()
import matplotlib.pyplot as plt 这句话是引入matp库中的pyplot模块,并指定别名。

plt.show()是打开matp查看器。

plt.xlabel设置x轴下方的文字标题。

plt.ylabel设置Y轴左侧的文字标题。

plt.title:为图表指定标题

linewidth参数决定了plot()绘制线条的粗细

plt.tick_params(axis='both', labelsize=14):刻度样式,axis='both'指定的实参将影响X轴和Y轴上的刻度(both),并将刻度标记的字号设置为14。

plt.rcParams['font.sans-serif']=['SimHei']和plt.rcParams['axes.unicode_minus']=False比较关键(中文支持),如果不加这两句,那么会发现图表标题和XY轴的标题中的中文都是显示方块的,所以需要添加中文的支持。

校正图形

当向plot()提供一系列数字时候,它假设第一个数据点对应的x坐标值是0,但是我们第一个点对应的x值为1.为改变这种默认行为,我们可以给plot()同时提供输入值和输出值。

input_values = [1, 2, 3, 4, 5]
squres = [1, 4, 9, 16, 25]
plt.plot(input_values, squres, linewidth=5)

因为同时提供了输入值和输出值,它无需对输出值的生成方式做出假设,

使用scatter绘制散点图

要绘制单个点,可使用函数scatter()。传入一对xy坐标,它将在指定位置绘制一个点。

import matplotlib.pyplot as plt

plt.scatter(2, 4, s=200)
# 设置图表标题并给坐标加上标签
plt.title('图表标题', fontsize=24)
plt.xlabel('x轴', fontsize=14)
plt.ylabel('y轴', fontsize=14)
# 设置刻度标记的大小
plt.tick_params(axis='both', which='major', labelsize=14)

plt.show()

scatter的实参S设置了绘图时使用点的尺寸。因为只传入了一个坐标,所以图中此时只有一个点。

绘制一系列点

x_values = [1,2,3,4,5]
y_values = [1,4,9,16,25]

plt.scatter(x_values, y_values, s=200)

绘制一系列点,向scatter传递两个包含xy值的列表。其要绘制的点分别为(1,1)(2,4)(3,9)...(5,25)

像这种计算平方的,我们可以使用自动计算:

x_values = list(range(1, 1001))
y_values = [ x**2 for x in x_values ]

plt.scatter(x_values, y_values, s=40)
...
# 设置每个坐标轴的取值范围
plt.axis([0, 1100, 0, 1100000])

plt.show()

x_values:创建一个包含数字1-1000的列表

y_values:遍历x值,并计算其平方值,结果存储在y_values中

plt.axis():指定了每个坐标轴的取值范围。axis要求提供四个值:xy坐标轴的最小值和最大值。这里我们将x坐标轴的取值范围设置为0-1100,y轴取值范围设置为0-1100000。

matp默认蓝色点和黑色轮廓。当绘制很多点时候,黑色轮廓可能会连在一起,要去掉数据点轮廓:

plt.scatter(x_values, y_values, edgecolor='none', s=40)
plt.scatter(x_values, y_values, edgecolor='black', s=40)

实参edgecolor='none'可以去掉黑色轮廓。(2.0.0版本的matp默认没有黑色轮廓,edgecolor默认为none)

要修改数据点颜色,可以向scatter传递参数c,并设置其为要使用的颜色名称或者色值。

plt.scatter(x_values, y_values, c="#666", edgecolor='none', s=40)
plt.scatter(x_values, y_values, c="red", edgecolor='none', s=40)

同样的还可以使用RGB定义颜色,但是此时的参数不是字符串了,而是一个元组。

plt.scatter(x_values, y_values, c=(0,0,0.8), edgecolor='none', s=40)

值越接近0,指定的颜色越深,值越接近1,指定的颜色越浅。

上面这个可能会报警告,建议改为如下,使用color,将c参数替换为color参数,这样可以明确告诉matplotlib你想要使用单一颜色。

plt.scatter(x_values, y_values, color=(0, 0, 0.8), edgecolor='none', s=40)

使用颜色映射

颜色映射是一系列颜色,从起始颜色渐变到结束颜色,在可视化中,颜色映射用于突出数据的规律。比如用浅色显示较小的值,用深色显示较大的值。

x_values = list(range(1, 1001))
y_values = [ x**2 for x in x_values ]

plt.scatter(
    x_values, 
    y_values, 
    c=y_values, 
    cmap=plt.cm.Blues,
    edgecolor='none', 
    s=40
)

# 设置图表标题并给坐标加上标签
plt.title('图表标题', fontsize=24)
plt.xlabel('x轴', fontsize=14)
plt.ylabel('y轴', fontsize=14)
# 设置刻度标记的大小
plt.tick_params(axis='both', which='major', labelsize=14)
# 设置每个坐标轴的取值范围
plt.axis([0, 1100, 0, 1100000])

plt.show()

我们执行会发现,颜色从左到右是由浅入深的。模块pyplot内置了一组颜色映射,要使用这些颜色映射,你需要告诉pyplot该如何设置数据集中每个点的颜色。上面例子演示了如何根据每个点的y值来设置其颜色。

参数C设置成了一个y值列表,使用参数cmap告诉pyplot使用哪个颜色映射,最终将y值较小的显示为浅蓝色,y值较大的显示为深蓝色。

可以参考:https://matplotlib.org/stable/users/explain/colors/index.html#tutorials-colors  官网的examples中查找colormaps_reference

自动保存图表

要让程序自动将图表保存到文件中,将plt.show() 调用替换为plt.savefig():

# plt.show()
plt.savefig('squares_plot.png', bbox_inches='tight')

第一个参数指定要用什么样的文件名保存图表,会在脚本目录中生成文件;

bbox_inches指定将图表多余的空白区域裁剪掉。如果要保留图表周围多余的空白区域,可以省略这个实参。

随机漫步

在目录下创建random_walk.py文件,并编写RandomWalk类。

# 随机漫步
from random import choice

class RandomWalk():
    """ 生成随机漫步数据的表 """

    def __init__(self, num_points=5000):
        self.num_points = num_points

        #所有随机漫步都始于(0,0)
        # [0] 是一个包含单个元素 0 的列表
        self.x_values = [0]
        self.y_values = [0]

    def fill_walk(self):
        """ 计算随机漫步包含的所有点 """

        # 不断漫步 直到列表达到指定长度(模拟四种漫步决定 向右 向左 向上 向下 并且沿指定方向走多远)
        while len(self.x_values) < self.num_points:
            # 方向 决定前进方向以及沿这个方向前进的 向右=1,向左=-1
            # choice([1, -1]) 在1,-1中随机返回一个值
            x_direction = choice([1, -1])
            # 距离 随机选择0-4之间的整数 表示沿指定方向走多远
            # choice([..]) 从列表中随机返回一个值
            x_distance = choice([0, 1, 2, 3, 4])
            # 方向 * 距离 确定沿x或者Y轴走的步数(距离数)
            # 如果x_step为正 则向右移动 负数 则代表向左移动 0则代表垂直移动
            x_step = x_direction * x_distance

            y_direction = choice([1, -1])
            y_distance = choice([0, 1, 2, 3, 4])
            y_step = y_direction * y_distance

            # 拒绝原地踏步
            # 如果x和y同时为0 则不被允许 直接continue进行下一次循环
            if x_step == 0 and y_step == 0:
                continue

            # 计算下一个点的x和y的值
            # self.x_values[-1] 代表列表中最后一个值
            # 下一个点坐标 使用当前列表中最后一个值与 x轴y轴的移动距离相加
            next_x = self.x_values[-1] + x_step
            next_y = self.y_values[-1] + y_step

            # 最后将下一个点插入到列表末尾,作为最后一个点
            self.x_values.append(next_x)
            self.y_values.append(next_y)

choice作用是从列表中随机选择一个元素。

from random import choice

# 定义一个列表
my_list = [1, 2, 3, 4, 5]

# 从列表中随机选择一个元素
random_element = choice(my_list)
print(random_element)

然后配合matp使用:

import matplotlib.pyplot as plt
from random_walk import RandomWalk

rw = RandomWalk()
rw.fill_walk()

plt.scatter(rw.x_values, rw.y_values, s=15)
plt.show()

s=15代表绘制图中每个数据点的大小。

模拟多次随机漫步

import matplotlib.pyplot as plt
from random_walk import RandomWalk


# 只要程序处于活动状态 就不断的模拟随机漫步
while True:
    # 创建一个实例 并将其包含的点都绘制出来
    rw = RandomWalk()
    rw.fill_walk()
    plt.scatter(rw.x_values, rw.y_values, s=15)
    plt.show()
    # 关闭matp的查看器的时候 会询问是否再开启另一个 不断的点y就会一直生成
    keep_running = input('开启另一个绘图(y/n)')
    if keep_running == 'n':
        break;

设置一个蓝色渐变的散点图

while True:
    # 创建一个实例 并将其包含的点都绘制出来
    rw = RandomWalk()
    rw.fill_walk()
    # 生成数字列表 其中包含的数字个数与漫步包含的点数相同
    point_numbers = list( range(rw.num_points) )
    plt.scatter(
        rw.x_values,
        rw.y_values,
        c=point_numbers,
        cmap=plt.cm.Blues
    )

    plt.show()
    # 关闭matp的查看器的时候 会询问是否再开启另一个 不断的点y就会一直生成
    keep_running = input('开启另一个绘图(y/n)')
    if keep_running == 'n':
        break;

c=point_numbers

c是plt.scatter() 函数的一个参数,用于指定每个散点的颜色。它可以接受多种类型的值:

如果c是一个单一的颜色字符串(如'red'、'blue'等),则所有散点都会使用该颜色。

如果c是一个与 x_values 和 y_values 长度相同的序列(如列表、数组等),则 c 中的每个值将对应一个散点,并根据颜色映射(cmap)来确定该散点的颜色。

在这个例子中,point_numbers 是一个序列,它为每个散点提供了一个用于颜色映射的值。通常,这些值是数值,颜色映射会根据这些数值的大小将不同的颜色分配给相应的散点。

cmap=plt.cm.Blues

cmap也是plt.scatter() 函数的一个参数,用于指定颜色映射(colormap)。颜色映射是一个将数值映射到颜色的函数,它定义了从最小值到最大值的颜色渐变。

plt.cm.Blues 是 matplotlib 库中预定义的一个颜色映射,它表示从浅蓝色到深蓝色的渐变。具体来说,数值较小的点会被映射为浅蓝色,而数值较大的点会被映射为深蓝色。

最终效果就是:这是一个由左至右,浅蓝入深蓝的渐变散点图,值越大颜色会越深。

突出起点和终点

while True:
    rw = RandomWalk()
    rw.fill_walk()
    point_numbers = list( range(rw.num_points) )
    plt.scatter(
        rw.x_values,
        rw.y_values,
        c=point_numbers,
        cmap=plt.cm.Blues,
        edgecolors='none',
        s=15
    )

    #突出起点和重点 
    # 起点是(0,0)赋予绿色 s是点的大小尺寸
    plt.scatter(0, 0, c='green', edgecolors='none', s=100)
    # 终点是rw.x_values[-1],rw.y_values[-1] 即数组中最后一个元素 赋予红色
    plt.scatter(
        rw.x_values[-1],
        rw.y_values[-1],
        c='red',
        edgecolors='none',
        s=100
    )

    plt.show()
    keep_running = input('开启另一个绘图(y/n)')
    if keep_running == 'n':
        break;

隐藏坐标轴

plt.show()会显示当前的图形并阻塞程序,直到你关闭图形窗口
 # 隐藏坐标轴
    plt.axes().get_xaxis().set_visible(False)
    plt.axes().get_yaxis().set_visible(False)
    # 隐藏坐标轴
    plt.axis('off')

    plt.show()

隐藏坐标轴的方法有两种,更推荐使用plt.axis('off‘)

plt.axes()是将坐标轴的可见性设置为false。

特别注意,任何对图形的绘制更改,都要再plt.show之前添加!!

调整窗口尺寸

图表适合屏幕大小适合,更能有效将数据呈现出来。

while True:
    # 添加海量的点
    rw = RandomWalk(50000)
    rw.fill_walk()

    # 设置绘图窗口的尺寸
    plt.figure( figsize=(10, 6) )

    # 生成数字列表 其中包含的数字个数与漫步包含的点数相同
    point_numbers = list( range(rw.num_points) )
    plt.scatter(
        rw.x_values,
        rw.y_values,
        c=point_numbers,
        cmap=plt.cm.Blues,
        edgecolors='none',
        s=1
    )
    #突出起点和重点 
    # 起点是(0,0)赋予绿色
    plt.scatter(0, 0, c='green', edgecolors='none', s=100)
    # 终点是rw.x_values[-1],rw.y_values[-1] 即数组中最后一个元素 赋予红色
    plt.scatter(
        rw.x_values[-1],
        rw.y_values[-1],
        c='red',
        edgecolors='none',
        s=100
    )
    # 隐藏坐标轴
    plt.axis('off')
    plt.show()

    keep_running = input('开启另一个绘图(y/n)')
    if keep_running == 'n':
        break;

figure()用于指定图表的宽度、高度、分辨率和背景色。需要给形参figsize指定一个元组,向matp指出绘图窗口的尺寸,单位为英寸。

PY默认屏幕分辨率是80px/英寸,如果直到自己系统的分辨率,可以使用形参dpi向figure传递该分辨率。如下:

plt.figure( dpi=128, figsize=(10, 6) ) 

点赞 支持一下 觉得不错?客官您就稍微鼓励一下吧!
关键词:matplotlib
推荐阅读
  • uniapp实现被浏览器唤起的功能

    当用户打开h5链接时候,点击打开app若用户在已经安装过app的情况下直接打开app,若未安装过跳到应用市场下载安装这个功能在实现上主要分为两种场景,从普通浏览器唤醒以及从微信唤醒。

    10460次阅读 690人点赞 发布时间: 2022-12-14 16:34:53 立即查看
  • Vue

    盘点Vue2和Vue3的10种组件通信方式

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异;本文将通过选项式API组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式。

    4953次阅读 374人点赞 发布时间: 2022-08-19 09:40:16 立即查看
  • JS

    几个高级前端常用的API

    推荐4个前端开发中常用的高端API,分别是MutationObserver、IntersectionObserver、getComputedstyle、getBoundingClientRect、requ...

    15021次阅读 990人点赞 发布时间: 2021-11-11 09:39:54 立即查看
  • PHP

    【正则】一些常用的正则表达式总结

    在日常开发中,正则表达式是非常有用的,正则表达式在每个语言中都是可以使用的,他就跟JSON一样,是通用的。了解一些常用的正则表达式,能大大提高你的工作效率。

    14480次阅读 568人点赞 发布时间: 2021-10-09 15:58:58 立即查看
  • 【中文】免费可商用字体下载与考证

    65款免费、可商用、无任何限制中文字体打包下载,这些字体都是经过长期验证,经得住市场考验的,让您规避被无良厂商起诉的风险。

    13188次阅读 1065人点赞 发布时间: 2021-07-05 15:28:45 立即查看
  • Vue

    Vue3开发一个v-loading的自定义指令

    在vue3中实现一个自定义的指令,有助于我们简化开发,简化复用,通过一个指令的调用即可实现一些可高度复用的交互。

    17347次阅读 1394人点赞 发布时间: 2021-07-02 15:58:35 立即查看
  • JS

    关于手机上滚动穿透问题的解决

    当页面出现浮层的时候,滑动浮层的内容,正常情况下预期应该是浮层下边的内容不会滚动;然而事实并非如此。在PC上使用css即可解决,但是在手机端,情况就变的比较复杂,就需要禁止触摸事件才可以。

    15789次阅读 1275人点赞 发布时间: 2021-05-31 09:25:50 立即查看
  • Vue

    Vue+html2canvas截图空白的问题

    在使用vue做信网单页专题时,有海报生成的功能,这里推荐2个插件:一个是html2canvas,构造好DOM然后转canvas进行截图;另外使用vue-canvas-poster(这个截止到2021年3月...

    31129次阅读 2449人点赞 发布时间: 2021-03-02 09:04:51 立即查看
  • Vue

    vue-router4过度动画无效解决方案

    在初次使用vue3+vue-router4时候,先后遇到了过度动画transition进入和退出分别无效的情况,搜遍百度没没找到合适解决方法,包括vue-route4有一些API都进行了变化,以前的一些操...

    27001次阅读 2073人点赞 发布时间: 2021-02-23 13:37:20 立即查看
交流 收藏 目录