8k Star!基于 Matplotlib 的數(shù)據(jù)可視化利器
【導(dǎo)語(yǔ)】:Seaborn 是一個(gè)可以實(shí)現(xiàn)數(shù)據(jù)可視化的 Python 庫(kù),它是基于 matplotlib 庫(kù)封裝而成的,同時(shí)還能兼容 pandas 數(shù)據(jù)結(jié)構(gòu)。我們可以使用 Seaborn 來(lái)制作漂亮的數(shù)據(jù)圖表,操作簡(jiǎn)單,易于上手。
提示:Seaborn 支持 Python 3.7+ ,已不再支持 Python 2。
簡(jiǎn)介
1、數(shù)據(jù)可視化的工具介紹
數(shù)據(jù)可視化是一種數(shù)據(jù)科學(xué)家將原始數(shù)據(jù)轉(zhuǎn)化為圖表的技術(shù),這些圖表能產(chǎn)生許多有價(jià)值的信息。圖表降低了原始數(shù)據(jù)的復(fù)雜性,使用戶更易理解。
有許多完成數(shù)據(jù)可視化的工具,例如 Tableau、Power BI、ChartBlocks以及其他的無(wú)代碼工具。這些工具有著各自的用戶,也都很強(qiáng)大。然而當(dāng)我們需要一個(gè)良好的平臺(tái)來(lái)處理原始數(shù)據(jù)時(shí),python 不失為一個(gè)好的選擇。
雖然這種方法較為復(fù)雜,需要的編程知識(shí)也更多,但 python 能通過(guò)許多操作和轉(zhuǎn)換來(lái)完成數(shù)據(jù)可視化,因此對(duì)數(shù)據(jù)科學(xué)家來(lái)說(shuō)是一個(gè)理想的選擇。Python 最大的一個(gè)優(yōu)點(diǎn)就是它擁有強(qiáng)大的第三方庫(kù),來(lái)處理數(shù)據(jù),比如numpy、pandas、matplotlib、tensorflow。
Matplotlib可能是目前最受認(rèn)可的繪圖庫(kù)了,不僅適用于python,還適用于R語(yǔ)言等。它的定制化和可操作性使其坐上了頭把交椅。然而當(dāng)使用 matplotlib 時(shí),有些定制化和操作功能很難實(shí)現(xiàn)。
基于 matplotlib,開(kāi)發(fā)者創(chuàng)造了一個(gè)叫 seaborn 的庫(kù)。seaborn 與 matplotlib 一樣強(qiáng)大,在帶來(lái)一些新特性的同時(shí)還能簡(jiǎn)化繪圖。
在本文中,我們主要關(guān)注如何使用 seaborn 繪制高級(jí)的圖表。你可以依據(jù)這些例子創(chuàng)建自己的圖表。
2. Seaborn是什么?

Seaborn是 python 中一個(gè)可以制作數(shù)據(jù)圖表的庫(kù)。它是 matplotlib 庫(kù)的高級(jí)封裝,同時(shí)還能兼容 pandas 數(shù)據(jù)結(jié)構(gòu)。
Seaborn 能讓你快速探索并理解數(shù)據(jù)。seaborn 的工作方式為:首先捕捉包含所有數(shù)據(jù)的整個(gè)數(shù)據(jù)結(jié)構(gòu)或數(shù)組,隨后通過(guò)執(zhí)行繪圖和統(tǒng)計(jì)數(shù)據(jù)需要的所有內(nèi)部函數(shù),將數(shù)據(jù)轉(zhuǎn)換為信息圖。
當(dāng)你根據(jù)自身需求設(shè)計(jì)圖表時(shí),seaborn 能減少?gòu)?fù)雜性。
Seaborn 的Github主頁(yè):
https://github.com/mwaskom/seaborn

安裝
pip?install?seaborn
當(dāng)安裝seaborn時(shí),也會(huì)自動(dòng)安裝其他繪圖所需要的庫(kù),例如 matplotlib,pandas、numpy 和 scipy。此外,在寫(xiě)代碼繪圖前,我們需要導(dǎo)入一些模塊。
import?matplotlib.pyplot?as?plt
import?pandas?as?pd
import?numpy?as?np
import?seaborn?as?sns
簡(jiǎn)單使用
1. 繪制你的第一個(gè)圖表
由于網(wǎng)絡(luò)問(wèn)題,在國(guó)內(nèi)使用seaborn的數(shù)據(jù)集時(shí),注意啟用代理,以免無(wú)法加載數(shù)據(jù)集。
在我們開(kāi)始畫(huà)圖之前,需要使用數(shù)據(jù)。seaborn的方便之處在于它兼容pandas數(shù)據(jù)結(jié)構(gòu)。此外,該庫(kù)自帶了 一些內(nèi)建數(shù)據(jù)集,你可以直接用代碼加載,無(wú)需手動(dòng)下載文件。讓我們一起來(lái)看看如何加載一個(gè)包含航班信息的數(shù)據(jù)集:
flights_data?=?sns.load_dataset("flights")
res?=?flights_data.head()
print(res)
輸出結(jié)果如下:
| ? | year | month | passengers |
|---|---|---|---|
| 0 | 1949 | Jan | 112 |
| 1 | 1949 | Feb | 118 |
| 2 | 1949 | Mar | 132 |
| 3 | 1949 | Apr | 129 |
| 4 | 1949 | May | 121 |
當(dāng)調(diào)用load_dataset函數(shù)并寫(xiě)入數(shù)據(jù)集的名稱后,神奇的事情發(fā)生了,控制臺(tái)返回了一個(gè)數(shù)據(jù)結(jié)構(gòu)。所有的數(shù)據(jù)集在這里可見(jiàn):
Github鏈接:
https://github.com/mwaskom/seaborn-data
2. 散點(diǎn)圖
散點(diǎn)圖是一個(gè)基于二維數(shù)據(jù)來(lái)顯示點(diǎn)的圖表。用 seaborn 庫(kù)來(lái)繪制一個(gè)散點(diǎn)圖只需要幾行代碼,非常簡(jiǎn)單。scatterplot 需要的參數(shù)是我們繪圖需要的數(shù)據(jù)集,以及x,y軸分別代表什么數(shù)據(jù)。
flights_data?=?sns.load_dataset("flights")
sns.scatterplot(data=flights_data,?x="year",?y="passengers")
plt.show()
繪制的圖表如下:

3. 線條圖
根據(jù)連續(xù)或分類數(shù)據(jù)的變化,畫(huà)出線條圖。它是一種流行且廣為人知的圖表,易于繪制。與之前相似,我們使用lineplot函數(shù), 指定數(shù)據(jù)集,以及x,y軸分別代表哪一列數(shù)據(jù)。seaborn會(huì)完成剩余的工作:
flights_data?=?sns.load_dataset("flights")
sns.lineplot(data=flights_data,?x="year",?y="passengers")
plt.show()
繪制的圖表如下:

4. 條形圖
正如你所推測(cè)的那樣,條形圖可能是最出名的圖表類型了。與散點(diǎn)圖和線條一樣,我們可以用barplot函數(shù)繪制條形圖:
flights_data?=?sns.load_dataset("flights")
sns.barplot(data=flights_data,?x="year",?y="passengers")
plt.show()
繪制的圖表如下:

5. 用matplotlib擴(kuò)展
seaborn建立在matplotlib之上,擴(kuò)展了它的功能,增加了復(fù)雜性。如其所述,卻并沒(méi)有限matplotlib的性能。任何seaborn圖表都可以用matplotlib的函數(shù)繪制。seaborn在特定的操作中可以提供幫助,允許seaborn利用matplotlib的力量而無(wú)需重寫(xiě)函數(shù)。例如你如果想用seaborn來(lái)自動(dòng)繪制多個(gè)圖表,你就可以利用matplotlib中的subplot函數(shù):
diamonds_data?=?sns.load_dataset('diamonds')
plt.subplot(1,?2,?1)
sns.countplot(x='carat',?data=diamonds_data)
plt.subplot(1,?2,?2)
sns.countplot(x='depth',?data=diamonds_data)
plt.show()
繪制的圖表如下:

使用subplot功能,我們可以在一個(gè)圖上繪制多個(gè)圖表。該函數(shù)有三個(gè)參數(shù),第一個(gè)是行數(shù),第二個(gè)是列數(shù),最后一個(gè)是圖號(hào)。我們使用matplotlib與seaborn中的函數(shù),seaborn在每個(gè)subplot中繪制一個(gè)seaborn圖表。
6. 繪制不同風(fēng)格的漂亮圖形
seaborn使我們可以更改圖形界面,它提供了五種不同的風(fēng)格:darkgrid,whitegrid,dark,white,和ticks.
第一個(gè)例子深色網(wǎng)格圖:
flights_data?=?sns.load_dataset("flights")
sns.set_style("darkgrid")
sns.lineplot(data?=?flights_data,?x?=?"year",?y?=?"passengers")
plt.show()
繪制的圖表如下:

另一個(gè)例子白色網(wǎng)格圖:
flights_data?=?sns.load_dataset("flights")
sns.set_style("whitegrid")
sns.lineplot(data=flights_data,?x="year",?y="passengers")
plt.show()
繪制的圖表如下:

很酷的用法
. 下載小費(fèi)數(shù)據(jù)集
我們了解seaborn的基本知識(shí)后,現(xiàn)在讓我們通過(guò)在同一數(shù)據(jù)集上構(gòu)建多個(gè)圖表,來(lái)進(jìn)行練習(xí)。在我們的例子中,我們將 使用數(shù)據(jù)集“tips”,你可以使用seaborn直接下載。首先,加載數(shù)據(jù)集:
tips_df?=?sns.load_dataset('tips')
res?=?tips_df.head()
print(res)
輸出結(jié)果如下:
| ? | total_bill | tip | sex | smoker | day | time | size |
|---|---|---|---|---|---|---|---|
| 0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
| 1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
| 2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
| 3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
| 4 | 24.59 | 3.61 | Male | No | Sun | Dinner | 4 |
我想打印出數(shù)據(jù)集的前幾行,來(lái)了解列和數(shù)據(jù)本身。通常我會(huì)用一些pandas函數(shù)修復(fù)一些數(shù)據(jù)問(wèn)題,比如null值,還可 以加入一些對(duì)數(shù)據(jù)集有用的信息。你可以在下面的鏈接中閱讀更多信息:
pandas使用指南:
https://livecodestream.dev/post/how-to-work-with-pandas-in-python/
讓我們?cè)跀?shù)據(jù)集中創(chuàng)建新的一列,以表示小費(fèi)占總費(fèi)用的百分比:
tips_df?=?sns.load_dataset('tips')
tips_df.head()
tips_df["tip_percentage"]?=?tips_df["tip"]?/?tips_df["total_bill"]
res?=?tips_df.head()
print(res)
新的數(shù)據(jù)結(jié)構(gòu)如下:
| ? | total_bill | tip | sex | smoker | day | time | size | tip_percentage |
|---|---|---|---|---|---|---|---|---|
| 0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 | 0.059447 |
| 1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 | 0.160542 |
| 2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 | 0.166587 |
| 3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 | 0.139780 |
| 4 | 24.59 | 3.61 | Male | No | Sun | Dinner | 4 | 0.146808 |
2. 理解tip_percentage
讓我們首先看看 tip_percentage 的分布。鑒于此,使用 hisplot 來(lái)產(chǎn)生柱狀圖:
tips_df?=?sns.load_dataset('tips')
tips_df["tip_percentage"]?=?tips_df["tip"]?/?tips_df["total_bill"]
sns.histplot(tips_df["tip_percentage"],?binwidth=0.05)
plt.show()
繪制的圖表如下:

我們必須自定義 binwidth 屬性以使其更具可讀性,現(xiàn)在我們可以快速理解數(shù)據(jù)了。大多數(shù)客戶會(huì)給15%至20%的小費(fèi),而有些情況下,小費(fèi)超過(guò)70%。這些值是異常的,應(yīng)該進(jìn)行檢查,以確定這些值是否出錯(cuò)。
3. 觀察tip_percentage是否與每天的不同時(shí)刻是否有關(guān),也將會(huì)很有趣:
tips_df?=?sns.load_dataset('tips')
tips_df["tip_percentage"]?=?tips_df["tip"]?/?tips_df["total_bill"]
sns.histplot(data=tips_df,?x="tip_percentage",?binwidth=0.05,?hue="time")
plt.show()
繪制的圖表如下:

這次我們加載了所有數(shù)據(jù)集到圖表中,而不僅僅是一列,然后給time列設(shè)置了hue屬性。這將會(huì)使圖表給每一個(gè)time值設(shè)置不同的顏色,并為其添加圖例。
4. 一周中某天的小費(fèi)數(shù)
另一個(gè)有趣的度量標(biāo)準(zhǔn)是根據(jù)一周中的某天,知道可以得到小費(fèi)的總數(shù):
tips_df?=?sns.load_dataset('tips')
tips_df["tip_percentage"]?=?tips_df["tip"]?/?tips_df["total_bill"]
sns.barplot(data=tips_df,?x="day",?y="tip",?estimator=np.sum)
plt.show()
繪制的圖表如下:

看起來(lái)星期五很適合待在家里。
5. 桌子尺寸和日期對(duì)小費(fèi)的影響
有時(shí)候我們想要知道多個(gè)變量如何共同影響輸出。例如,星期幾和桌子尺 寸怎樣共同影響小費(fèi)百分比?為了畫(huà)出最終的圖表,我們首先用pandas中的pivot函數(shù)預(yù)處理數(shù)據(jù),隨后繪制一個(gè)熱點(diǎn)圖:
tips_df?=?sns.load_dataset('tips')
tips_df["tip_percentage"]?=?tips_df["tip"]?/?tips_df["total_bill"]
pivot?=?tips_df.pivot_table(
????index=["day"],
????columns=["size"],
????values="tip_percentage",
????aggfunc=np.average)
sns.heatmap(pivot)
plt.show()
繪制的圖表如下:

結(jié)論
當(dāng)然,我們還可以用 seaborn 做很多事情,通過(guò)查看官方文檔能看到更多例子。感謝你的閱讀!
官方文檔地址:http://seaborn.pydata.org/
-?EOF -?
更多優(yōu)秀開(kāi)源項(xiàng)目(點(diǎn)擊下方圖片可跳轉(zhuǎn))
開(kāi)源前哨
日常分享熱門、有趣和實(shí)用的開(kāi)源項(xiàng)目。參與維護(hù)10萬(wàn)+star 的開(kāi)源技術(shù)資源庫(kù),包括:Python, Java, C/C++, Go, JS, CSS, Node.js, PHP, .NET 等
關(guān)注后獲取
回復(fù)?資源?獲取 10萬(wàn)+ star 開(kāi)源資源
分享、點(diǎn)贊和在看
支持我們分享更多優(yōu)秀開(kāi)源項(xiàng)目,謝謝!



