1. 程式人生 > >python3__常用資料分析圖形(熱力圖,雷達圖,箱線圖,平行座標,3D表面圖)

python3__常用資料分析圖形(熱力圖,雷達圖,箱線圖,平行座標,3D表面圖)

1.matplotlib.pyplot簡介

matplotlib.pyplot是一個有命令風格的函式集合,它看起來和MATLAB很相似。每一個pyplot函式都使一副影象做出些許改變,例如建立一幅圖,在圖中建立一個繪圖區域,在繪圖區域中新增一條線等等。在matplotlib.pyplot中,各種狀態通過函式呼叫儲存起來,以便於可以隨時跟蹤像當前影象和繪圖區域這樣的東西。繪圖函式是直接作用於當前axes(matplotlib中的專有名詞,圖形中組成部分,不是數學中的座標系。)

2.熱力圖

檢視資料表中多個特徵兩兩的相似度

2.1 函式介面

import seaborn as sns

seaborn.heatmap(data, vmin=None, vmax=None,cmap=None, center=None, robust=False, annot=None, fmt=’.2g’, annot_kws=None,linewidths=0, linecolor=’white’, cbar=True, cbar_kws=None, cbar_ax=None,square=False, xticklabels=’auto’, yticklabels=’auto’, mask=None, ax=None,**kwargs)

2.1.1 輸入資料

data

: 矩陣資料集,可以是numpy的陣列(array),也可以是pandas的DataFrame。如果是DataFrame,則df的index(行標)/column(列標)資訊會分別對應到heatmap的columns和rows,即pt.index是熱力圖的行標,pt.columns是熱力圖的列標

2.1.2 熱力圖矩陣塊顏色設定

vmin\vmax: 熱力圖的顏色取值最大和最小範圍,預設是根據data資料表裡的取值確定

cmap: 從數字到色彩空間的對映,取值是matplotlib包裡的colormap名稱或顏色物件,或者表示顏色的列表;改引數預設值:根據center引數設定

center: 資料表取值有差異時,設定熱力圖的色彩中心對齊值;通過設定center值,可以調整生成的影象顏色的整體深淺;設定center資料時,如果有資料溢位,則手動設定的vmax、vmin會自動改變

robust: 預設取值False;如果是False,且沒設定vmin和vmax的值,熱力圖的顏色對映範圍根據具有魯棒性的分位數設定,而不是用極值設定

2.1.3 矩陣塊註釋引數

annot: 矩陣塊是(True)否(False)寫入資料。如果是矩陣,在熱力圖每個方格寫入該矩陣對應位置資料

fmt: 字串格式程式碼,矩陣上標識數字的資料格式,比如保留小數點後幾位數字

annot_kws: 預設取值False;如果是True,設定熱力圖矩陣上數字的大小顏色字型,matplotlib包text類下的字型設定

2.1.4 矩陣塊間隔與間隔線

linewidths:定義熱力圖裡“表示兩兩特徵關係的矩陣小塊”之間的間隔大小(塊之間的間隔)

linecolor:切分熱力圖上每個矩陣小塊的線的顏色,預設值是’white’(切分矩陣塊的線的顏色)

2.1.5 側邊顏色刻度條設定

cbar: True.矩陣側邊繪製顏色刻度條

cbar_kws: 側邊顏色刻度條字號,字型,顏色等的設定

cbar_ax: 側邊顏色條位置設定

2.1.6 其他設定

square: 設定熱力圖矩陣小塊形狀,預設值是False

xticklabels, yticklabels: xticklabels控制每列標籤名的輸出;yticklabels控制每行標籤名的輸出。預設值是auto。如果是True,則以DataFrame的列名作為標籤名。如果是False,則不新增行標籤名。如果是列表,則標籤名改為列表中給的內容。如果是整數K,則在圖上每隔K個標籤進行一次標註。 如果是auto,則自動選擇標籤的標註間距,將標籤名不重疊的部分(或全部)輸出

mask: 控制某個矩陣塊是否顯示出來。預設值是None。如果是布林型的DataFrame,則將DataFrame裡True的位置用白色覆蓋掉

ax: 設定作圖的座標軸,一般畫多個子圖時需要修改不同的子圖的該值
**kwargs:All other keyword arguments are passed to ax.pcolormesh

2.2 實戰程式碼(特徵篩選)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns



# ====熱力圖
data = pd.read_csv("data/all_data_standard.csv", encoding="utf-8")
data.drop_duplicates()
data.columns = [i for i in range(data.shape[1])]

# 計算兩兩屬性之間的皮爾森相關係數
corrmat = data.corr()
f, ax = plt.subplots(figsize=(12, 9))

# 返回按“列”降序排列的前n行
k = 16
cols = corrmat.nlargest(k, data.columns[15]).index

# 返回皮爾遜積矩相關係數
cm = np.corrcoef(data[cols].values.T)
sns.set(font_scale=1.25)
hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt=".2f", annot_kws={"size": 10}, yticklabels=cols.values, xticklabels=cols.values)

plt.ylabel("features", fontsize=15)
plt.xlabel("features", fontsize=15)
plt.title("Thermal map", fontsize=15)
plt.show()

3.雷達圖(聚類特徵描述)

3.1 雷達圖說明

在資料探勘專案中多用於企業分析或價值分析的環節視覺化(系統分析的有效方法)。同時,還可用於對聚類後結果的特徵描述。

3.2 函式介面

正常的plot影象不作過多解釋,直接上程式碼

3.3 雷達圖方法一

import pandas as pd
import numpy as np
import seaborn as sns
From sklearn.cluster import KMeans


# ==========繪製聚類結果雷達圖
df_features = pd.read_csv("real_data.csv", encoding="utf-8")

# 構建聚類模型
estimater = KMeans(n_clusters=3)
estimater = estimater.fit(X=data)

# 統計樣本屬性個數
N = len(estimater.cluster_centers_[0])

# 將360度N等分,注意:要首位相接
angles = np.linspace(0, 2*np.pi, N, endpoint=False)
angles = np.concatenate((angles, [angles[0]]))

# 畫布上構建子圖
fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111, polar=True)
Sam = ["r", "g", "b"]

# 待顯示的圖例標籤
lab = []

# 遍歷所有聚類中心
for i in range(len(estimater.cluster_centers_)):
    values = estimater.cluster_centers_[i]
    features = data.columns
    values = np.concatenate((values, [values[0]]))
    ax.plot(angles, values, Sam[i], linewidth=2)

    # 顏色填充
    # ax.fill(angles, values, alpha=0.25)

    # 擺放特徵名稱
    ax.set_thetagrids(angles*180/np.pi, features)

    # 顯示軸網路
    ax.grid(True)
    lab.append("customer"+str(i))
plt.title("title")

# 顯示圖例
plt.legend(lab)
plt.show()

3.4 雷達圖方法二

pygal

一個python svg圖形繪相簿。免費的第三方庫,可自由進行修改,但沒有任何保證。內部提供的是一些繪圖的介面(條形圖,堆積條形圖,點狀圖,漏斗圖,箱型圖,儀表圖,實心儀表,直方圖,水平條形圖,水平堆積條形圖,線性圖,水平線圖,堆積線圖,水平堆積線圖,餅圖,水平金字塔圖,垂直金字塔圖,雷達圖,日期橫座標xy圖,DateTime橫座標xy圖,時間橫座標xy圖,TimeDelta橫座標xy圖,樹狀圖,XY線圖,),可直接進行繪圖,相對於pyplot要簡便一些。

import matplotlib.pyplot as plt
import pandas as pd
import pygal as pg


centers = [[55.46, 0.82, 30.06],
           [10.33, 0.88, 30.18],
           [10.71, 0.75, 29.84]]
df_features = pd.DataFrame(centers)
df_features.columns = ["a", "b", "c"]
df_features.index = ["aa", "bb", "cc"]

# 構建雷達圖物件
radar_chart = pg.Radar()

# 設定雷達圖示題
radar_chart._title = "Rader graph"

# 設定雷達圖x軸標籤
radar_chart.x_labels = df_features.index

# 在圖中新增物件
radar_chart.add("customer1", centers[0])
radar_chart.add("customer2", centers[1])
radar_chart.add("customer3", centers[2])

# 將圖寫入檔案(可瀏覽器開啟)
radar_chart.render_to_file('bar_chart.svg')

4.箱線圖

4.1 箱線圖簡介

箱線圖是一種用作顯示一組資料分散情況的統計圖。常用於品質管理。主要用於反應原始資料的分佈特徵,還可進行多組資料分佈特徵的比較。從箱線圖中可找出最大值最小值中位數下四分位數(25%)上四分位數(75%)異常值

注意:區間[Q1-1.5△Q, Q3+1.5△Q]之外的資料值被認為是異常值,應當被忽略。

4.2 第一種實現方式

通過matplotlib.pyplot實現

plt.boxplot(x, whis=None, labels=None)

引數:

x: 輸入資料。陣列(array)或容器的序列(a sequence of vectors)

whis: 浮點型,序列、字串(預設為1.5)。調整的是判斷異常值式(Q3-Q1)所佔的權重

labels: 序列(sequence)。並且,長度必須與資料集的維度相同。

import matplotlib.pyplot as plt
import pandas as pd


array = dataFile.iloc[:, 10:15].values

plt.rcParams["axes.unicode_minus"] = False
plt.rcParams["font.sans-serif"] = "SimHei"

plt.boxplot(x=array, labels=["one", "two", "three", "four", "five"], whis=1.5)
plt.xlabel("Attribute")
plt.ylabel("Score")
plt.show()

4.3 第二種實現方式

pandas自帶的畫圖工具(圖片感覺不美觀)

DataFrame.boxplot(grouped, subplots=True, column=None, fontsize=None, rot=0, grid=True, ax=None, figsize=None, layout=None, **kwds)

plt.show()

引數:

column: 待繪製箱線圖的屬性列。列名(字串)、列表、容器。

fontsize: 圖中文字大小。整形(int)或字元型(str)

rot: xlabels傾斜的角度。整形(int: 正負均可)、浮點型(float)、字串(str)

grid: 是否顯示圖片中的網格。預設為True

figsize: 圖片大小。元組 -> (長,寬)

import pandas as pd
import matplotlib.pyplot as plt


dataFile = pd.read_csv("dataTest.csv", header=None, prefix="V")
dataFile = dataFile.iloc[:, 10:15]
dataFile.boxplot(column="V10", fontsize="22", rot=45)
plt.show()

4.4 第三種方式實現

from pylab import *

boxplot(x, whis=None, labels=None)

引數:

x: 繪製箱線圖的屬性列資料。array

whis: 判斷異常值時的權重 [Q1-whis * △Q, Q3+whis * △Q]

labels: xlabels的名稱。列表,長度應當與繪圖資料的屬性個數相同

show()

from pylab import *
import matplotlib.pyplot as plt
import pandas as pd


dataFile = pd.read_csv("dataTest.csv", header=None, prefix="V")
dataFile = dataFile.iloc[:, 10:15]

boxplot(dataFile.values, whis=0.5, labels=["V10", "V11", "V12", "V13", "V14"])
show()

5. 平行座標

平行座標是一種比較常見的視覺化方法,用於對高緯集合和多元資料的視覺化。平行座標為了表示在高緯空間中的一個點集,在N條平行的線的背景下(一般這N條線都豎直且等距),一個在高緯空間的點被表示為一條拐點在N條平行座標軸的折線,在第K個座標軸的位置就表示這個點在第K緯的值,平行座標是資訊視覺化的一種重要技術。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np


df_features = pd.read_csv("dataTest.csv", encoding="utf-8", header=None, prefix="V")

summary = df_features.describe()
minRings = -1
maxRings = 99
nrows = 10

for i in range(nrows):
    dataRow = df_features.iloc[i, 1:10]
    labelColor = (df_features.iloc[i, 10] - minRings)/(maxRings - minRings)
    # dataRow.plot(colors=plt.cm.RdY1Bu(labelColor), alpha=0.5)
    dataRow.plot(alpha=0.5)

plt.xlabel("Attribute")
plt.ylabel("Score")
plt.show()

6.D表面圖

6.1 所需第三方庫

from mpl_toolkits.mplot3d import Axes3D

mplot3d模組中的Axes3D繪圖類

from matplotlib.ticker import LinearLocator, FormatStrFormatter

ticker模組主要提供“刻度的劃分”和“刻度值的格式化”

matplotlib包中ticker模組中LinearLocator類(刻度劃分)和FormatStrFormatter類(使用“%”來格式化軸刻度值)from matplotlib import cm

matplot內建的色彩對映模組

6.2 重點函式

①ax = Axes3D(fig):將matplotlib.figure.Figure物件轉換成rect=[left, bottom, width, height]的3D物件

②np.meshgrid(*xi, indexing, sparse, copy, **kwargs):將座標向量轉換成座標矩陣

【引數】

*xi:表示網格座標的一維陣列

indexing:設定輸出索引的形式。(笛卡爾("xy")和矩陣("ij"))

sparse: 預設為False.若為True,則為節省記憶體返回稀疏網格

copy: 預設為True.若為False, 則為節省記憶體返回原始陣列。(sparse=False, copy=False很有可能返回非連續陣列)

【調整結果展示】

①x1:向下拓展

②x2:向右拓展

③組合成(x1, x2)座標,並將其定位;

④將(x1, x2)帶入f中求解出對應的Z軸數值

③Axes3d.plot_surface(x, y, z, rcount, ccount, rstride, cstride, color, cmap, facecolors, norm, vmin, vmax, shade, *kwargs): 建立表面圖

【引數】

x, y, z: 二維陣列

rcount, ccount: 每個方向上的最大樣本數。預設為50

rstride, cstride: 同rcount 和 ccount的作用都是為了精簡座標軸不同方向的樣本數量,因此不能同時設定。預設為10.

color: 表面貼片的顏色surface patches

cmap: 表面貼片的顏色對映 Colormap

facecolors: 每個小塊的顏色(list形式)

norm, vmin, vmax: 顏色對映標準化,標準化的下限和上限

shade: 是否給表面的顏色打上陰影

linewidth: 線條的寬度

antialiased: 是否平滑(True or False)

# ==========python繪製3D表面圖(3維圖)
# class Axes3D: 3D繪圖類
# module ticker: 提供 ”刻度的定位“ 及 ”刻度的格式化“
# class LinearLocator: 刻度劃分
# class FormatStrFormatter: 使用“%”來格式化軸刻度值
# module cm: 內建的色彩對映模組
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import numpy as np
from matplotlib import cm


fig = plt.figure(figsize=(10, 8))

# 將matplotlib.figure.Figure物件轉換成rect=[left, bottom, width, height]的3D物件
ax = Axes3D(fig=fig)

X = np.arange(-5, 5, step=0.1)
Y = np.arange(-5, 5, step=0.1)

# np.meshgrid: 座標向量轉變為座標矩陣
X, Y = np.meshgrid(X, Y, indexing="xy", sparse=True, )
R = np.sqrt(X**2 + Y**2)
Z = np.cos(R)

# ax.plot_surface: 建立表面圖
# ax.set_zlim: 設定3D圖中z軸的數值
# ax.zaxis: 初始化3D軸
# LinearLocator(numticks=10): 將z軸刻度劃分為10部分
# FormatStrFormatter("%.2f"):z軸刻度值表裡路兩位小數
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap("rainbow"), linewidth=0, antialiased=False)
ax.set_zlim(-1.01, 1.01)
ax.xaxis.set_major_locator(LinearLocator(numticks=10))
ax.xaxis.set_major_formatter(FormatStrFormatter("%.1f"))
ax.yaxis.set_major_locator(LinearLocator(numticks=10))
ax.yaxis.set_major_formatter(FormatStrFormatter("%.1f"))
ax.zaxis.set_major_locator(LinearLocator(numticks=10))
ax.zaxis.set_major_formatter(FormatStrFormatter("%.1f"))

# fig.colorbar: 建立顏色欄
# shrink: 顏色條長度的收縮比
# aspect: 顏色條寬度
fig.colorbar(surf, aspect=5, shrink=0.5)
plt.show()