Seaborn 和 Matplotlib 數(shù)據(jù)可視化

簡述

Python 中哪雕,數(shù)據(jù)可視化一般是通過較底層的 Matplotlib 庫和較高層的 Seaborn 庫實現(xiàn)的,本文主要介紹一些常用的圖的繪制方法。在正式開始之前需要導(dǎo)入以下包

import numpy as np # 線性代數(shù)庫
import pandas as pd # 數(shù)據(jù)分析庫
import matplotlib.pyplot as plt
import seaborn as sns

Jupyter Notebook 中,為了讓圖片內(nèi)嵌在網(wǎng)頁中捅伤,可以打開如下開關(guān)

%matplotlib inline

另外,設(shè)置了不同的圖像效果和背景風(fēng)格怎虫,圖片的顯示也不一樣暑认。

Matplotlib 基礎(chǔ)

函數(shù)基本形式

Matplotlib 要求原始數(shù)據(jù)的輸入類型為 Numpy 數(shù)組,畫圖函數(shù)一般為如下形式(與 Matlab 基本一致)
plt.圖名(x, y, 'marker 類型')
例如
plt.plot(x, y)
plt.plot(x, y, 'o-')
plt.plot(x, y, 'o-')
plt.scatter(x, y)
plt.scatter(x, y, linewidths=x,marker='o')
等等大审,參數(shù) x蘸际,y 要求為 np 數(shù)組。
舉個例子

X = np.linspace(0, 2 * np.pi, 10)
plt.plot(X, np.sin(X), '-o')
plt.title('Sine curve')
plt.xlabel(r'$\alpha$')
plt.ylabel(r'sin($\alpha$)')

設(shè)置標(biāo)題及 X徒扶,Y 軸

  • 方法一
plt.figure(figsize=(3, 2))
plt.title("Title")
plt.xlabel("X")
plt.ylabel("Y")
plt.plot(np.arange(10), np.sin(np.arange(10)))
  • 方法二
f, ax = plt.subplots(figsize=(3, 2))
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_title("Title", fontsize=20)
ax.plot(np.arange(10), np.sin(np.arange(10)))

導(dǎo)出矢量圖

在論文寫作中粮彤,一般要求插入圖片的格式為矢量圖,MatplotlibSeaborn 圖片可以用如下代碼導(dǎo)出

plt.plot(.......)
# pdf 格式
plt.savefig('./filename.pdf',format='pdf')
# svg 格式
plt.savefig('./filename.svg',format='svg')

Seaborn 基礎(chǔ)

Seaborn 要求原始數(shù)據(jù)的輸入類型為 pandasDataframeNumpy 數(shù)組姜骡,畫圖函數(shù)一般為如下形式
sns.圖名(x='X軸 列名', y='Y軸 列名', data=原始數(shù)據(jù)df對象)

sns.圖名(x='X軸 列名', y='Y軸 列名', hue='分組繪圖參數(shù)', data=原始數(shù)據(jù)df對象)

sns.圖名(x=np.array, y=np.array[, ...])
hue 的意思是 variable in data to map plot aspects to different colors导坟。
舉個例子,建立如下數(shù)據(jù)集

X = np.linspace(0, 20, 10)
df = pd.DataFrame({"Input": X, "Linear": X, "Sin": np.sin(X)})
    Input       Linear      Sin
0   0.000000    0.000000    0.000000
1   2.222222    2.222222    0.795220
2   4.444444    4.444444    -0.964317
3   6.666667    6.666667    0.374151
4   8.888889    8.888889    0.510606
……

我們來擬合第一列與第二列

sns.regplot(x='Input', y='Linear', data=df)

子圖的繪制

繪制子圖一般使用 subplots 和 subplot 函數(shù)圈澈,我們分別介紹惫周。

subplots

一般形式為
f, ax = plt.subplots(ncols=列數(shù), nrows=行數(shù)[, figsize=圖片大小, ...])
舉兩個例子

f, ax = plt.subplots(ncols=2, nrows=2, figsize=(8, 6))

X = np.arange(0.01, 10, 0.01)
ax[0, 0].plot(X, 2 * X - 1)
ax[0, 0].set_title("Linear")
ax[0, 1].plot(X, np.log(X))
ax[0, 1].set_title("Log")
ax[1, 0].plot(X, np.exp(X))
ax[1, 0].set_title("Exp")
ax[1, 1].plot(X, np.sin(X))
ax[1, 1].set_title("Sin")
# 設(shè)置風(fēng)格
sns.set(style="white", context="talk")
# 隨機數(shù)生成器
rs = np.random.RandomState(7)
# Set up the matplotlib figure
f, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(8, 6), sharex=True)

# Generate some sequential data
x = np.array(list("ABCDEFGHI"))
y1 = np.arange(1, 10)
sns.barplot(x, y1, palette="BuGn_d", ax=ax1)
ax1.set_ylabel("Sequential")

# Center the data to make it diverging
y2 = y1 - 5
sns.barplot(x, y2, palette="RdBu_r", ax=ax2)
ax2.set_ylabel("Diverging")

# Randomly reorder the data to make it qualitative
y3 = rs.choice(y1, 9, replace=False)
sns.barplot(x, y3, palette="Set3", ax=ax3)
ax3.set_ylabel("Qualitative")

# Finalize the plot
sns.despine(bottom=True)
plt.setp(f.axes, yticks=[])
plt.tight_layout(h_pad=3)

subplot

基本形式為
subplot(nrows, ncols, index, **kwargs)

In the current figure, create and return an Axes, at position index of a (virtual) grid of nrows by ncols axes. Indexes go from 1 to nrows *ncols, incrementing in row-major order.
If nrows, ncols and index are all less than 10, they can also be given as a single, concatenated, three-digit number.
For example, subplot(2, 3, 3) and subplot(233) both create an Axes at the top right corner of the current figure, occupying half of the figure height and a third of the figure width.

舉幾個例子

plt.figure(figsize=(3, 3))
plt.subplot(221)
# 分成2x2,占用第二個康栈,即第一行第二列的子圖
plt.subplot(222)
# 分成2x1递递,占用第二個喷橙,即第二行
plt.subplot(212)
plt.figure(figsize=(3, 3))
plt.subplot(221)
plt.subplot(222)
plt.subplot(223)
plt.show()
plt.figure(figsize=(3, 3))
plt.subplot(121)
plt.subplot(222)
plt.subplot(224)
plt.show()
def f(t):  
    return np.exp(-t) * np.cos(2 * np.pi * t) 
t1 = np.arange(0, 5, 0.1)
t2 = np.arange(0, 5, 0.02)

plt.subplot(221)
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'r--')

plt.subplot(222)
plt.plot(t2, np.cos(2 * np.pi * t2), 'r--')

plt.subplot(212)
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])

plt.show()

直方圖

準備數(shù)據(jù)

X = np.arange(8)
y = np.array([1, 4, 2, 3, 3, 5, 6, 3])
df = pd.DataFrame({"X":X, "y":y})
sns.barplot("X", "y", palette="RdBu_r", data=df)
# 或者下面這種形式,但需要自行設(shè)置Xy軸的 label
# sns.barplot(X, y, palette="RdBu_r")


調(diào)整 palette 參數(shù)可以美化顯示風(fēng)格登舞。

統(tǒng)計圖

先調(diào)一下背景和載入一下數(shù)據(jù)

sns.set(style="darkgrid")
titanic = sns.load_dataset("titanic")

統(tǒng)計圖

sns.countplot(x="class", data=titanic)


hue 的統(tǒng)計圖(為了顯示美觀贰逾,可以調(diào)一下大小)

f, ax = plt.subplots(figsize=(8, 6))
sns.countplot(x="class", hue="who", data=titanic, ax=ax)

描述變量分布

描述變量的分布規(guī)律菠秒,方差疙剑、均值、極值等践叠,通常使用 boxplots 圖(箱圖)和 violins 圖(小提琴圖)言缤。

sns.set(style="whitegrid", palette="pastel", color_codes=True)
# Load the example tips dataset
tips = sns.load_dataset("tips")

violins 圖

sns.violinplot(x="day", y="total_bill", data=tips)
sns.despine(left=True) # 不顯示網(wǎng)格邊框線
violinplot

如圖,圖的高矮代表 y 值的范圍禁灼,圖的胖瘦代表分布規(guī)律轧简。
當(dāng)然,也可以描述不同 label 的分布匾二,下圖就表示了男女在不同時間的消費差異

sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True,
               inner="quart", palette={"Male": "b", "Female": "y"})
sns.despine(left=True)

box 圖

箱圖和小提琴圖的描述手段基本類似

sns.boxplot(x="day", y="total_bill", data=tips, palette="PRGn")
sns.despine(offset=10, trim=True) # 設(shè)置邊框的風(fēng)格
boxplot
sns.boxplot(x="day", y="total_bill", hue="sex", data=tips, palette="PRGn")
sns.despine(offset=10, trim=True)

數(shù)據(jù)分布直方圖

描述單變量的分布可以也使用數(shù)據(jù)分布直方圖
準備一些數(shù)據(jù)

mu,sigma=100,15  
x=mu+sigma*np.random.randn(10000)  
  • Matplotlib 形式
sns.set_color_codes()
n,bins,patches=plt.hist(x,50,normed=1,facecolor='g',alpha=0.75)  
plt.xlabel('Smarts')  
plt.ylabel('Probability')  
plt.title('Histogram of IQ')  
plt.text(60,.025, r'$\mu=100,\ \sigma=15$')  
plt.axis([40,160,0,0.03])  
plt.grid(True)  
  • Seaborn 形式
sns.set_color_codes()
plt.xlabel('Smarts')  
plt.ylabel('Probability') 
plt.title('Histogram of IQ')  
plt.text(60,.025, r'$\mu=100,\ \sigma=15$')  
sns.distplot(x, color="y")

描述相關(guān)性

一般的,描述相關(guān)性一般使用 pairplot 圖和 heatmap 圖拳芙。
先 load 一下數(shù)據(jù)集和設(shè)置背景風(fēng)格

sns.set(style="ticks")
df = sns.load_dataset("iris")

pairplot 圖

pairplot 圖一般用來描述不同 label 在同一 feature 上的分布察藐。

sns.pairplot(df, hue="species")
pairplot

heatmap 圖

heatmap 圖一般用來描述 feature 的相關(guān)性矩陣

sns.heatmap(df.corr(), square=True)

經(jīng)過一些實踐,下述代碼的配色方案比較美觀舟扎。

colormap = plt.cm.viridis
plt.figure(figsize=(12,12)) // 根據(jù)需要自行設(shè)置大蟹址伞(也可省略)
plt.title('Pearson Correlation of Features', y=1.05, size=15) // 加標(biāo)題
sns.heatmap(df.corr(),linewidths=0.1,vmax=1.0, square=True, cmap=colormap, linecolor='white', annot=True)
heatmap
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市睹限,隨后出現(xiàn)的幾起案子譬猫,更是在濱河造成了極大的恐慌碌冶,老刑警劉巖陌宿,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奔坟,居然都是意外死亡叨恨,警方通過查閱死者的電腦和手機柳刮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痒钝,“玉大人秉颗,你說我怎么就攤上這事∷途兀” “怎么了蚕甥?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長栋荸。 經(jīng)常有香客問我菇怀,道長凭舶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任敏释,我火速辦了婚禮库快,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钥顽。我一直安慰自己义屏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布蜂大。 她就那樣靜靜地躺著闽铐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奶浦。 梳的紋絲不亂的頭發(fā)上兄墅,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音澳叉,去河邊找鬼隙咸。 笑死,一個胖子當(dāng)著我的面吹牛成洗,可吹牛的內(nèi)容都是我干的五督。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼瓶殃,長吁一口氣:“原來是場噩夢啊……” “哼充包!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起遥椿,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤基矮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后冠场,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體家浇,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年慈鸠,在試婚紗的時候發(fā)現(xiàn)自己被綠了蓝谨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡青团,死狀恐怖譬巫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情督笆,我是刑警寧澤芦昔,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站娃肿,受9級特大地震影響咕缎,放射性物質(zhì)發(fā)生泄漏珠十。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一凭豪、第九天 我趴在偏房一處隱蔽的房頂上張望焙蹭。 院中可真熱鬧,春花似錦嫂伞、人聲如沸孔厉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撰豺。三九已至,卻和暖如春拼余,著一層夾襖步出監(jiān)牢的瞬間污桦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工匙监, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凡橱,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓亭姥,卻偏偏與公主長得像梭纹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子致份,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容