Seaborn入門指南:最簡(jiǎn)單的學(xué)習(xí)方法
介紹seaborn和matplotlib一樣,試圖使一組定義明確的且困難的事情變得容易。Seaborn的優(yōu)勢(shì):Seaborn最大的優(yōu)勢(shì)在于其繪圖功能的多樣性,它甚至允許我們只在一行代碼中就繪制復(fù)雜的繪圖!在本教程中,我們使用三個(gè)庫來制作漂亮的圖表——Matplotlib、Seaborn和Pandas。如果你是Python的初學(xué)者,我建議你先熟悉Matplotlib和Pandas。如果你嚴(yán)格遵循本教程,你可以使用這三個(gè)庫制作出漂亮的圖表,同時(shí)可以將我的代碼用作將來任何可視化任務(wù)的模板。讓我們從著名的口袋妖怪?jǐn)?shù)據(jù)集開始。在開始之前,我強(qiáng)烈建議你為每個(gè)圖形編寫自己的基礎(chǔ)代碼,并嘗試使用圖形。你可以在Kaggle上找到Pokemon數(shù)據(jù)集,為了讓你的學(xué)習(xí)更輕松,我縮短并清理了這個(gè)版本的數(shù)據(jù)集。你可以在此處下載數(shù)據(jù)集:https://github.com/shelvi31/Seaborn-Experiments幫助資料:https://python-graph-gallery.com/.我們現(xiàn)在開始繪制圖表:首先導(dǎo)入必要的庫:#importing libraries
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
讀取CSV文件data = pd.read_csv(“Pokemon.csv”,encoding= ‘unicode_escape’)
通過 read_csv() 命令定義不同的編解碼來避免utf8的編解碼錯(cuò)誤。我們的數(shù)據(jù)看起來像這樣…data.head()
輸出:
列的名稱并沒有清楚地簡(jiǎn)化其用途。在實(shí)際使用數(shù)據(jù)集之前了解它是很重要的。以下是數(shù)據(jù)集的簡(jiǎn)化描述。該數(shù)據(jù)集包括150個(gè)與神奇寶貝游戲有關(guān)的神奇寶貝(不是口袋妖怪卡片或口袋妖怪圍棋)。在這個(gè)數(shù)據(jù)集中,我們有150行和13列。列說明:#*ID*:每個(gè)口袋妖怪的ID
#Name:每個(gè)口袋妖怪的名字
#Type1:每個(gè)口袋妖怪都有一個(gè)類型,這決定了它攻擊的弱點(diǎn)/抵抗力
#Type2:一些口袋妖怪是雙重類型,有2個(gè)類型
#Total:所有統(tǒng)計(jì)數(shù)據(jù)的總和,關(guān)于口袋妖怪有多強(qiáng)的一般指南
#HP:生命值定義了口袋妖怪在暈倒前能承受的傷害
#Attack:普通攻擊的基礎(chǔ)修飾語(如刮痕,重?fù)?
#Defense:抵抗普通攻擊的基礎(chǔ)傷害
#SP Atk,特殊攻擊的基礎(chǔ)修飾語(如火焰爆炸,氣泡束)
#*SP Def*: 防御特殊攻擊的基礎(chǔ)傷害
#Speed:決定哪只口袋妖怪每輪先攻擊
#Stage:Stage數(shù)
#Legendary:傳奇的口袋妖怪是真的,不是假的
我已經(jīng)重新命名了這些列名,以使我們的策劃更有意義,使我們的思路更加清晰。雖然這是可選的,但我強(qiáng)烈建議你這樣做,以消除任何可能的混亂。data.rename(columns = {“#”:”No.”,”Type 1":”Pokemon_Type”,”Type 2":”PokemonType2",’Total’:’Sum of Attack’,”HP”:”Hit Points”,”Attack” : “Attack Strength”, “Defense”:”Defensive Strength”,”Sp. Atk”:”Special Attack Stenth”,”Sp. Def”:”Special Defense Strength”,”Stage”:”Generation”}, inplace = True)data.head()
輸出:
接下來讓我們從簡(jiǎn)單的分布圖開始可視化。分布圖:分布圖顯示根據(jù)標(biāo)注繪制的一組數(shù)值的分布和范圍。直方圖允許你繪制數(shù)值變量的分布。我本可以用“data.hist(figsize=(12,10),bins=20)”,但由于并非此數(shù)據(jù)庫中的所有列都有數(shù)值,因此,我必須繪制單獨(dú)的分布圖。plt.figure(figsize=(4,3))
sns.distplot(x=data[“Sum of Attack”],color=”O(jiān)range”,kde=True,rug=True);
plt.show()
分布圖輸出:口袋妖怪攻擊的總和seaborn的顯示函數(shù)用密度曲線繪制直方圖,我們可以使用選項(xiàng) kde=“False” 去除密度,使用rug=“True”控制rug的存在。在python中繪制直方圖有許多替代方法:plt.figure(figsize=(3,3))
sns.histplot(x=data[“Sum of Attack”],color=”Green”);
plt.show()
輸出:口袋妖怪攻擊總數(shù)另一種方法是:使用plt.hist()plt.figure(figsize=(3,3))
plt.hist(x=data["Sum of Attack"],color="Red",bins=20);
plt.show()
輸出:直方圖,Matplotlib因此,對(duì)于許多繪制分布的方法,所有函數(shù)如pyplot.hist, seaborn.CooutCountPlot以及seaborn.dispot充當(dāng)了 matplotlib 條形圖的包裝器,如果認(rèn)為手動(dòng)繪制此類條形圖太麻煩,則可以使用。對(duì)于離散變量,seaborn.countplot更方便。對(duì)于連續(xù)變量:則使用pyplot.hist或者seaborn.distplot。聯(lián)合分布圖:聯(lián)合分布圖結(jié)合了散點(diǎn)圖和直方圖的信息,給出了二元分布的詳細(xì)信息。sns.jointplot(x=data[“Sum of Attack”],y=data[“Defensive Strength”],color=”Red”);
密度圖:密度圖顯示兩個(gè)變量之間的分布。sns.kdeplot(x=data[“Sum of Attack”],y=data[“Defensive Strength”])
plt.show()
條形圖條形圖有助于我們可視化分類變量的分布:Countplot是條形圖的一種類型。plt.figure(figsize=(10,6));
sns.countplot(x=data.Pokemon_Type,palette=pkmn_type_colors);
plt.show()
熱圖熱圖有助于我們以熱點(diǎn)和冷點(diǎn)的形式將類似矩陣的數(shù)據(jù)進(jìn)行可視化,暖色表示游客互動(dòng)度最高的區(qū)域。plt.figure(figsize=(8,6));
sns.heatmap(data.corr());# Rotate x-labels with the help of matplotlib
plt.xticks(rotation=-45);
散點(diǎn)圖:散點(diǎn)圖(也稱散點(diǎn)圖,scatter graph)使用點(diǎn)來表示兩個(gè)不同數(shù)值變量的值,水平軸和垂直軸上每個(gè)點(diǎn)的位置表示單個(gè)數(shù)據(jù)點(diǎn)的值。散點(diǎn)圖用于觀察變量之間的關(guān)系。我用散點(diǎn)圖比較了神奇寶貝的攻防數(shù)據(jù)。
Seaborn沒有專用的散點(diǎn)圖函數(shù),這就是為什么我們?cè)谶@里默認(rèn)看到一條對(duì)角線(回歸線)。但seaborn幫助我們調(diào)整了圖像:fit_reg=False 用于刪除回歸線hue='Stage' 用于通過第三個(gè)變量值為點(diǎn)上色,因此,允許我們用顏色來表達(dá)信息的第三維度。這里我把神奇寶貝的進(jìn)化階段作為第三個(gè)變量!#Tweaking with scatter plotsns.lmplot(x=’Attack Strength’, y=’Defensive Strength’, data=data,
fit_reg = False, #Deleting regression line
hue=”Generation”); #Separating as per pokemon generation
落在40–120的點(diǎn)更多,我在matplotlib的幫助下更改軸的限制:sns.lmplot(x=’Attack Strength’, y=’Defensive Strength’, data=data,
fit_reg = False, #Deleting regression line
hue=”Generation”); #Separating as per pokemon generationplt.ylim(20,130);
plt.xlim(25,125);
我們現(xiàn)在可以看到一個(gè)更集中和更好的圖表!
箱形圖箱形圖用于通過四分位數(shù)描述數(shù)值數(shù)據(jù)組。箱形圖也可能有從箱子延伸出來的線,表示上下四分位數(shù)之外的變化,因此術(shù)語為盒須圖以及須盒圖我們可以刪除“Sum of Attack(攻擊總和)”列,因?yàn)槲覀冇袀(gè)人統(tǒng)計(jì)。我們也可以刪除“Generation(世代)”和“Legendary(傳奇)”列,因?yàn)樗鼈儾皇菓?zhàn)斗統(tǒng)計(jì)。plt.figure(figsize=(15,7));# Pre-format DataFrame
stats_data = data.drop([‘Sum of Attack’, ‘Generation’, ‘Legendary’], axis=1);
# New boxplot using stats_df
sns.boxplot(data=stats_data,
showfliers=False); #Removing outlierssns.set_style(“whitegrid”)
在繪制圖表之前,記得保持 figsize。小提琴圖現(xiàn)在我們來畫小提琴圖。小提琴圖是盒子圖的替代品,它顯示的是分布(通過小提琴的厚度),而不僅僅是摘要統(tǒng)計(jì)。這里我展示了神奇寶貝的主要攻擊類型的分布plt.figure(figsize=(15,7));
sns.violinplot(x=data.Pokemon_Type, y = data[“Attack Strength”]);
正如你所看到的,龍型的攻擊屬性往往比鬼魂型高,但它們也有更大的差異,F(xiàn)在,神奇寶貝的粉絲們可能會(huì)發(fā)現(xiàn)這個(gè)圖表有些不和諧,因?yàn)轭伾遣缓线m的,為什么草型的顏色是粉紅色,水型的顏色是橙色?我們必須馬上解決這個(gè)問題!幸運(yùn)的是,Seaborn允許我們?cè)O(shè)置自定義調(diào)色板,我們可以簡(jiǎn)單地創(chuàng)建一個(gè)有序的Python顏色十六進(jìn)制值列表。我用Bulbapedia創(chuàng)建了一個(gè)新的調(diào)色板。# using Bulbapedia to create a new color palette:#Bulbapedia : https://bulbapedia.bulbagarden.net/wiki/Category:Type_color_templatspkmn_type_colors = [‘#78C850’, # Grass
‘#F08030’, # Fire
‘#6890F0’, # Water
‘#A8B820’, # Bug
‘#A8A878’, # Normal
‘#A040A0’, # Poison
‘#F8D030’, # Electric
‘#E0C068’, # Ground
‘#EE99AC’, # Fairy
‘#C03028’, # Fighting
‘#F85888’, # Psychic
‘#B8A038’, # Rock
‘#705898’, # Ghost
‘#98D8D8’, # Ice
‘#7038F8’, # Dragon
]
根據(jù)口袋妖怪類型的顏色修改小提琴圖:plt.figure(figsize=(15,7));
sns.violinplot(x=data.Pokemon_Type,
y = data[“Attack Strength”],
palette = pkmn_type_colors);
分簇散點(diǎn)圖如你所見,小提琴圖非常適合可視化分布。然而,由于我們的數(shù)據(jù)集中只有150個(gè)神奇寶貝,我們有時(shí)可能想簡(jiǎn)單地顯示每個(gè)點(diǎn),這時(shí)就用到了分簇散點(diǎn)圖,它可以顯示每個(gè)點(diǎn),同時(shí)“疊加”具有相似值的點(diǎn)。plt.figure(figsize=(12,5));
sns.swarmplot(x=data.Pokemon_Type,y=data[“Attack Strength”],palette=pkmn_type_colors);
這看起來不錯(cuò),但是為了獲得更好的視覺效果,我們可以將兩者結(jié)合起來!畢竟,它們顯示相同的信息。疊加圖plt.figure(figsize=(10,10))sns.violinplot(x=data.Pokemon_Type, y = data[“Attack Strength”],
inner=None,
palette = pkmn_type_colors);sns.swarmplot(x=”Pokemon_Type”,
y=”Attack Strength”,
data=data,
color=’black’, #making points black
alpha=0.5);plt.title(“Attacking Strength as per Pokemon’s Type”);
注意事項(xiàng):*inner = None:*移除小提琴內(nèi)部的橫條*alpha = 0.5:*使點(diǎn)稍微透明:記住alpha值必須為浮點(diǎn),不要保留在“”中你可以在這里找到seaborn 關(guān)于顏色設(shè)置的參考資料:https://python-graph-gallery.com/100-calling-a-color-with-seaborn/因子圖因子圖使按分類劃分圖變得容易。plt.figure(figsize=(5,15))
factplot= sns.factorplot(x="Pokemon_Type",y="Attack Strength",data=data,hue="Generation",col="Generation",kind="swarm");factplot.set_xticklabels(rotation=-45)
plt.show()
簡(jiǎn)要說明:plt.xticks(rotation = -45):不起作用,因?yàn)樗恍D(zhuǎn)最后一個(gè)繪圖需要使用:set_xticklabels你只需更改變量名并運(yùn)行相同的代碼行,就可以像上面那樣進(jìn)行更多的可視化。我把它作為一個(gè)練習(xí)留給你去做,以便更好地掌握Python的可視化技能。
本文到此為止!希望這個(gè)教程對(duì)你來說有幫助,祝你的數(shù)據(jù)科學(xué)之旅學(xué)習(xí)愉快!

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長度6~500個(gè)字
您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)
最新活動(dòng)更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
4月30日立即下載>> 【村田汽車】汽車E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線下巡回】2025年STM32峰會(huì)
-
即日-5.15立即報(bào)名>>> 【在線會(huì)議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評(píng) >> 【評(píng)選啟動(dòng)】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評(píng)選
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開始
- 2 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺(tái)
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 光計(jì)算迎來商業(yè)化突破,但落地仍需時(shí)間
- 5 大模型下半場(chǎng):Agent時(shí)代為何更需要開源模型
- 6 中國“智造”背后的「關(guān)鍵力量」
- 7 優(yōu)必選:營收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?
- 8 營收猛增46%,昆侖萬維成為AI“爆品工廠”
- 9 全球無人駕駛技術(shù)排名:誰才是細(xì)分賽道的扛把子?
- 10 地平線自動(dòng)駕駛方案解讀