1. 程式人生 > 程式設計 >Python實現平行座標圖的繪製(plotly)方式

Python實現平行座標圖的繪製(plotly)方式

平行座標圖簡介

當資料的維度超過三維時,此時資料的視覺化就變得不再那麼簡單。為解決高維資料的視覺化問題,我們可以使用平行座標圖。以下關於平行座標圖的解釋引自百度百科:為了克服傳統的笛卡爾直角座標系容易耗盡空間、 難以表達三維以上資料的問題, 平行座標圖將高維資料的各個變數用一系列相互平行的座標軸表示, 變數值對應軸上位置。為了反映變化趨勢和各個變數間相互關係,往往將描述不同變數的各點連線成折線。所以平行座標圖的實質是將m維歐式空間的一個點Xi(xi1,xi2,...,xim) 對映到二維平面上的一條曲線。在N條平行的線的背景下,(一般這N條線都豎直且等距),一個在高維空間的點可以被表示為一條拐點在N條平行座標軸的折線,在第K個座標軸上的位置就表示這個點在第K個維的值。

繪製平行座標圖

本文主要介紹兩種利用Python繪製平行座標圖的方法,分別是利用pandas包繪製和利用plotly包繪製(預設已安裝pandas包和plotly包)。

利用pandas實現平行座標圖的繪製

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from pandas.plotting import parallel_coordinates
 
data = sns.load_dataset('iris')
 
fig,axes = plt.subplots()
parallel_coordinates(data,'species',ax=axes)
fig.savefig('parallel.png')

繪製的平行座標圖如下所示:

從上圖可以看到x軸上變數共用一個y座標軸,此時因sepal_length、sepal_width、petal_length以及petal_width這四個變數的值得範圍相近,利用這種方式作出的共用y軸的平行座標圖有著很好的視覺化效果;但假如sepal_length、sepal_width、petal_length以及petal_width這些變數的值的範圍相差較大時,這種共用y軸的平行座標圖就不再適用,此時我們需要的是y軸獨立的平行座標圖。下面介紹的另一種方法實現的就是y軸獨立的平行座標圖。

利用plotly實現平行座標圖的繪製

plotly繪圖有兩種模式,一種是online模式,另一種是offline模式。本文使用的是offline模式,且是在jupyter notebook中進行繪圖。

首先熟悉一下plotly的繪圖方式:

import plotly as py
import plotly.graph_objs as go
py.offline.init_notebook_mode(connected=True) # 初始化設定
 
py.offline.iplot({
 "data": [go.Parcoords(
  line = dict(color = 'blue'),dimensions = list([
   dict(range = [1,5],constraintrange = [1,2],label = 'A',values = [1,4]),dict(range = [1.5,tickvals = [1.5,3,4.5],label = 'B',values = [3,1.5]),dict(range = [1,tickvals = [1,2,4,label = 'C',values = [2,4],ticktext = ['text 1','text 2','text 3','text 4']),label = 'D',values = [4,2])
  ])
 )],"layout": go.Layout(title="My first parallel coordinates")
})

繪製圖形如下所示:

繪製鳶尾花資料的平行座標圖:

df = sns.load_dataset('iris')
df['species_id'] = df['species'].map({'setosa':1,'versicolor':2,'virginica':3}) #用於顏色對映
 
py.offline.iplot({
 "data": [go.Parcoords(
  line = dict(color = df['species_id'],colorscale = [[0,'#D7C16B'],[0.5,'#23D8C3'],[1,'#F3F10F']]),dimensions = list([
   dict(range = [2,8],constraintrange = [4,label = 'Sepal Length',values = df['sepal_length']),6],label = 'Sepal Width',values = df['sepal_width']),dict(range = [0,label = 'Petal Length',values = df['petal_length']),label = 'Petal Width',values = df['petal_width'])
  ])
 )],"layout": go.Layout(title='Iris parallel coordinates plot')
})

繪製的圖形如下所示:

注:關於plotly.offline.iplot、go.Parcoords以及go.Layout的用法可以利用help關鍵字檢視相關幫助文件,與pyecharts不同,plotly提供的幫助文件非常詳細。

以上這篇Python實現平行座標圖的繪製(plotly)方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。