使用Python的Matplotlib繪制漸變的彩色曲線
Matplotlib繪制漸變的彩色曲線
Matplotlib是Python生態(tài)圈中應(yīng)用最為廣泛的2D繪圖庫(kù),通過(guò)擴(kuò)展工具包mplot3d,也可以繪制簡(jiǎn)單的3D模型。
Matplotlib的使用非常簡(jiǎn)單,以繪制一條單周期的正弦曲線為例,只需要寥寥數(shù)行代碼即可完成。
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個(gè)點(diǎn),并計(jì)算它們的正弦值,再調(diào)用plot函數(shù)將這200個(gè)點(diǎn)的正弦值連成一條曲線,通過(guò)plot函數(shù)的color參數(shù)(也可以簡(jiǎn)寫為c)設(shè)置正弦曲線的顏色為綠色——當(dāng)然,也可以設(shè)置為你想要的任意一種顏色。

不過(guò),略有遺憾的是,Matplotlib沒(méi)有提供直接的方法為這條曲線上的每一個(gè)點(diǎn)設(shè)置不同的顏色,而這一需求在數(shù)據(jù)可視化方面卻是非常普遍的。
比如,在一條變化復(fù)雜的曲線上,如果每個(gè)點(diǎn)的數(shù)值越大顏色越趨近于紅色,數(shù)值越小顏色越趨近于藍(lán)色,就更容易展示數(shù)據(jù)的變化規(guī)律。
既然沒(méi)有直接的方法可用,那就變通一下,將這200個(gè)點(diǎn)拆分成199條線段,每條線段設(shè)置不同的顏色,不就可以實(shí)現(xiàn)上面的需求了嗎?
這樣做的確可行,不過(guò)需要調(diào)用plot函數(shù)199次,過(guò)程漫長(zhǎng)到令人無(wú)法忍受,并且更新顯示(比如縮放)時(shí)也會(huì)重復(fù)這個(gè)漫長(zhǎng)的調(diào)用過(guò)程。
幸運(yùn)的是,Matplotlib提供了另外一種方法,基本思路也是將這200個(gè)點(diǎn)拆分成199條線段,每條線段設(shè)置不同的顏色,只是不需要反復(fù)調(diào)用plot函數(shù),因此速度和單次調(diào)用plot函數(shù)相差無(wú)幾。
這個(gè)方法就是Matplotlib的LineCollection對(duì)象。
在使用LineCollection之前,還需要生成199條線段的顏色。
下面這個(gè)函數(shù)實(shí)現(xiàn)可數(shù)值到顏色的映射,給定一組數(shù)據(jù)和一個(gè)顏色映射方案,即返回每個(gè)數(shù)據(jù)的映射顏色。
import numpy as np
import matplotlib.pyplot as plt
def color_map(data, cmap):
"""數(shù)值映射為顏色"""
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]實(shí)例化LineCollection時(shí),需要提供多條線段的列表(每條線段可以有多個(gè)點(diǎn)組成),以及每條線段的顏色組成的列表,也可以設(shè)置線寬和線型。
如果需要繪制Colorbar的話,還需要為L(zhǎng)ineCollection指定和數(shù)據(jù)映射相同的顏色映射方案。完整代碼如下。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
def color_map(data, cmap):
"""數(shù)值映射為顏色"""
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繪圖時(shí),axis不會(huì)自動(dòng)在x軸和y軸兩端留白,通常需要調(diào)用set_xlim和set_ylim兩個(gè)函數(shù)設(shè)置坐標(biāo)軸的范圍。最終的顯示效果如下圖所示。

到此這篇關(guān)于使用Python的Matplotlib繪制漸變的彩色曲線的文章就介紹到這了,更多相關(guān)Matplotlib繪制漸變的彩色曲線內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python編程異步爬蟲之a(chǎn)iohttp模塊的基本用法
aiohttp?模塊是一個(gè)基于?asyncio?的?HTTP?客戶端和服務(wù)器框架,可以用于異步處理?HTTP?請(qǐng)求和響應(yīng),這篇文章給大家介紹Python編程異步爬蟲之a(chǎn)iohttp模塊的基本用法,感興趣的朋友一起看看吧2024-03-03
100行python代碼實(shí)現(xiàn)跳一跳輔助程序
這篇文章主要介紹了100行代碼實(shí)現(xiàn)跳一跳輔助程序,接下來(lái)要分享的是用“純軟件”的方法來(lái)玩“跳一跳”。本人只做過(guò)Android開發(fā),因此下面只給出Android平臺(tái)下的實(shí)現(xiàn)方法。需要的朋友可以參考下2018-01-01
pytorch載入預(yù)訓(xùn)練模型后,實(shí)現(xiàn)訓(xùn)練指定層
今天小編就為大家分享一篇pytorch載入預(yù)訓(xùn)練模型后,實(shí)現(xiàn)訓(xùn)練指定層,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
python panda庫(kù)從基礎(chǔ)到高級(jí)操作分析
本文介紹了Pandas庫(kù)的核心功能,包括處理結(jié)構(gòu)化數(shù)據(jù)的Series和DataFrame數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)讀取、清洗、分組聚合、合并、時(shí)間序列分析及大數(shù)據(jù)優(yōu)化技巧,強(qiáng)調(diào)其高效性、靈活性和與科學(xué)計(jì)算庫(kù)的集成能力,感興趣的朋友跟隨小編一起看看吧2025-08-08
python正常時(shí)間和unix時(shí)間戳相互轉(zhuǎn)換的方法
這篇文章主要介紹了python正常時(shí)間和unix時(shí)間戳相互轉(zhuǎn)換的方法,涉及時(shí)間字符串與Unix時(shí)間戳的實(shí)現(xiàn)與轉(zhuǎn)換技巧,需要的朋友可以參考下2015-04-04
基于Python實(shí)現(xiàn)一個(gè)條形碼檢測(cè)算法
條形碼識(shí)別是計(jì)算機(jī)視覺(jué)中的常見(jiàn)任務(wù),下面我將介紹如何使用Python和深度學(xué)習(xí)框架實(shí)現(xiàn)一個(gè)高效的條形碼識(shí)別解決方案,有需要的小伙伴可以了解下2025-12-12
Python實(shí)現(xiàn)檢測(cè)服務(wù)器是否可以ping通的2種方法
這篇文章主要介紹了Python實(shí)現(xiàn)檢測(cè)服務(wù)器是否可以ping通的2種方法,本文分別講解了使用ping和fping命令檢測(cè)服務(wù)器是否可以ping通,需要的朋友可以參考下2015-01-01
Python實(shí)現(xiàn)添加或移除PowerPoint中的背景圖和背景顏色
在處理 PowerPoint 演示文稿時(shí),我們常常會(huì)遇到需要為幻燈片添加或移除背景的情況,本文將介紹如何使用 Python 在 PowerPoint 中添加或移除背景,并提供詳細(xì)步驟和代碼示例,幫助你快速上手2026-05-05
淺談算法之最小生成樹Kruskal的Python實(shí)現(xiàn)
最小生成樹Kruskal算法可以稱為“加邊法”,初始最小生成樹邊數(shù)為0,每迭代一次就選擇一條滿足條件的最小代價(jià)邊,加入到最小生成樹的邊集合里。本文將介紹它的原理,并用Python進(jìn)行實(shí)現(xiàn)2021-06-06

