使用Python的Matplotlib绘制渐变的彩色曲线

 更新时间:2023年08月18日 10:14:23   作者:天元浪子  
这篇文章主要介绍了使用Python的Matplotlib绘制渐变的彩色曲线,Matplotlib是Python生态圈中应用最为广泛的2D绘图库,通过扩展工具包mplot3d,也可以绘制简单的3D模型,需要的朋友可以参考下

Matplotlib绘制渐变的彩色曲线

Matplotlib是Python生态圈中应用最为广泛的2D绘图库,通过扩展工具包mplot3d,也可以绘制简单的3D模型。

Matplotlib的使用非常简单,以绘制一条单周期的正弦曲线为例,只需要寥寥数行代码即可完成。

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2*np.pi, 200)
y = np.sin(x)
plt.plot(x, y, color='green')
plt.show()

上面的代码在 [ 0 , 2 π ] [0, 2\pi] [0,2π]之间以均匀间隔选取了200个点,并计算它们的正弦值,再调用plot函数将这200个点的正弦值连成一条曲线,通过plot函数的color参数(也可以简写为c)设置正弦曲线的颜色为绿色——当然,也可以设置为你想要的任意一种颜色。

在这里插入图片描述

不过,略有遗憾的是,Matplotlib没有提供直接的方法为这条曲线上的每一个点设置不同的颜色,而这一需求在数据可视化方面却是非常普遍的。

比如,在一条变化复杂的曲线上,如果每个点的数值越大颜色越趋近于红色,数值越小颜色越趋近于蓝色,就更容易展示数据的变化规律。

既然没有直接的方法可用,那就变通一下,将这200个点拆分成199条线段,每条线段设置不同的颜色,不就可以实现上面的需求了吗?

这样做的确可行,不过需要调用plot函数199次,过程漫长到令人无法忍受,并且更新显示(比如缩放)时也会重复这个漫长的调用过程。

幸运的是,Matplotlib提供了另外一种方法,基本思路也是将这200个点拆分成199条线段,每条线段设置不同的颜色,只是不需要反复调用plot函数,因此速度和单次调用plot函数相差无几。

这个方法就是Matplotlib的LineCollection对象。

在使用LineCollection之前,还需要生成199条线段的颜色。

下面这个函数实现可数值到颜色的映射,给定一组数据和一个颜色映射方案,即返回每个数据的映射颜色。

import numpy as np
import matplotlib.pyplot as plt
def color_map(data, cmap):
    """数值映射为颜色"""
    dmin, dmax = np.nanmin(data), np.nanmax(data)
    cmo = plt.cm.get_cmap(cmap)
    cs, k = list(), 256/cmo.N
    for i in range(cmo.N):
        c = cmo(i)
        for j in range(int(i*k), int((i+1)*k)):
            cs.append(c)
    cs = np.array(cs)
    data = np.uint8(255*(data-dmin)/(dmax-dmin))
    return cs[data]

实例化LineCollection时,需要提供多条线段的列表(每条线段可以有多个点组成),以及每条线段的颜色组成的列表,也可以设置线宽和线型。

如果需要绘制Colorbar的话,还需要为LineCollection指定和数据映射相同的颜色映射方案。完整代码如下。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
def color_map(data, cmap):
    """数值映射为颜色"""
    dmin, dmax = np.nanmin(data), np.nanmax(data)
    cmo = plt.cm.get_cmap(cmap)
    cs, k = list(), 256/cmo.N
    for i in range(cmo.N):
        c = cmo(i)
        for j in range(int(i*k), int((i+1)*k)):
            cs.append(c)
    cs = np.array(cs)
    data = np.uint8(255*(data-dmin)/(dmax-dmin))
    return cs[data]
x = np.linspace(0, 2*np.pi, 200)
y = np.sin(x)
ps = np.stack((x,y), axis=1)
segments = np.stack((ps[:-1], ps[1:]), axis=1)
cmap = 'viridis' # jet, hsv等也是常用的颜色映射方案
colors = color_map(np.cos(x)[:-1], cmap)
colors = color_map(y[:-1], cmap)
line_segments = LineCollection(segments, colors=colors, linewidths=3, linestyles='solid', cmap=cmap)
fig, ax = plt.subplots()
ax.set_xlim(np.min(x)-0.1, np.max(x)+0.1)
ax.set_ylim(np.min(y)-0.1, np.max(y)+0.1)
ax.add_collection(line_segments)
cb = fig.colorbar(line_segments, cmap='jet')
plt.show()

使用LineCollection绘图时,axis不会自动在x轴和y轴两端留白,通常需要调用set_xlim和set_ylim两个函数设置坐标轴的范围。最终的显示效果如下图所示。

在这里插入图片描述

到此这篇关于使用Python的Matplotlib绘制渐变的彩色曲线的文章就介绍到这了,更多相关Matplotlib绘制渐变的彩色曲线内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python四大金刚之列表详解

    Python四大金刚之列表详解

    这篇文章主要介绍了Python的列表,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助
    2021-10-10
  • Python编程异步爬虫之aiohttp模块的基本用法

    Python编程异步爬虫之aiohttp模块的基本用法

    aiohttp 模块是一个基于 asyncio 的 HTTP 客户端和服务器框架,可以用于异步处理 HTTP 请求和响应,这篇文章给大家介绍Python编程异步爬虫之aiohttp模块的基本用法,感兴趣的朋友一起看看吧
    2024-03-03
  • 100行python代码实现跳一跳辅助程序

    100行python代码实现跳一跳辅助程序

    这篇文章主要介绍了100行代码实现跳一跳辅助程序,接下来要分享的是用“纯软件”的方法来玩“跳一跳”。本人只做过Android开发,因此下面只给出Android平台下的实现方法。需要的朋友可以参考下
    2018-01-01
  • pytorch载入预训练模型后,实现训练指定层

    pytorch载入预训练模型后,实现训练指定层

    今天小编就为大家分享一篇pytorch载入预训练模型后,实现训练指定层,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python panda库从基础到高级操作分析

    python panda库从基础到高级操作分析

    本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据优化技巧,强调其高效性、灵活性和与科学计算库的集成能力,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • python正常时间和unix时间戳相互转换的方法

    python正常时间和unix时间戳相互转换的方法

    这篇文章主要介绍了python正常时间和unix时间戳相互转换的方法,涉及时间字符串与Unix时间戳的实现与转换技巧,需要的朋友可以参考下
    2015-04-04
  • 基于Python实现一个条形码检测算法

    基于Python实现一个条形码检测算法

    条形码识别是计算机视觉中的常见任务,下面我将介绍如何使用Python和深度学习框架实现一个高效的条形码识别解决方案,有需要的小伙伴可以了解下
    2025-12-12
  • Python实现检测服务器是否可以ping通的2种方法

    Python实现检测服务器是否可以ping通的2种方法

    这篇文章主要介绍了Python实现检测服务器是否可以ping通的2种方法,本文分别讲解了使用ping和fping命令检测服务器是否可以ping通,需要的朋友可以参考下
    2015-01-01
  • Python实现添加或移除PowerPoint中的背景图和背景颜色

    Python实现添加或移除PowerPoint中的背景图和背景颜色

    在处理 PowerPoint 演示文稿时,我们常常会遇到需要为幻灯片添加或移除背景的情况,本文将介绍如何使用 Python 在 PowerPoint 中添加或移除背景,并提供详细步骤和代码示例,帮助你快速上手
    2026-05-05
  • 浅谈算法之最小生成树Kruskal的Python实现

    浅谈算法之最小生成树Kruskal的Python实现

    最小生成树Kruskal算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。本文将介绍它的原理,并用Python进行实现
    2021-06-06

最新评论