資料可視化是任何資料科學或機器學習項目的一個重要組成部分。人們常常會從探索資料分析(EDA)開始,來深入了解資料,并且建立可視化确實有助于讓問題更清晰和更容易了解,尤其是對于那些較大的高次元資料集。在項目結束的時候,能夠以清晰的、簡潔的和令人信服的方式呈現最終結果,這是非常重要的,讓你的使用者能夠了解和明白。
你可能已經看過了我之前的文章《5種快速和簡單的Python資料可視化方法(含代碼)》(
5 Quick and Easy Data Visualizations in Python with Code ),其中介紹了5種基本可視化方法:散點圖、線圖、柱狀圖、條形圖和箱形圖。這五個是簡單而強大的可視化方法,你絕對可以通過這些方法從資料集中得到巨大的收獲。在本文中,将介紹另外4個資料可視化方法,但稍微複雜一些,你可以在看完上一篇文章介紹的基本方法之後再用。熱圖( Heat Map )
熱圖是資料的矩陣表示方式,其中每個矩陣的值用一種顔色來表示。不同的顔色代表不同的級别,矩陣指數将兩個對比的列或特征連接配接在一起。熱圖可以很好地顯示出多個特征變量之間的關系,因為可以直接把一個級别看作一種顔色。還可以通過觀察熱圖中的一些點來檢視每個關系是如何與資料集中的其它關系進行比較的。這些顔色的确提供了簡單的表示方式,因為這是非常直覺的。
現在來看下代碼:與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()
二維密度圖( 2D Density Plot
二維密度圖是一維版本的簡單擴充,能夠看到關于2個變量的機率分布。讓我們看看下面的二維密度圖,右邊的刻度用顔色表示每一點的機率。最高的機率,看下資料集,似乎大約是0.5的大小和1.4-ish的速度。正如你所看到的,二維密度圖對于快速确定資料對于兩個變量最集中的區域非常地顯著,而不是像一維密度圖那樣隻集中一個變量。當你有兩個對輸出結果非常重要的變量,并且希望了解它們如何一起對輸出結果分布起作用的時候,二維密度圖尤其适合。
Seaborn的代碼超級簡單,我們将通過建立一個偏态分布介紹它。如果你發現某些顔色和陰影在視覺上更特别,那麼大多數的可選參數都是為了看起來更清晰。
蜘蛛圖( Spider Plot
蜘蛛圖是顯示一對多關系最好的方法之一。也就是說,你可以繪制并檢視差別于單個變量或類别的多個變量的值。在蜘蛛圖中,一個變量相對于另一個變量的特性是顯而易見的,因為面積和長度在一些方向上變化了。如果你希望了解幾個類别關于這些變量是如何疊加起來的,可以并排繪制一下。在下圖中,很容易比較三個電影角色的不同屬性,并了解他們的優勢所在!
這次我們将能夠直接使用matplotlib來建立可視化,而不是用seaborn。需要計算每個屬性所在的角度,因為我們希望它們沿圓周被平均地分隔開。我們将在每個計算的角度放置标簽,然後把值繪制成一個點,該點到中心的距離取決于它的值或是級别。最後,為了清晰起見,我們将使用半透明的顔色填充由連接配接各屬性點的線所包含的區域。
# 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()
樹形圖 ( Tree Diagram
我們從國小就開始使用樹形圖了,樹形圖既自然又直覺,還易于解釋。直接連接配接的節點關系密切,而與有多個連接配接的節點差别很大。在下圖中,我已經根據統計繪制了一小部分來自Kaggle的
Pokemon with stats資料集:
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,它提供了關于何時、何地、以及為什麼使用各個類型的可視化方法的全面而直覺的講解。
本文由北郵
@愛可可-愛生活老師推薦,
阿裡雲雲栖社群組織翻譯。
文章原标題《4 More Quick and Easy Data Visualizations in Python with Code》
作者:George Seif
譯者:奧特曼,審校:袁虎。
文章為簡譯,更為詳細的内容,請檢視
原文