用Matplotlib绘制渐变的彩色曲线
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绘制渐变的彩色曲线相关推荐
- Python+Matplotlib绘制三次贝塞尔曲线
开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...
- matlab做基尼曲线,计算基尼系数和matplotlib绘制洛伦兹曲线
基尼系数和洛伦兹曲线,在表示数据的不平均方面特别是财富的不平均上被广泛应用.但是目前在python里面并没有找到很好的可以直接绘制洛伦兹曲线的函数,由于目前项目用到,也就在实际应用中使用到,就把如何使 ...
- Python+Matplotlib可视化三次贝塞尔曲线的4个调和函数
开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...
- matplotlib绘制平滑的曲线
matplotlib绘制平滑的曲线有2种常用的方法 1.曲线拟合 使用scipy库可以拟合曲线. 没拟合的图: import matplotlib.pyplot as plt import numpy ...
- python画两条曲线_查找在matplotlib中绘制的两条曲线之间的区域(在区域之间填充)...
我有两条曲线的x和y值列表,它们都有奇怪的形状,而且我没有任何函数.我需要做两件事:(1)绘制它并对曲线之间的区域进行着色,如下图所示:(2)找到曲线之间该着色区域的总面积. 在matplotlib中 ...
- Python+matplotlib绘制函数曲线查找函数极值
推荐图书: <Python程序设计基础(第2版)>,ISBN:9787302490562,董付国,清华大学出版社,第16次印刷,清华大学出版社2019年度畅销图书 图书详情: 配套资源:用 ...
- python实时绘制动态曲线_pyqt中使用matplotlib绘制动态曲线
一.项目背景: 看了matplotlib for python developers这本书,基本掌握了在pyqt中显示曲线的做法,于是自己写一个. 二.需求描述: 1)X轴显示时间点,显示长度为1分钟 ...
- python画曲线图例-python使用matplotlib绘制折线图教程
matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备,并 ...
- Python使用matplotlib绘制三维曲线
本文主要演示如何使用matplotlib绘制三维图形.直接上代码,关键语句配有注释方便理解. import matplotlib as mpl from mpl_toolkits.mplot3d im ...
- python绘制多条不同x轴曲线_Python matplotlib 绘制双Y轴曲线图的示例代码
Matplotlib简介 Matplotlib是非常强大的python画图工具 Matplotlib可以画图线图.散点图.等高线图.条形图.柱形图.3D图形.图形动画等. Matplotlib安装 p ...
最新文章
- html 控件坐标定位,利用JS改变html控件位置
- 光遇自动弹琴脚本代码_光遇弹琴辅助软件下载-光遇自动弹琴脚本代码下载v1.0_86PS软件园...
- 手把手教你怎么用动软.net代码生成器 搭建三层架构
- 如何利用pycharm实现本地代码和远程的实时同步
- spark和HSQL的连接join方式
- el表达式遍历list中的list_EL表达式获取map和list集合中的值 | 学步园
- 如何得到别人的上网帐号和密码
- Flask使用bootstrap为HttpServer添加上传文件功能
- JSK-337 汽水瓶【数学+模拟】
- 20165329 Java实验四 Android程序设计
- 每个人都应该具备点批判性思维
- soliworks三维机柜布局(二)创建设备位置
- vios接口虚拟服务器,虚拟VIOS服务器安装手册V1.0
- 用 Rust 写一个声控小动画
- 税务计算机违规外联整改报告,县地税局开展税务业务专网及其终端“违规外联”检查...
- 创新BMW X2 不但有颜有型 还出奇的好开
- 【AWS云从业者基础知识笔记】——模块7:监控和分析
- 计算机图形学:二维图形的几何变换(算法原理及代码实现)
- 机器视觉中的光源选型
- 深度学习 (五)cbow、skip-gram of word2vec