matplotlib之Pyplot模塊繪制三維散點(diǎn)圖使用顏色表示數(shù)值大小
一、摘要
在進(jìn)行數(shù)據(jù)可視化時(shí),對(duì)于一元函數(shù)f(x)=y數(shù)據(jù)我們可以使用二維平面圖顯示,x軸表示自變量,y軸表示函數(shù)值;對(duì)于二元函數(shù)f(x,y)=z數(shù)據(jù)我們也可以使用三維圖可視化,x和y軸表示自變量,z軸表示函數(shù)值。由于顯示設(shè)備的局限性,對(duì)于三元函數(shù)f(x,y,z)=v數(shù)據(jù)無(wú)法通過(guò)增加坐標(biāo)軸的方式可視化,一個(gè)可行的方法是使用x、y和z軸表示自變量,使用數(shù)據(jù)點(diǎn)的顏色表示函數(shù)值。
如下圖所示:

本文實(shí)現(xiàn)了如上圖所示的三維散點(diǎn)圖,顏色表示數(shù)值大小,并增加了可以自定義范圍的側(cè)邊colorbar。
文章第二部分為實(shí)現(xiàn)代碼及部分注釋,第三部分為對(duì)部分代碼的詳細(xì)解釋,第四部分為參考的文章鏈接。
二、代碼
import matplotlib.colors
import matplotlib.ticker
import matplotlib.pyplot as plt
import random
# 1.0 初始化數(shù)據(jù)
# f(x,y,z) = v
# 其中x,y,z為隨機(jī)數(shù),v=x*y*z
x = [random.randint(0,100) for i in range(0,100)]
y = [random.randint(0,100) for i in range(0,100)]
z = [random.randint(0,100) for i in range(0,100)]
v = [x[i]*y[i]*z[i] for i in range(0,100)]
# 1.1 根據(jù)各個(gè)點(diǎn)的值(v[]),設(shè)置點(diǎn)的顏色值,每個(gè)點(diǎn)的顏色使用一個(gè)rgb三維的元組表示,例如,若想讓點(diǎn)顯示為紅色,則顏色值為(1.0,0,0)
# 設(shè)置各個(gè)點(diǎn)的顏色
# 每個(gè)點(diǎn)的顏色值按照colormap("seismic",100)進(jìn)行設(shè)計(jì),其中colormap類型為"seismic",共分為100個(gè)級(jí)別(level)
min_v = min(v)
max_v = max(v)
color = [plt.get_cmap("seismic", 100)(int(float(i-min_v)/(max_v-min_v)*100)) for i in v]
# 2.0 顯示三維散點(diǎn)圖
# 新建一個(gè)figure()
fig = plt.figure()
# 在figure()中增加一個(gè)subplot,并且返回axes
ax = fig.add_subplot(111,projection='3d')
# 設(shè)置colormap,與上面提到的類似,使用"seismic"類型的colormap,共100個(gè)級(jí)別
plt.set_cmap(plt.get_cmap("seismic", 100))
# 繪制三維散點(diǎn),各個(gè)點(diǎn)顏色使用color列表中的值,形狀為"."
im = ax.scatter(x, y, z, s=100,c=color,marker='.')
# 2.1 增加側(cè)邊colorbar
# 設(shè)置側(cè)邊colorbar,colorbar上顯示的值使用lambda方程設(shè)置
fig.colorbar(im, format=matplotlib.ticker.FuncFormatter(lambda x,pos:int(x*(max_v-min_v)+min_v)))
# 2.2 增加坐標(biāo)軸標(biāo)簽
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
# 2.3顯示
plt.show()
運(yùn)行結(jié)果如下:

三、部分代碼解釋
1. colormap(顏色)映射設(shè)置。
如上圖所示,為了通過(guò)顏色表示各個(gè)點(diǎn)的值需要設(shè)定一個(gè)合理的值-點(diǎn)顏色映射關(guān)系。本文代碼中使用"seismic"colormap,同時(shí)設(shè)置colormap分為100個(gè)level。對(duì)應(yīng)代碼為:
color = [plt.get_cmap("seismic", 100)(int(float(i-min_v)/(max_v-min_v)*100)) for i in v]
在代碼中plt.get_cmap("seismic",100)會(huì)得到一個(gè)colormap對(duì)象,然后使用plt.get_cmap("seismic",100)(x)可以得到對(duì)應(yīng)x級(jí)別的顏色代碼值。例如:
a = plt.get_cmap("seismic",100)(0)
b = plt.get_cmap("seismic",100)(100)
print("a:", a)
print("b:", b)
輸出結(jié)果為:
a: (0.0, 0.0, 0.3, 1.0)
b: (0.5, 0.0, 0.0, 1.0)
表示級(jí)別0對(duì)應(yīng)的(r,g,b,alpha)顏色值為(0.0, 0.0, 0.3, 1.0),級(jí)別100對(duì)應(yīng)的顏色值為(0.5, 0.0, 0.0, 1.0)。
如果需要使用其他類型的colormap,可以通過(guò)設(shè)置colormap名得到不同的效果,詳細(xì)參考文章:python matplotlib自定義colorbar顏色條-以及matplotlib中的內(nèi)置色條。
2. 設(shè)置三維散點(diǎn)格式
通過(guò)設(shè)置plot格式:
ax = fig.add_subplot(111,projection='3d')
再使用scatter()函數(shù)繪制三維散點(diǎn)圖:
im = ax.scatter(x, y, z, s=100,c=color,marker='.')
其中s=100為設(shè)置點(diǎn)的大小、c=color為設(shè)置點(diǎn)的顏色,marker='.'為設(shè)置點(diǎn)的形狀(此處為實(shí)心圓點(diǎn))。
3. 設(shè)置側(cè)邊colorbar
根據(jù)數(shù)據(jù)的格式,我們需要設(shè)置側(cè)邊colorbar顯示的數(shù)值范圍,例如,本例中最小值為825,最大值為784179。代碼中使用lambda表達(dá)式計(jì)算顯示的值,默認(rèn)顯示的值為[0,1],因此需要使用lambda公式將顯示的值調(diào)整到[825,784179]。代碼如下:
fig.colorbar(im, format=matplotlib.ticker.FuncFormatter(lambda x,pos:int(x*(max_v-min_v)+min_v)))
另外為了使點(diǎn)的顏色與colorbar顏色對(duì)應(yīng),需要使用
plt.set_cmap(plt.get_cmap("seismic", 100))使的clormap和colorbar具有同樣的類型。
四、參考
[1]. MATLAB scatter 畫(huà)二維/三維散點(diǎn)圖時(shí) 用顏色表示數(shù)值大小 colorbar
[2]. 三維散點(diǎn)圖加colorbar
[3]. 【python圖像處理】彩色映射
[4]. matplotlib的colorbar自定義刻度范圍
總結(jié)
到此這篇關(guān)于matplotlib之Pyplot模塊繪制三維散點(diǎn)圖使用顏色表示數(shù)值大小的文章就介紹到這了,更多相關(guān)Pyplot繪制三維散點(diǎn)圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Flask搭建虛擬環(huán)境并運(yùn)行第一個(gè)flask程序
這篇文章主要介紹了Flask搭建虛擬環(huán)境并運(yùn)行第一個(gè)flask程序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
在Python中關(guān)于中文編碼問(wèn)題的處理建議
這篇文章主要介紹了幾種在Python中關(guān)于中文編碼問(wèn)題的處理方法,包括在使用Unicode編碼時(shí)碰到的異常等,需要的朋友可以參考下2015-04-04
Python實(shí)現(xiàn)微信高效自動(dòng)化操作
在如今數(shù)字化時(shí)代,人們對(duì)于效率的追求越來(lái)越強(qiáng)烈,而PyAutoGUI和Pyperclip作為Python中的兩個(gè)強(qiáng)大庫(kù),為我們實(shí)現(xiàn)自動(dòng)化操作提供了便利,下面我們就來(lái)看看如何利用這兩個(gè)庫(kù)實(shí)現(xiàn)微信自動(dòng)化操作吧2023-10-10
注意import和from import 的區(qū)別及說(shuō)明
這篇文章主要介紹了注意import和from import 的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
Python批量處理工作簿和工作表的實(shí)現(xiàn)示例
本文主要介紹了使用Python批量處理工作簿和工作表,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Python的Flask框架中Flask-Admin庫(kù)的簡(jiǎn)單入門(mén)指引
這篇文章主要介紹了一個(gè)Python的Flask框架中Flask-Admin庫(kù)簡(jiǎn)單入門(mén)的指引,包括介紹和簡(jiǎn)單的部署等,需要的朋友可以參考下2015-04-04

