matplotlib之Pyplot模塊繪制三維散點圖使用顏色表示數(shù)值大小
一、摘要
在進行數(shù)據(jù)可視化時,對于一元函數(shù)f(x)=y
數(shù)據(jù)我們可以使用二維平面圖顯示,x軸表示自變量,y軸表示函數(shù)值;對于二元函數(shù)f(x,y)=z
數(shù)據(jù)我們也可以使用三維圖可視化,x和y軸表示自變量,z軸表示函數(shù)值。由于顯示設(shè)備的局限性,對于三元函數(shù)f(x,y,z)=v
數(shù)據(jù)無法通過增加坐標軸的方式可視化,一個可行的方法是使用x、y和z軸表示自變量,使用數(shù)據(jù)點的顏色表示函數(shù)值。
如下圖所示:
本文實現(xiàn)了如上圖所示的三維散點圖,顏色表示數(shù)值大小,并增加了可以自定義范圍的側(cè)邊colorbar。
文章第二部分為實現(xiàn)代碼及部分注釋,第三部分為對部分代碼的詳細解釋,第四部分為參考的文章鏈接。
二、代碼
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為隨機數(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ù)各個點的值(v[]),設(shè)置點的顏色值,每個點的顏色使用一個rgb三維的元組表示,例如,若想讓點顯示為紅色,則顏色值為(1.0,0,0) # 設(shè)置各個點的顏色 # 每個點的顏色值按照colormap("seismic",100)進行設(shè)計,其中colormap類型為"seismic",共分為100個級別(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 顯示三維散點圖 # 新建一個figure() fig = plt.figure() # 在figure()中增加一個subplot,并且返回axes ax = fig.add_subplot(111,projection='3d') # 設(shè)置colormap,與上面提到的類似,使用"seismic"類型的colormap,共100個級別 plt.set_cmap(plt.get_cmap("seismic", 100)) # 繪制三維散點,各個點顏色使用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 增加坐標軸標簽 ax.set_xlabel('x') ax.set_ylabel('y') ax.set_zlabel('z') # 2.3顯示 plt.show()
運行結(jié)果如下:
三、部分代碼解釋
1. colormap(顏色)映射設(shè)置。
如上圖所示,為了通過顏色表示各個點的值需要設(shè)定一個合理的值-點顏色映射關(guān)系。本文代碼中使用"seismic"
colormap,同時設(shè)置colormap分為100個level。對應(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)
會得到一個colormap對象,然后使用plt.get_cmap("seismic",100)(x)
可以得到對應(yīng)x
級別的顏色代碼值。例如:
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)
表示級別0對應(yīng)的(r,g,b,alpha)顏色值為(0.0, 0.0, 0.3, 1.0)
,級別100對應(yīng)的顏色值為(0.5, 0.0, 0.0, 1.0)
。
如果需要使用其他類型的colormap,可以通過設(shè)置colormap名得到不同的效果,詳細參考文章:python matplotlib自定義colorbar顏色條-以及matplotlib中的內(nèi)置色條。
2. 設(shè)置三維散點格式
通過設(shè)置plot格式:
ax = fig.add_subplot(111,projection='3d')
再使用scatter()
函數(shù)繪制三維散點圖:
im = ax.scatter(x, y, z, s=100,c=color,marker='.')
其中s=100
為設(shè)置點的大小、c=color
為設(shè)置點的顏色,marker='.'
為設(shè)置點的形狀(此處為實心圓點)。
3. 設(shè)置側(cè)邊colorbar
根據(jù)數(shù)據(jù)的格式,我們需要設(shè)置側(cè)邊colorbar顯示的數(shù)值范圍,例如,本例中最小值為825
,最大值為784179
。代碼中使用lambda表達式計算顯示的值,默認顯示的值為[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)))
另外為了使點的顏色與colorbar顏色對應(yīng),需要使用
plt.set_cmap(plt.get_cmap("seismic", 100))
使的clormap
和colorbar
具有同樣的類型。
四、參考
[1]. MATLAB scatter 畫二維/三維散點圖時 用顏色表示數(shù)值大小 colorbar
[2]. 三維散點圖加colorbar
[3]. 【python圖像處理】彩色映射
[4]. matplotlib的colorbar自定義刻度范圍
總結(jié)
到此這篇關(guān)于matplotlib之Pyplot模塊繪制三維散點圖使用顏色表示數(shù)值大小的文章就介紹到這了,更多相關(guān)Pyplot繪制三維散點圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python獲取全國城市pm2.5、臭氧等空氣質(zhì)量過程解析
這篇文章主要介紹了python獲取全國城市pm2.5、臭氧等空氣質(zhì)量過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10Ubuntu 16.04 LTS中源碼安裝Python 3.6.0的方法教程
最近Python 3發(fā)布了新版本Python 3.6.0,好像又加入了不少黑魔法!由于暫時不能使用 apt-get 的方式安裝 Python 3.6,所以還是直接編譯源碼安裝吧。下面這篇文章就介紹了在Ubuntu 16.04 LTS中源碼安裝Python 3.6.0的方法教程,需要的朋友可以參考下。2016-12-12python-opencv獲取二值圖像輪廓及中心點坐標的代碼
今天小編就為大家分享一篇python-opencv獲取二值圖像輪廓及中心點坐標的代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python實現(xiàn)輸入二叉樹的先序和中序遍歷,再輸出后序遍歷操作示例
這篇文章主要介紹了Python實現(xiàn)輸入二叉樹的先序和中序遍歷,再輸出后序遍歷操作,涉及Python基于先序遍歷和中序遍歷構(gòu)造二叉樹,再后序遍歷輸出相關(guān)操作技巧,需要的朋友可以參考下2018-07-07Django url,從一個頁面調(diào)到另個頁面的方法
今天小編就為大家分享一篇Django url,從一個頁面調(diào)到另個頁面的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08