@Author:Runsen
在數(shù)據(jù)科學(xué)中,有多種工具可以進(jìn)行可視化缸浦。在本文中夕冲,我(毛利)展示了使用Python來實(shí)現(xiàn)的各種可視化圖表。
Matplotlib是Python中最常用的可視化工具之一,可以非常方便地創(chuàng)建海量類型的2D圖表和一些基本的3D圖表餐济。
主要的可視化視圖
比較:比較數(shù)據(jù)間各類別的關(guān)系耘擂,或者是它們隨著時(shí)間的變化趨勢(shì),比如折線圖絮姆;
聯(lián)系:查看兩個(gè)或兩個(gè)以上變量之間的關(guān)系醉冤,比如散點(diǎn)圖;
構(gòu)成:每個(gè)部分占整體的百分比篙悯,或者是隨著時(shí)間的百分比變化蚁阳,比如餅圖;
分布:關(guān)注單個(gè)變量鸽照,或者多個(gè)變量的分布情況螺捐,比如直方圖。
單變量可視化視圖:
一次值關(guān)注一個(gè)變量矮燎。如我們一次只關(guān)注身高變量定血,來看身高的取值分布,而暫時(shí)忽略其他變量诞外。
多變量可視化視圖:
可以讓一張圖同時(shí)查看兩個(gè)以上的變量澜沟,比如“身高”和“年齡”,你可以理解是同一個(gè)人的兩個(gè)參數(shù)峡谊,這樣在同一張圖中可以看到每個(gè)人的“身高”和“年齡”的取值茫虽,從而分析出這兩個(gè)變量之前是否存在某種聯(lián)系。
離散變量和連續(xù)變量:
離散變量是指其數(shù)值只能用自然數(shù)或整數(shù)單位計(jì)算的則為離散變量. 例如,企業(yè)個(gè)數(shù),職工人數(shù),設(shè)備臺(tái)數(shù)等,只能按計(jì)量單位數(shù)計(jì)數(shù),這種變量的數(shù)值一般用計(jì)數(shù)方法取得. 反之,在一定區(qū)間內(nèi)可以任意取值的變量叫連續(xù)變量,其數(shù)值是連續(xù)不斷的,相鄰兩個(gè)數(shù)值可作無限分割,即可取無限個(gè)數(shù)值.
針對(duì)離散變量我們可以使用常見的條形圖和餅圖完成數(shù)據(jù)的可視化工作既们,那么濒析,針對(duì)數(shù)值型變量,我們也有很多可視化的方法啥纸,例如箱線圖号杏、直方圖、折線圖斯棒、面積圖馒索、散點(diǎn)圖等等。
散點(diǎn)圖:
引入工具包名船,Matplotlib的pyplot包
import matplotlib.pyplot as plt
在工具包引用后绰上,畫散點(diǎn)圖,需要使用 plt.scatter(x, y, marker=None) 函數(shù)渠驼。
x蜈块、y 是坐標(biāo),marker 代表了標(biāo)記的符號(hào)。比如“x”百揭、“>”或者“o”爽哎。選擇不同的 marker,呈現(xiàn)出來的符號(hào)樣式也會(huì)不同(就是以指定的符號(hào)當(dāng)成點(diǎn)畫圖)器一,你可以自己試一下课锌。
或使用工具包seaborn
import seaborn as sns
在引用 seaborn 工具包之后,就可以使用 seaborn 工具包的函數(shù)了祈秕。如果想要做散點(diǎn)圖渺贤,可以直接使用 sns.jointplot(x, y, data=None, kind=‘scatter’) 函數(shù)。
其中 x请毛、y 是 data 中的下標(biāo)志鞍。data 就是我們要傳入的數(shù)據(jù),一般是 DataFrame 類型方仿。kind 這類我們?nèi)?scatter固棚,代表散點(diǎn)的意思。
例子:
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns# 數(shù)據(jù)準(zhǔn)備N = 1000x = np.random.randn(N)y = np.random.randn(N)# 用 Matplotlib 畫散點(diǎn)圖plt.scatter(x,y,marker="x")plt.show()#用seaborn畫圖df=pd.DataFrame({'x':x,'y':y})sns.joinplot(x='x',y='y',data=df,kind='scatter',marker='x')#sns還是要借助pyplot來打印圖的 其自身無show方法plt.show()
運(yùn)行結(jié)果: 折線圖:
折線圖可以用來表示數(shù)據(jù)隨著時(shí)間變化的趨勢(shì)仙蚜。
在 Matplotlib 中此洲,我們可以直接使用 plt.plot() 函數(shù),當(dāng)然需要提前把數(shù)據(jù)按照 x 軸的大小進(jìn)行排序委粉,要不畫出來的折線圖就無法按照 x 軸遞增的順序展示呜师。
在 Seaborn 中,我們使用 sns.lineplot (x, y, data=None) 函數(shù)艳丛。其中 x、y 是 data 中的下標(biāo)趟紊。data 就是我們要傳入的數(shù)據(jù)氮双,一般是 DataFrame 類型。
例子:
import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns# 數(shù)據(jù)準(zhǔn)備x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]y = [5, 3, 6, 20, 17, 16, 19, 30, 32, 35]# 使用 Matplotlib 畫折線圖plt.plot(x, y)plt.show()# 使用 Seaborn 畫折線圖df = pd.DataFrame({'x': x, 'y': y})sns.lineplot(x="年", y="月", data=df)plt.show()
運(yùn)行結(jié)果:
如果要修改X和Y軸的參數(shù)需要這樣寫代碼 df中的參數(shù)名字和lineplot中的參數(shù)的一一對(duì)應(yīng)的霎匈,同時(shí)lineplot中的year就是x軸的名字戴差,money就是y軸的名字
df = pd.DataFrame({'year': x, 'money': y})sns.lineplot(x="year", y="money", data=df)plt.show()
直方圖:
直方圖是比較常見的視圖,它是把橫坐標(biāo)等分成了一定數(shù)量的小區(qū)間铛嘱,這個(gè)小區(qū)間也叫作“箱子”暖释,然后在每個(gè)“箱子”內(nèi)用矩形條(bars)展示該箱子的箱子數(shù)(也就是 y 值),這樣就完成了對(duì)數(shù)據(jù)集的直方圖分布的可視化墨吓。
在 Matplotlib 中球匕,我們使用 plt.hist(x, bins=10) 函數(shù),其中參數(shù) x 是一維數(shù)組帖烘,bins 代表直方圖中的箱子數(shù)量亮曹,默認(rèn)是 10。
在 Seaborn 中,我們使用 sns.distplot(x, bins=10, kde=True) 函數(shù)照卦。其中參數(shù) x 是一維數(shù)組式矫,bins 代表直方圖中的箱子數(shù)量,kde 代表顯示核密度估計(jì)役耕,默認(rèn)是 True采转,我們也可以把 kde 設(shè)置為 False,不進(jìn)行顯示瞬痘。核密度估計(jì)是通過核函數(shù)幫我們來估計(jì)概率密度的方法故慈。
例子:
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns# 數(shù)據(jù)準(zhǔn)備a = np.random.randn(100)s = pd.Series(a) # 用 Matplotlib 畫直方圖plt.hist(s)plt.show()# 用 Seaborn 畫直方圖sns.distplot(s, kde=False)plt.show()sns.distplot(s, kde=True)plt.show()
運(yùn)行結(jié)果: 條形圖
條形圖可以幫我們查看類別的特征。在條形圖中图云,長(zhǎng)條形的長(zhǎng)度表示類別的頻數(shù)惯悠,寬度表示類別。
在 Matplotlib 中竣况,我們使用 plt.bar(x, height) 函數(shù)克婶,其中參數(shù) x 代表 x 軸的位置序列,height 是 y 軸的數(shù)值序列丹泉,也就是柱子的高度情萤。
在 Seaborn 中,我們使用 sns.barplot(x=None, y=None, data=None) 函數(shù)摹恨。其中參數(shù) data 為 DataFrame 類型筋岛,x、y 是 data 中的變量晒哄。
例子:
import matplotlib.pyplot as pltimport seaborn as sns# 數(shù)據(jù)準(zhǔn)備x = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5']y = [5, 4, 8, 12, 7]# 用 Matplotlib 畫條形圖plt.bar(x, y)plt.show()# 用 Seaborn 畫條形圖sns.barplot(x, y)plt.show()
運(yùn)行結(jié)果: 箱型圖:
它可以幫我們分析出數(shù)據(jù)的差異性睁宰、離散程度和異常值等。
箱線圖寝凌,又稱盒式圖柒傻,由五個(gè)數(shù)值點(diǎn)組成:最大值 (max)、最小值 (min)较木、中位數(shù) (median) 和上下四分位數(shù) (Q3, Q1)红符。
在 Matplotlib 中,我們使用 plt.boxplot(x, labels=None) 函數(shù)伐债,其中參數(shù) x 代表要繪制箱線圖的數(shù)據(jù)预侯,labels 是缺省值,可以為箱線圖添加標(biāo)簽峰锁。
在 Seaborn 中萎馅,我們使用 sns.boxplot(x=None, y=None, data=None) 函數(shù)。其中參數(shù) data 為 DataFrame 類型虹蒋,x校坑、y 是 data 中的變量拣技。
例子:
# 數(shù)據(jù)準(zhǔn)備# 生成 0-1 之間的 10*4 維度數(shù)據(jù)data=np.random.normal(size=(10,4)) lables = ['A','B','C','D']# 用 Matplotlib 畫箱線圖plt.boxplot(data,labels=lables)plt.show()# 用 Seaborn 畫箱線圖df = pd.DataFrame(data, columns=lables)sns.boxplot(data=df)plt.show()
運(yùn)行結(jié)果:
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 14px;">在這里插入圖片描述</figcaption>
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 14px;">在這里插入圖片描述</figcaption>
餅圖
餅圖是常用的統(tǒng)計(jì)學(xué)模塊,可以顯示每個(gè)部分大小與總和之間的比例耍目。在 Python 數(shù)據(jù)可視化中膏斤,它用的不算多。我們主要采用 Matplotlib 的 pie 函數(shù)實(shí)現(xiàn)它邪驮。
在 Matplotlib 中莫辨,我們使用 plt.pie(x, labels=None) 函數(shù),其中參數(shù) x 代表要繪制餅圖的數(shù)據(jù)毅访,labels 是缺省值沮榜,可以為餅圖添加標(biāo)簽。
這里我設(shè)置了 lables 數(shù)組喻粹,分別代表高中蟆融、本科、碩士守呜、博士和其他幾種學(xué)歷的分類標(biāo)簽型酥。nums 代表這些學(xué)歷對(duì)應(yīng)的人數(shù)。
例子:
import matplotlib.pyplot as plt # 數(shù)據(jù)準(zhǔn)備 nums = [25, 37, 33, 37, 6] labels = ['High-school','Bachelor','Master','Ph.d', 'Others'] # 用 Matplotlib 畫餅圖 plt.pie(x = nums, labels=labels) plt.show()
運(yùn)行結(jié)果:
總結(jié)
在 Python 生態(tài)系統(tǒng)中繪制數(shù)據(jù)是一件好事也是一件壞事查乒。繪制數(shù)據(jù)的工具有很多可供選擇既是一件好事也是一件壞事弥喉,盡力搞清楚哪一個(gè)工具適合你取決于你要實(shí)現(xiàn)什么。在一定程度上玛迄,你需要嘗試各種工具老弄清哪種工具適合你由境,我覺得沒有哪一個(gè)工具是最好或最壞。
下面是可視化知識(shí)點(diǎn)的思維導(dǎo)圖蓖议,希望大家轉(zhuǎn)發(fā)收藏
可視化知識(shí)點(diǎn)