天天看點

⚡機器學習⚡中Python實作可視化三維熱力圖(地形圖)

由于項目的需要,一直苦于将多層資料集累加起來做成一個呈堆積狀的三維圖,有點類似于地形圖(實則熱力圖),但又不是地形圖。

⚡機器學習⚡中Python實作可視化三維熱力圖(地形圖)

背景

先說說項目背景,本菜雞是搞故障診斷的,是以免不了用上一些統計學的知識,看過之前我的Blog的都會發現,T 2 T^2T

2

 和 S P E SPESPE 在故障診斷鄰域或者說是再小範圍一點,在過程監控鄰域,是很好用且很關鍵的兩個統計量,用于監測過程中的一些有故障的檢測點或者區間,會有門檻值限,超過門檻值的則判斷為故障,反而,則為正常。具體可以看->這裡。

三維圖

之前嘗試過很多中方法來實作三維圖,但是,。。。,但是均沒實作完美的效果,如Echarts、Pyecharts、Plotly等等,最終還是隻有用yyds,真的,沒有它解決不了的可視化問題!!!

輸入

⚡機器學習⚡中Python實作可視化三維熱力圖(地形圖)
⚡機器學習⚡中Python實作可視化三維熱力圖(地形圖)

(資料就像上面那樣,這裡我們以 T 2

 的多層可視化為例展開吧)

那麼下面我們直接開始搞可視化吧!!!

輸出

輸出最終則為我們的可視化三維圖,先不爆料,看後續。

可視化

我們用的Python來實作可視化。

導入庫

庫先給導入進來:

import matplotlib.pyplot as plt    # 可視化的matplotlib庫
import pandas as pd                # 資料表操作的庫
from mpl_toolkits.mplot3d import Axes3D   # 三維可視化
from icecream import ic            # 類似于print輸出      

封裝一些Function

雖然我們的代碼不是很長,但為了代碼的規範和美觀,建議還是講其封裝為一個一個的function,這樣調用起來更友善。

  1. 讀取資料表
def loaddata(filename):
    """
    讀取傳入得資料表
    """
    dtf = pd.read_csv(filename)    # 讀取表格檔案

    return dtf      

T2 三維熱力圖

def T2_plot(df_value, df_xy):
    """
    繪制T2三維熱力圖  
    """
    #擷取行列數
    q1 = df_value.shape[1]  # 列數
    r1 = df_value.shape[0]  # 行數
    print('x_y有%r行,%r列。' % (r1, q1))

    X = []
    Y = []
    Z = []
    # 設定空數組備用

    for a in range(2, q1):  # 選擇需要疊加的Value量選值範圍2~11, 應該周遊所有列,因為每個資料表的次元不一定一緻,是以最大通過擷取的列傳入
        for xx in range(r1 + 1):  # 循環疊代不同的層數
            if xx < r1:
                IIx = df_xy.iloc[xx, 0]  # 取第一列的值
                IIy = df_xy.iloc[xx, 1]  # 取第二列的值
                IIz = df_value.iloc[xx, a]  # 取相應的T2或SPE的值

                # 将每個坐标軸X,y及其T2或SPE的值存入一個list中
                X.append(IIx)
                Y.append(IIy)
                Z.append(IIz)

    ic(len(Z))  # 檢視Z的數量
    # 開始制圖
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.set_xlabel('IX', fontsize=10, color='black')  # 設定x标簽及其參數
    ax.set_ylabel('JY', fontsize=10, color='black')  # 設定y标簽及其參數
    ax.set_zlabel('Value', fontsize=10, color='black')   # 設定z标簽及其參數
    ax.plot_trisurf(X, Y, Z, cmap=plt.get_cmap('jet'), linewidth=0.1)  # 三角表面圖
    plt.show()    # 渲染3D圖顯示      
  1. 主函數
# 主函數
if __name__=="__main__":
    # 導入資料表檔案名
    T2_name = "T2.csv"
    xy_name = "x_y.csv"

    # 讀取資料表
    t2 = loaddata(T2_name)
    xy = loaddata(xy_name)

    # 制作T2三維圖
    T2_plot(df_value=t2, df_xy=xy)      

最終的效果圖像這樣:

⚡機器學習⚡中Python實作可視化三維熱力圖(地形圖)

換個方位再來一張:

⚡機器學習⚡中Python實作可視化三維熱力圖(地形圖)

讓我們再看看底部:

⚡機器學習⚡中Python實作可視化三維熱力圖(地形圖)

深色的地方則是有多個相近的點堆積到一起的,是以會在那些點顯得顔色很深。

來個大彙總,完整代碼:

import matplotlib.pyplot as plt
import pandas as pd
from mpl_toolkits.mplot3d import Axes3D
from icecream import ic

# 讀取資料表
def loaddata(filename):
    """
    讀取傳入得資料表
    """
    dtf = pd.read_csv(filename)    # 讀取表格檔案

    return dtf

# T2三維熱力圖
def T2_plot(df_value, df_xy):
    """
    繪制T2三維熱力圖  todo:完善
    """
    #擷取行列數
    q1 = df_value.shape[1]  # 列數
    r1 = df_value.shape[0]  # 行數
    print('x_y有%r行,%r列。' % (r1, q1))

    X = []
    Y = []
    Z = []
    # 設定空數組備用

    for a in range(2, q1):  # 選擇需要疊加的Value量選值範圍2~11, 應該周遊所有列,因為每個資料表的次元不一定一緻,是以最大通過擷取的列傳入
        for xx in range(r1 + 1):  # 循環疊代不同的層數
            if xx < r1:
                IIx = df_xy.iloc[xx, 0]  # 取第一列的值
                IIy = df_xy.iloc[xx, 1]  # 取第二列的值
                IIz = df_value.iloc[xx, a]  # 取相應的T2或SPE的值

                # 将每個坐标軸X,y及其T2或SPE的值存入一個list中
                X.append(IIx)
                Y.append(IIy)
                Z.append(IIz)

    ic(len(Z))  # 檢視Z的數量
    # 開始制圖
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.set_xlabel('IX', fontsize=10, color='black')  # 設定x标簽及其參數
    ax.set_ylabel('JY', fontsize=10, color='black')  # 設定y标簽及其參數
    ax.set_zlabel('Value', fontsize=10, color='black')   # 設定z标簽及其參數
    ax.plot_trisurf(X, Y, Z, cmap=plt.get_cmap('jet'), linewidth=0.1)  # 三角表面圖
    plt.show()    # 渲染3D圖顯示

# 主函數
if __name__=="__main__":
    # 導入資料表檔案名
    T2_name = "T2.csv"
    xy_name = "x_y.csv"

    # 讀取資料表
    t2 = loaddata(T2_name)
    xy = loaddata(xy_name)

    # 制作T2三維圖
    T2_plot(df_value=t2, df_xy=xy)