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

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

安裝
pip?install?seaborn
當(dāng)安裝seaborn時,也會自動安裝其他繪圖所需要的庫,例如 matplotlib,pandas、numpy 和 scipy。此外,在寫代碼繪圖前,我們需要導(dǎo)入一些模塊。
import?matplotlib.pyplot?as?plt
import?pandas?as?pd
import?numpy?as?np
import?seaborn?as?sns
簡單使用
1. 繪制你的第一個圖表
由于網(wǎng)絡(luò)問題,在國內(nèi)使用seaborn的數(shù)據(jù)集時,注意啟用代理,以免無法加載數(shù)據(jù)集。
在我們開始畫圖之前,需要使用數(shù)據(jù)。seaborn的方便之處在于它兼容pandas數(shù)據(jù)結(jié)構(gòu)。此外,該庫自帶了 一些內(nèi)建數(shù)據(jù)集,你可以直接用代碼加載,無需手動下載文件。讓我們一起來看看如何加載一個包含航班信息的數(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ù)并寫入數(shù)據(jù)集的名稱后,神奇的事情發(fā)生了,控制臺返回了一個數(shù)據(jù)結(jié)構(gòu)。所有的數(shù)據(jù)集在這里可見:
Github鏈接:
https://github.com/mwaskom/seaborn-data
2. 散點圖
散點圖是一個基于二維數(shù)據(jù)來顯示點的圖表。用 seaborn 庫來繪制一個散點圖只需要幾行代碼,非常簡單。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ù)的變化,畫出線條圖。它是一種流行且廣為人知的圖表,易于繪制。與之前相似,我們使用lineplot函數(shù), 指定數(shù)據(jù)集,以及x,y軸分別代表哪一列數(shù)據(jù)。seaborn會完成剩余的工作:
flights_data?=?sns.load_dataset("flights")
sns.lineplot(data=flights_data,?x="year",?y="passengers")
plt.show()
繪制的圖表如下:

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

5. 用matplotlib擴展
seaborn建立在matplotlib之上,擴展了它的功能,增加了復(fù)雜性。如其所述,卻并沒有限matplotlib的性能。任何seaborn圖表都可以用matplotlib的函數(shù)繪制。seaborn在特定的操作中可以提供幫助,允許seaborn利用matplotlib的力量而無需重寫函數(shù)。例如你如果想用seaborn來自動繪制多個圖表,你就可以利用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功能,我們可以在一個圖上繪制多個圖表。該函數(shù)有三個參數(shù),第一個是行數(shù),第二個是列數(shù),最后一個是圖號。我們使用matplotlib與seaborn中的函數(shù),seaborn在每個subplot中繪制一個seaborn圖表。
6. 繪制不同風(fēng)格的漂亮圖形
seaborn使我們可以更改圖形界面,它提供了五種不同的風(fēng)格:darkgrid,whitegrid,dark,white,和ticks.
第一個例子深色網(wǎng)格圖:
flights_data?=?sns.load_dataset("flights")
sns.set_style("darkgrid")
sns.lineplot(data?=?flights_data,?x?=?"year",?y?=?"passengers")
plt.show()
繪制的圖表如下:

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

很酷的用法
. 下載小費數(shù)據(jù)集
我們了解seaborn的基本知識后,現(xiàn)在讓我們通過在同一數(shù)據(jù)集上構(gòu)建多個圖表,來進行練習(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ù)集的前幾行,來了解列和數(shù)據(jù)本身。通常我會用一些pandas函數(shù)修復(fù)一些數(shù)據(jù)問題,比如null值,還可 以加入一些對數(shù)據(jù)集有用的信息。你可以在下面的鏈接中閱讀更多信息:
pandas使用指南:
https://livecodestream.dev/post/how-to-work-with-pandas-in-python/
讓我們在數(shù)據(jù)集中創(chuàng)建新的一列,以表示小費占總費用的百分比:
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 來產(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ù)客戶會給15%至20%的小費,而有些情況下,小費超過70%。這些值是異常的,應(yīng)該進行檢查,以確定這些值是否出錯。
3. 觀察tip_percentage是否與每天的不同時刻是否有關(guān),也將會很有趣:
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屬性。這將會使圖表給每一個time值設(shè)置不同的顏色,并為其添加圖例。
4. 一周中某天的小費數(shù)
另一個有趣的度量標(biāo)準(zhǔn)是根據(jù)一周中的某天,知道可以得到小費的總數(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()
繪制的圖表如下:

看起來星期五很適合待在家里。
5. 桌子尺寸和日期對小費的影響
有時候我們想要知道多個變量如何共同影響輸出。例如,星期幾和桌子尺 寸怎樣共同影響小費百分比?為了畫出最終的圖表,我們首先用pandas中的pivot函數(shù)預(yù)處理數(shù)據(jù),隨后繪制一個熱點圖:
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 做很多事情,通過查看官方文檔能看到更多例子。感謝你的閱讀!
官方文檔地址:http://seaborn.pydata.org/
-?EOF -?
更多優(yōu)秀開源項目(點擊下方圖片可跳轉(zhuǎn))
開源前哨
日常分享熱門、有趣和實用的開源項目。參與維護10萬+star 的開源技術(shù)資源庫,包括:Python, Java, C/C++, Go, JS, CSS, Node.js, PHP, .NET 等
關(guān)注后獲取
回復(fù)?資源?獲取 10萬+ star 開源資源
分享、點贊和在看
支持我們分享更多優(yōu)秀開源項目,謝謝!



