摘要: 本文講述了熱圖、二維密度圖、蜘蛛圖、樹形圖這四種Python數據可視化方法。python
數據可視化是任何數據科學或機器學習項目的一個重要組成部分。人們經常會從探索數據分析(EDA)開始,來深刻了解數據,而且建立可視化確實有助於讓問題更清晰和更容易理解,尤爲是對於那些較大的高維度數據集。在項目結束的時候,可以以清晰的、簡潔的和使人信服的方式呈現最終結果,這是很是重要的,讓你的用戶可以理解和明白。dom
你可能已經看過了我以前的文章《5種快速和簡單的Python數據可視化方法(含代碼)》(5 Quick and Easy Data Visualizations in Python with Code),其中介紹了5種基本可視化方法:散點圖、線圖、柱狀圖、條形圖和箱形圖。這五個是簡單而強大的可視化方法,你絕對能夠經過這些方法從數據集中獲得巨大的收穫。在本文中,將介紹另外4個數據可視化方法,但稍微複雜一些,你能夠在看完上一篇文章介紹的基本方法以後再用。機器學習
熱圖是數據的矩陣表示方式,其中每一個矩陣的值用一種顏色來表示。不一樣的顏色表明不一樣的級別,矩陣指數將兩個對比的列或特徵鏈接在一塊兒。熱圖能夠很好地顯示出多個特徵變量之間的關係,由於能夠直接把一個級別看做一種顏色。還能夠經過觀察熱圖中的一些點來查看每一個關係是如何與數據集中的其它關係進行比較的。這些顏色的確提供了簡單的表示方式,由於這是很是直觀的。ide
如今來看下代碼:與matplotlib庫相比,seaborn庫可用於更高級的圖表,一般也須要更多的組件,如更多的顏色、圖形或者變量。Matplotlib庫用於顯示圖表,numpy用於生成數據,而pandas用於控制。繪圖只是調用一個簡單的seaborn函數,若是你發現了一些在視覺上很特別的東西,經過這個函數,還能夠設置顏色映射。函數
# Importing libs importseaborn as sns import pandas aspd importnumpyasnp importmatplotlib.pyplotasplt # Create a random dataset data=pd.DataFrame(np.random.random((10,6)), columns=["Iron Man","CaptainAmerica","BlackWidow","Thor","Hulk", "Hawkeye"]) print(data) # Plot the heatmap heatmap_plot=sns.heatmap(data, center=0, cmap='gist_ncar') plt.show()
二維密度圖是一維版本的簡單擴展,可以看到關於2個變量的機率分佈。讓咱們看看下面的二維密度圖,右邊的刻度用顏色表示每一點的機率。最高的機率,看下數據集,彷佛大約是0.5的大小和1.4-ish的速度。正如你所看到的,二維密度圖對於快速肯定數據對於兩個變量最集中的區域很是地顯著,而不是像一維密度圖那樣只集中一個變量。當你有兩個對輸出結果很是重要的變量,而且但願瞭解它們如何一塊兒對輸出結果分佈起做用的時候,二維密度圖尤爲適合。學習
Seaborn的代碼超級簡單,咱們將經過建立一個偏態分佈介紹它。若是你發現某些顏色和陰影在視覺上更特別,那麼大多數的可選參數都是爲了看起來更清晰。ui
蜘蛛圖是顯示一對多關係最好的方法之一。也就是說,你能夠繪製並查看區別於單個變量或類別的多個變量的值。在蜘蛛圖中,一個變量相對於另外一個變量的特性是顯而易見的,由於面積和長度在一些方向上變化了。若是你但願瞭解幾個類別關於這些變量是如何疊加起來的,能夠並排繪製一下。在下圖中,很容易比較三個電影角色的不一樣屬性,並瞭解他們的優點所在! this
此次咱們將可以直接使用matplotlib來建立可視化,而不是用seaborn。須要計算每一個屬性所在的角度,由於咱們但願它們沿圓周被平均地分隔開。咱們將在每一個計算的角度放置標籤,而後把值繪製成一個點,該點到中心的距離取決於它的值或是級別。最後,爲了清晰起見,咱們將使用半透明的顏色填充由鏈接各屬性點的線所包含的區域。spa
# Import libs import pandas aspd importseabornassns importnumpyasnp importmatplotlib.pyplotasplt # Get the data df=pd.read_csv("avengers_data.csv") print(df) """ # Name Attack Defense Speed Range Health 0 1 Iron Man 83 80 75 70 70 1 2 Captain America 60 62 63 80 80 2 3 Thor 80 82 83 100 100 3 3 Hulk 80 100 67 44 92 4 4 Black Widow 52 43 60 50 65 5 5 Hawkeye 58 64 58 80 65 """ # Get the data for Iron Man labels=np.array(["Attack","Defense","Speed","Range","Health"]) stats=df.loc[0,labels].values # Make some calculations for the plot angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False) stats=np.concatenate((stats,[stats[0]])) angles=np.concatenate((angles,[angles[0]])) # Plot stuff fig=plt.figure() ax=fig.add_subplot(111, polar=True) ax.plot(angles, stats, 'o-', linewidth=2) ax.fill(angles, stats, alpha=0.25) ax.set_thetagrids(angles *180/np.pi, labels) ax.set_title([df.loc[0,"Name"]]) ax.grid(True) plt.show()
咱們從小學就開始使用樹形圖了,樹形圖既天然又直觀,還易於解釋。直接鏈接的節點關係密切,而與有多個鏈接的節點差異很大。在下圖中,我已經根據統計繪製了一小部分來自Kaggle的Pokemon with stats數據集:code
HP、攻擊、防護、特殊攻擊、特殊防護、速度
所以,與stats wise最匹配的Pokemon將緊密鏈接在一塊兒。例如,咱們看到,在頂部,Arbok和Fearow是直接鏈接的,並且,若是咱們查看數據,Arbok總共有438個,而Fearow有442個,很是接近。可是一旦咱們移動到Raticate,咱們獲得的總數是413,這與Arbok和Fearow的差異很大,這就是它們被分開的緣由。當咱們移動樹的時候,基於類似性,Pokemon被分的組愈來愈多。在綠色組中的Pokemon相互之間比紅色組中的更類似,即便沒有直接的綠色鏈接。
對於樹形圖,咱們實際上要使用Scipy的。在查看了數據集以後,咱們將去掉字符串類型的列。咱們這麼作只是爲了要獲得正確的可視化結果,但在實踐中,最好是把這些字符串轉換成分類變量,爲了獲得更好的結果和進行比較,咱們還設置了數據幀索引,以便可以適當地用它做爲引用每一個節點的列。最後,在Scipy中計算和繪製樹形圖是很是簡單的事了。
# Import libs import pandas aspd frommatplotlibimportpyplotasplt fromscipy.clusterimport hierarchy importnumpyasnp # Read in the dataset # Drop any fields that are strings # Only get the first 40 because this dataset is big df=pd.read_csv('Pokemon.csv') df=df.set_index('Name') del df.index.name df=df.drop(["Type 1", "Type 2", "Legendary"], axis=1) df=df.head(n=40) # Calculate the distance between each sample Z =hierarchy.linkage(df, 'ward') # Orientation our tree hierarchy.dendrogram(Z, orientation="left", labels=df.index) plt.show()
爲了瞭解更多的關於數據可視化方面的知識,我建議你們學習這本書 — Data Visualisation Book,它提供了關於什麼時候、何地、以及爲何使用各個類型的可視化方法的全面而直觀的講解。