4種更快更簡單實(shí)現(xiàn) Python 數(shù)據(jù)可視化的方法
點(diǎn)擊上方Python知識圈,選擇設(shè)為星標(biāo)
回復(fù)1024獲取Python資料

閱讀文本大概需要 6?分鐘
機(jī)器之心報道??參與:一鳴、李澤南
熱力圖、二維密度圖、蜘蛛網(wǎng)圖和樹狀圖,這些可視化方法你都用過嗎?
數(shù)據(jù)可視化是數(shù)據(jù)科學(xué)或機(jī)器學(xué)習(xí)項(xiàng)目中十分重要的一環(huán)。通常,你需要在項(xiàng)目初期進(jìn)行探索性的數(shù)據(jù)分析(EDA),從而對數(shù)據(jù)有一定的了解,而且創(chuàng)建可視化確實(shí)可以使分析的任務(wù)更清晰、更容易理解,特別是對于大規(guī)模的高維數(shù)據(jù)集。在項(xiàng)目接近尾聲時,以一種清晰、簡潔而引人注目的方式展示最終結(jié)果也是非常重要的,讓你的受眾(通常是非技術(shù)人員的客戶)能夠理解。
讀者可能閱讀過我之前的文章「5 Quick and Easy Data Visualizations in Python with Code」,我通過那篇文章向大家介紹了 5 種基礎(chǔ)的數(shù)據(jù)可視化方法:散點(diǎn)圖、線圖、直方圖、條形圖和箱形圖。這些都是簡單而強(qiáng)大的可視化方法,通過它們你可以對數(shù)據(jù)集有深刻的認(rèn)識。在本文中,我們將看到另外 4 個數(shù)據(jù)可視化方法!本文對這些方法的介紹會更詳細(xì)一些,可以在您閱讀了上一篇文章中的基本方法之后接著使用,從而從數(shù)據(jù)中提取出更深入的信息。
熱力圖
熱力圖(Heat Map)是數(shù)據(jù)的一種矩陣表示方法,其中每個矩陣元素的值通過一種顏色表示。不同的顏色代表不同的值,通過矩陣的索引將需要被對比的兩項(xiàng)或兩個特征關(guān)聯(lián)在一起。熱力圖非常適合于展示多個特征變量之間的關(guān)系,因?yàn)槟憧梢灾苯油ㄟ^顏色知道該位置上的矩陣元素的大小。通過查看熱力圖中的其他點(diǎn),你還可以看到每種關(guān)系與數(shù)據(jù)集中的其它關(guān)系之間的比較。顏色是如此直觀,因此它為我們提供了一種非常簡單的數(shù)據(jù)解釋方式。

現(xiàn)在讓我們來看看實(shí)現(xiàn)代碼。與「matplotlib」相比,「seaborn」可以被用于繪制更加高級的圖形,它通常需要更多的組件,例如多種顏色、圖形或變量?!竚atplotlib」可以被用于顯示圖形,「NumPy」可被用于生成數(shù)據(jù),「pandas」可以被用于處理數(shù)據(jù)!繪圖只是「seaborn」的一個簡單的功能。
#?Importing?libs
import?seaborn?as?sns
import?pandas?as?pd
import?numpy?as?np
import?matplotlib.pyplot?as?plt
#?Create?a?random?dataset
data?=?pd.DataFrame(np.random.random((10,6)),?columns=["Iron?Man","Captain?America","Black?Widow","Thor","Hulk",?"Hawkeye"])
print(data)
#?Plot?the?heatmap
heatmap_plot?=?sns.heatmap(data,?center=0,?cmap='gist_ncar')
plt.show()二維密度圖
二維密度圖(2D Density Plot)是一維版本密度圖的直觀擴(kuò)展,相對于一維版本,其優(yōu)點(diǎn)是能夠看到關(guān)于兩個變量的概率分布。例如,在下面的二維密度圖中,右邊的刻度圖用顏色表示每個點(diǎn)的概率。我們的數(shù)據(jù)出現(xiàn)概率最大的地方(也就是數(shù)據(jù)點(diǎn)最集中的地方),似乎在 size=0.5,speed=1.4 左右。正如你現(xiàn)在所知道的,二維密度圖對于迅速找出我們的數(shù)據(jù)在兩個變量的情況下最集中的區(qū)域非常有用,而不是像一維密度圖那樣只有一個變量。當(dāng)你有兩個對輸出非常重要的變量,并且希望了解它們?nèi)绾喂餐饔糜谳敵龅姆植紩r,用二維密度圖觀察數(shù)據(jù)是十分有效的。

事實(shí)再次證明,使用「seaborn」編寫代碼是十分便捷的!這一次,我們將創(chuàng)建一個偏態(tài)分布,讓數(shù)據(jù)可視化結(jié)果更有趣。你可以對大多數(shù)可選參數(shù)進(jìn)行調(diào)整,讓可視化看結(jié)果看起來更清楚。
#?Importing?libs
import?seaborn?as?sns
import?matplotlib.pyplot?as?plt
from?scipy.stats?import?skewnorm
#?Create?the?data
speed?=?skewnorm.rvs(4,?size=50)?
size?=?skewnorm.rvs(4,?size=50)
#?Create?and?shor?the?2D?Density?plot
ax?=?sns.kdeplot(speed,?size,?cmap="Reds",?shade=False,?bw=.15,?cbar=True)
ax.set(xlabel='speed',?ylabel='size')
plt.show()蜘蛛網(wǎng)圖
蜘蛛網(wǎng)圖(Spider Plot)是顯示一對多關(guān)系的最佳方法之一。換而言之,你可以繪制并查看多個與某個變量或類別相關(guān)的變量的值。在蜘蛛網(wǎng)圖中,一個變量相對于另一個變量的顯著性是清晰而明顯的,因?yàn)樵谔囟ǖ姆较蛏?,覆蓋的面積和距離中心的長度變得更大。如果你想看看利用這些變量描述的幾個不同類別的對象有何不同,可以將它們并排繪制。在下面的圖表中,我們很容易比較復(fù)仇者聯(lián)盟的不同屬性,并看到他們各自的優(yōu)勢所在?。ㄕ堊⒁猓@些數(shù)據(jù)是隨機(jī)設(shè)置的,我對復(fù)仇者聯(lián)盟的成員們沒有偏見。)

在這里,我們可以直接使用「matplotlib」而非「seaborn」來創(chuàng)建可視化結(jié)果。我們需要讓每個屬性沿圓周等距分布。我們將在每個角上設(shè)置標(biāo)簽,然后將值繪制為一個點(diǎn),它到中心的距離取決于它的值/大小。最后,為了顯示更清晰,我們將使用半透明的顏色來填充將屬性點(diǎn)連接起來得到的線條所包圍的區(qū)域。
#?Import?libs
import?pandas?as?pd
import?seaborn?as?sns
import?numpy?as?np
import?matplotlib.pyplot?as?plt
#?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()
樹狀圖
我們從小學(xué)就開始使用樹狀圖(Tree Diagram)了!樹狀圖是自然而直觀的,這使它們?nèi)菀妆唤忉?。直接相連的節(jié)點(diǎn)關(guān)系密切,而具有多個連接的節(jié)點(diǎn)則不太相似。在下面的可視化結(jié)果中,我根據(jù) Kaggle 的統(tǒng)計數(shù)據(jù)(生命值、攻擊力、防御力、特殊攻擊、特殊防御、速度)繪制了一小部分口袋妖怪游戲的數(shù)據(jù)集的樹狀圖。
因此,統(tǒng)計意義上最匹配的口袋妖怪將被緊密地連接在一起。例如,在圖的頂部,阿柏怪 和尖嘴鳥是直接連接的,如果我們查看數(shù)據(jù),阿柏怪的總分為 438,尖嘴鳥則為 442,二者非常接近!但是如果我們看看拉達(dá),我們可以看到其總得分為 413,這和阿柏怪、尖嘴鳥就具有較大差別了,所以它們在樹狀圖中是被分開的!當(dāng)我們沿著樹往上移動時,綠色組的口袋妖怪彼此之間比它們和紅色組中的任何口袋妖怪都更相似,即使這里并沒有直接的綠色的連接。

對于樹狀圖,我們實(shí)際上需要使用「Scipy」來繪制!讀取數(shù)據(jù)集中的數(shù)據(jù)之后,我們將刪除字符串列。這么做只是為了使可視化結(jié)果更加直觀、便于理解,但在實(shí)踐中,將這些字符串轉(zhuǎn)換為分類變量會得到更好的結(jié)果和對比效果。我們還設(shè)置了數(shù)據(jù)幀的索引,以便能夠恰當(dāng)?shù)貙⑵溆米饕妹總€節(jié)點(diǎn)的列。最后需要告訴大家的是,在「Scipy」中計算和繪制樹狀圖只需要一行簡單的代碼。
#?Import?libs
import?pandas?as?pd
from?matplotlib?import?pyplot?as?plt
from?scipy.cluster?import?hierarchy
import?numpy?as?np
#?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()原文鏈接:https://towardsdatascience.com/4-more-quick-and-easy-data-visualizations-in-python-with-code-da9030ab3429

一個學(xué)習(xí)Python的人,喜歡分享,喜歡搞事情!長按下圖二維碼關(guān)注,和你一起領(lǐng)悟Python的魅力。
留言打卡 DAY 23
今日的留言話題是:你還用過哪些可制作可視化圖形的庫?關(guān)于留言打卡的規(guī)則參考:留言打卡第二季? (點(diǎn)擊鏈接查看規(guī)則),請按照?昵稱+天數(shù)(請以自己實(shí)際打卡的天數(shù)為準(zhǔn),如day1 or day2 or day3)+?留言內(nèi)容(不少于15字)的方式留言。
Python知識圈公眾號的交流群已經(jīng)建立,群里可以領(lǐng)取 Python 和人工智能學(xué)習(xí)資料,大家可以一起學(xué)習(xí)交流,效率更高,如果是想發(fā)推文、廣告、砍價小程序的敬請繞道!一定記得備注「交流學(xué)習(xí)」,我會盡快通過好友申請哦!通過好友后私聊我「學(xué)習(xí)資料」或者「進(jìn)群」都可以。
掃碼添加,備注:交流學(xué)習(xí)
往期推薦0102
數(shù)據(jù)之美-Python數(shù)據(jù)可視化
用Python計算出小姐姐的顏值數(shù),看看你的女神顏值多少
分享給你的朋友
點(diǎn)個在看

