Matplotlib是Python生态圈中应用最为广泛的2D绘图库,通过扩展工具包mplot3d,也可以绘制简单的3D模型。Matplotlib的使用非常简单,以绘制一条单周期的正弦曲线为例,只需要寥寥数行代码即可完成。

import numpy as np
import matplotlib.pyplot as pltx = 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 pltdef color_map(data, cmap):"""数值映射为颜色"""dmin, dmax = np.nanmin(data), np.nanmax(data)cmo = plt.cm.get_cmap(cmap)cs, k = list(), 256/cmo.Nfor 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 LineCollectiondef color_map(data, cmap):"""数值映射为颜色"""dmin, dmax = np.nanmin(data), np.nanmax(data)cmo = plt.cm.get_cmap(cmap)cs, k = list(), 256/cmo.Nfor 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两个函数设置坐标轴的范围。最终的显示效果如下图所示。

用Matplotlib绘制渐变的彩色曲线相关推荐

  1. Python+Matplotlib绘制三次贝塞尔曲线

    开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...

  2. matlab做基尼曲线,计算基尼系数和matplotlib绘制洛伦兹曲线

    基尼系数和洛伦兹曲线,在表示数据的不平均方面特别是财富的不平均上被广泛应用.但是目前在python里面并没有找到很好的可以直接绘制洛伦兹曲线的函数,由于目前项目用到,也就在实际应用中使用到,就把如何使 ...

  3. Python+Matplotlib可视化三次贝塞尔曲线的4个调和函数

    开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...

  4. matplotlib绘制平滑的曲线

    matplotlib绘制平滑的曲线有2种常用的方法 1.曲线拟合 使用scipy库可以拟合曲线. 没拟合的图: import matplotlib.pyplot as plt import numpy ...

  5. python画两条曲线_查找在matplotlib中绘制的两条曲线之间的区域(在区域之间填充)...

    我有两条曲线的x和y值列表,它们都有奇怪的形状,而且我没有任何函数.我需要做两件事:(1)绘制它并对曲线之间的区域进行着色,如下图所示:(2)找到曲线之间该着色区域的总面积. 在matplotlib中 ...

  6. Python+matplotlib绘制函数曲线查找函数极值

    推荐图书: <Python程序设计基础(第2版)>,ISBN:9787302490562,董付国,清华大学出版社,第16次印刷,清华大学出版社2019年度畅销图书 图书详情: 配套资源:用 ...

  7. python实时绘制动态曲线_pyqt中使用matplotlib绘制动态曲线

    一.项目背景: 看了matplotlib for python developers这本书,基本掌握了在pyqt中显示曲线的做法,于是自己写一个. 二.需求描述: 1)X轴显示时间点,显示长度为1分钟 ...

  8. python画曲线图例-python使用matplotlib绘制折线图教程

    matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备,并 ...

  9. Python使用matplotlib绘制三维曲线

    本文主要演示如何使用matplotlib绘制三维图形.直接上代码,关键语句配有注释方便理解. import matplotlib as mpl from mpl_toolkits.mplot3d im ...

  10. python绘制多条不同x轴曲线_Python matplotlib 绘制双Y轴曲线图的示例代码

    Matplotlib简介 Matplotlib是非常强大的python画图工具 Matplotlib可以画图线图.散点图.等高线图.条形图.柱形图.3D图形.图形动画等. Matplotlib安装 p ...

最新文章

  1. html 控件坐标定位,利用JS改变html控件位置
  2. 光遇自动弹琴脚本代码_光遇弹琴辅助软件下载-光遇自动弹琴脚本代码下载v1.0_86PS软件园...
  3. 手把手教你怎么用动软.net代码生成器 搭建三层架构
  4. 如何利用pycharm实现本地代码和远程的实时同步
  5. spark和HSQL的连接join方式
  6. el表达式遍历list中的list_EL表达式获取map和list集合中的值 | 学步园
  7. 如何得到别人的上网帐号和密码
  8. Flask使用bootstrap为HttpServer添加上传文件功能
  9. JSK-337 汽水瓶【数学+模拟】
  10. 20165329 Java实验四 Android程序设计
  11. 每个人都应该具备点批判性思维
  12. soliworks三维机柜布局(二)创建设备位置
  13. vios接口虚拟服务器,虚拟VIOS服务器安装手册V1.0
  14. 用 Rust 写一个声控小动画
  15. 税务计算机违规外联整改报告,县地税局开展税务业务专网及其终端“违规外联”检查...
  16. 创新BMW X2 不但有颜有型 还出奇的好开
  17. 【AWS云从业者基础知识笔记】——模块7:监控和分析
  18. 计算机图形学:二维图形的几何变换(算法原理及代码实现)
  19. 机器视觉中的光源选型
  20. 深度学习 (五)cbow、skip-gram of word2vec

热门文章

  1. web3.0 兴起之际,元宇宙不属于任何一家科技巨头
  2. Data Path Manager(DPM)-数据路径管理
  3. 揭秘工业互联网的内涵、热点与难点!
  4. 设计模式---004策略模式---【巷子】
  5. 互联网入口之战:浏览器战争
  6. 图灵交互设计丛书《简约至上.交互式设计四策略》
  7. Proxy的常见使用——正向代理的使用及配置总结
  8. win7和win10哪个好用
  9. SAP 中的货币(Currencies)
  10. 【MAC IDEA】 修改‘.vmoptions’文件导致idea程序无法启动