首頁 > 軟體

matplotlib之Pyplot模組繪製三維散點圖使用顏色表示數值大小

2022-08-10 14:03:09

一、摘要

在進行資料視覺化時,對於一元函數f(x)=y資料我們可以使用二維平面圖顯示,x軸表示自變數,y軸表示函數值;對於二元函數f(x,y)=z資料我們也可以使用三維圖視覺化,x和y軸表示自變數,z軸表示函數值。由於顯示裝置的侷限性,對於三元函數f(x,y,z)=v資料無法通過增加座標軸的方式視覺化,一個可行的方法是使用x、y和z軸表示自變數,使用資料點的顏色表示函數值。

如下圖所示:

本文實現瞭如上圖所示的三維散點圖,顏色表示數值大小,並增加了可以自定義範圍的側邊colorbar。

文章第二部分為實現程式碼及部分註釋,第三部分為對部分程式碼的詳細解釋,第四部分為參考的文章連結。

二、程式碼

import matplotlib.colors 
import matplotlib.ticker
import matplotlib.pyplot as plt
import random
# 1.0 初始化資料
# f(x,y,z) = v
# 其中x,y,z為亂數,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 根據各個點的值(v[]),設定點的顏色值,每個點的顏色使用一個rgb三維的元組表示,例如,若想讓點顯示為紅色,則顏色值為(1.0,0,0)
# 設定各個點的顏色
# 每個點的顏色值按照colormap("seismic",100)進行設計,其中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')
# 設定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 增加側邊colorbar
# 設定側邊colorbar,colorbar上顯示的值使用lambda方程設定
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()

執行結果如下:

三、部分程式碼解釋

1. colormap(顏色)對映設定。

如上圖所示,為了通過顏色表示各個點的值需要設定一個合理的值-點顏色對映關係。本文程式碼中使用"seismic"colormap,同時設定colormap分為100個level。對應程式碼為:

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)可以得到對應x級別的顏色程式碼值。例如:

a = plt.get_cmap("seismic",100)(0)
b = plt.get_cmap("seismic",100)(100)
print("a:", a)
print("b:", b)

輸出結果為:

a: (0.0, 0.0, 0.3, 1.0)
b: (0.5, 0.0, 0.0, 1.0)

表示級別0對應的(r,g,b,alpha)顏色值為(0.0, 0.0, 0.3, 1.0),級別100對應的顏色值為(0.5, 0.0, 0.0, 1.0)

如果需要使用其他型別的colormap,可以通過設定colormap名得到不同的效果,詳細參考文章:python matplotlib自定義colorbar顏色條-以及matplotlib中的內建色條

2. 設定三維散點格式

通過設定plot格式:

ax = fig.add_subplot(111,projection='3d')

再使用scatter()函數繪製三維散點圖:

im = ax.scatter(x, y, z, s=100,c=color,marker='.')

其中s=100為設定點的大小、c=color為設定點的顏色,marker='.'為設定點的形狀(此處為實心圓點)。

3. 設定側邊colorbar

根據資料的格式,我們需要設定側邊colorbar顯示的數值範圍,例如,本例中最小值為825,最大值為784179。程式碼中使用lambda表示式計算顯示的值,預設顯示的值為[0,1],因此需要使用lambda公式將顯示的值調整到[825,784179]。程式碼如下:

fig.colorbar(im, format=matplotlib.ticker.FuncFormatter(lambda x,pos:int(x*(max_v-min_v)+min_v)))

另外為了使點的顏色與colorbar顏色對應,需要使用

plt.set_cmap(plt.get_cmap("seismic", 100))

使的clormapcolorbar具有同樣的型別。

四、參考

[1]. MATLAB scatter 畫二維/三維散點圖時 用顏色表示數值大小 colorbar

[2]. 三維散點圖加colorbar

[3]. 【python影象處理】彩色對映

[4]. matplotlib的colorbar自定義刻度範圍

[5]. Python中lambda的使用

總結

到此這篇關於matplotlib之Pyplot模組繪製三維散點圖使用顏色表示數值大小的文章就介紹到這了,更多相關Pyplot繪製三維散點圖內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com