使用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绘制渐变的彩色曲线内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用tensorboard可视化loss和acc的实例

    使用tensorboard可视化loss和acc的实例

    今天小编就为大家分享一篇使用tensorboard可视化loss和acc的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 如何学习Python time模块

    如何学习Python time模块

    在本篇文章里小编给大家分享的是关于Python time模块知识点及用法,需要的朋友们可以学习下。
    2020-06-06
  • 浅谈Python 多进程默认不能共享全局变量的问题

    浅谈Python 多进程默认不能共享全局变量的问题

    今天小编就为大家分享一篇浅谈Python 多进程默认不能共享全局变量的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python调用java的Webservice示例

    python调用java的Webservice示例

    这篇文章主要介绍了python调用java的Webservice具体方法,包含java端和python实现代码,需要的朋友可以参考下
    2014-03-03
  • JupyterLab远程密码访问实现

    JupyterLab远程密码访问实现

    本文主要介绍了JupyterLab远程密码访问实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 详解如何在Python中替换文件路径和要读取的行号

    详解如何在Python中替换文件路径和要读取的行号

    这篇文章主要为大家详细介绍了如何在Python中替换文件路径和要读取的行号,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下
    2007-02-02
  • CentOS 7 安装python3.7.1的方法及注意事项

    CentOS 7 安装python3.7.1的方法及注意事项

    这篇文章主要介绍了CentOS 7 安装python3.7.1的方法,文中给大家提到了注意事项,需要的朋友可以参考下
    2018-11-11
  • python+mysql实现个人论文管理系统

    python+mysql实现个人论文管理系统

    这篇文章主要为大家详细介绍了python+mysql实现个人论文管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • pytorch教程网络和损失函数的可视化代码示例

    pytorch教程网络和损失函数的可视化代码示例

    这篇文章主要介绍了pytorch教程中网络和损失函数的可视化,文中附含详细的代码示例,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09
  • Python生成器与迭代器详情

    Python生成器与迭代器详情

    这篇文章主要介绍了Python生成器与迭代器,现在可以通过生成器来直接创建一个列表,是由于内存的限制,表的容量肯定是有限的,果我们需要一个包含几百个元素的列表,是每次访问的时候只访问其中的几个,剩下的元素不使用就很浪费内存空间,下面来了解具体内容
    2021-11-11

最新评论