資料視覺化詳解+程式碼演練

磐創AI發表於2018-10-11

資料視覺化詳解+程式碼演練

作者 | Walker

編輯 | 磐石

出品 | 磐創AI技術團隊

【磐創AI導讀】:本文詳細介紹了兩個資料視覺化工具庫並附python演練。歡迎大家點選上方藍字關注我們的公眾號:磐創AI

我們本篇文章講的資料視覺化是面向開發人員的,是利用python中一些視覺化庫如:matplotlib或是seaborn透過對資料視覺化,來分析資料表格中各維度間的關係或是資料分佈的特性,從而有助於我們更好的理解資料,幫助我們進行下一步資料分析或是為資料建模提供方向。本篇文章的方法並非是面向使用者做資料展示或面向企業做資料視覺化,這種情況下大家可以嘗試使用EchartsTableau等資料展示工具。本文將分為matplotlib視覺化和seaborn視覺化兩個部分。


一、Matplotlib資料視覺化

Matplotlib是一個Python2D繪相簿,開發者使用Matplotlib僅需要幾行程式碼便可以輕鬆繪圖,生成柱狀圖、散點圖、折線圖、盒圖、琴圖等。

首先,matplotlib的安裝非常的簡單,Windows環境下我們可以透過pip install matplotlib直接完成安裝,而Linux環境可以使用sudo pip install matplotlib完成安裝。接著我們使用import matplotlib.pyplot as plt匯入matplotlib庫,便可以開始繪圖了。

完整的繪圖程式如下所示,包括圖例、座標軸、取值範圍、刻度值、標題、註解等內容。

程式1:

import numpy as np
import matplotlib.pyplot as plt
from pylab import *

# 定義資料部分
x = np.arange(0., 10, 0.2)
y1 = np.cos(x)
y2 = np.sin(x)
y3 = np.sqrt(x)

# 繪製 3 條函式曲線
plt.plot(x, y1, color='blue', linewidth=1.5, linestyle='-', marker='.', label=r'$y = cos{x}$')
plt.plot(x, y2, color='green', linewidth=1.5, linestyle='-', marker='*', label=r'$y = sin{x}$')
plt.plot(x, y3, color='m', linewidth=1.5, linestyle='-', marker='x', label=r'$y = \sqrt{x}$')

# 座標軸上移
ax = plt.subplot(111)
ax.spines['right'].set_color('none')     # 去掉右邊的邊框線
ax.spines['top'].set_color('none')       # 去掉上邊的邊框線

# 移動下邊邊框線,相當於移動 X 軸
ax.xaxis.set_ticks_position('bottom')    
ax.spines['bottom'].set_position(('data', 0))

# 移動左邊邊框線,相當於移動 y 軸
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))

# 設定 x, y 軸的取值範圍
plt.xlim(x.min()*1.1, x.max()*1.1)
plt.ylim(-1.5, 4.0)

# 設定 x, y 軸的刻度值
plt.xticks([2, 4, 6, 8, 10], [r'2', r'4', r'6', r'8', r'10'])
plt.yticks([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0],
   [r'-1.0', r'0.0', r'1.0', r'2.0', r'3.0', r'4.0'])

# 新增文字
plt.text(4, 1.68, r'$x \in [0.0, \ 10.0]$', color='k', fontsize=15)
plt.text(4, 1.38, r'$y \in [-1.0, \ 4.0]$', color='k', fontsize=15)

# 特殊點新增註解
plt.scatter([8,],[np.sqrt(8),], 50, color ='m')  # 使用散點圖放大當前點
plt.annotate(r'$2\sqrt{2}$', xy=(8, np.sqrt(8)), xytext=(8.5, 2.2), fontsize=16, color='#090909', arrowprops=dict(arrowstyle='->', connectionstyle='arc3, rad=0.1', color='#090909'))

# 設定標題、x軸、y軸
plt.title(r'$the \ function \ figure \ of \ cos(), \ sin() \ and \ sqrt()$', fontsize=19)
plt.xlabel(r'$the \ input \ value \ of \ x$', fontsize=18, labelpad=88.8)
plt.ylabel(r'$y = f(x)$', fontsize=18, labelpad=12.5)

# 設定圖例及位置
plt.legend(loc='up right')    
# plt.legend(['cos(x)', 'sin(x)', 'sqrt(x)'], loc='up right')

# 顯示網格線
plt.grid(True)    

# 顯示繪圖
plt.show()

散點圖、曲線圖、折線圖、灰度圖、餅狀圖、箱圖、琴圖等常用圖形的繪製,也非常的簡單,程式如下所示:

程式2:

#散點圖,是用來展示兩個維度間的相關性
x = np.random.normal(size=1000)
y = np.random.normal(size=1000)
plt.scatter(x,y)

程式3:

#曲線圖,觀察某個變數的走勢

x = np.arange(-5,5,0.1)

y = x ** 2

plt.plot(x,y)y = np.random.normal(size=1000)

程式4:

#灰度圖,檢視某個維度的資料狀況

x = np.random.normal(size=1000)

plt.hist(x, bins=100)

程式5:

#餅圖,顯示一個系列中各項的大小以及各項所佔總和的比例

import numpy as np

import matplotlib.pyplot as plt

# x為資料, 根據資料在所有資料中所佔的比例顯示結果

# labels設定每個資料的標籤

# autoper 設定每一塊所佔的百分比

# explode 設定某一塊或者很多塊突出顯示出來, 由上面定義的explode陣列決定

# shadow 設定陰影,這樣顯示的效果更好

labels = ["SH", "BI", "SZ", "GD"]

facts = [20, 10, 30, 40]

explode = [0, 0, 0.02, 0]

plt.axes(aspect = 1)

plt.pie(x = facts, labels = labels, explode= explode, shadow= True)

plt.show()

程式6:

#箱圖

#
上邊緣(Q3+1.5IQR)、下邊緣(Q1-1.5IQR)、IQR=Q3-Q1

#
上四分位數(Q3)、下四分位數(Q1)

#
中位數

#
異常值

#
處理異常值時與3σσ標準的異同:統計邊界是否受異常值影響、容忍度的大小



plt.boxplot(y)


二、Seaborn資料視覺化

Seaborn相較於matplotlib更加的方便、簡單。因為Seaborn中自帶了一些統計的包,它在畫圖的同時,會完成統計的擬合。而且Seaborn畫圖時的引數也更多,這樣matplotlib可能很多行的程式碼,seaborn僅僅需要間的幾行就能實現同樣的效果。


Seaborn的安裝也非常的簡單,使用pip install seaborn直接安裝即可,首先我們來介紹一些Seaborn中的基本繪圖函式:折線圖:plot()、散點圖:lmplot()、柱狀圖:barplot()、聯合分佈圖:jointplot()、琴圖:violinplot()、箱式圖:boxplot()、比較圖:pairplot()等。常用的屬性有hue:對資料按照不同的型別先做分組,再分別對每組資料繪圖;col:用於多列資料都出現分組時;markers:用哪種符號對資料進行標註,Ci:是否開啟置信區間;colordataxy等。


接下來我們透過兩個案例來直觀的比較一下seabornmatplotlib的不同。


案例一:給定資料集航班乘客變化分析data = sns.load_dataset("flights"),利用柱狀圖分析乘客在一年中各月份的分佈情況。


Matplotlib版本:

per_month_distribute = data.groupby('month').agg([np.mean, np.std])['passengers']

_,axe=plt.subplots()

plt.rcParams["figure.figsize"] = (12,8)

print(per_month_distribute)

plt.bar(range(12), per_month_distribute['mean'],color='cadetblue',label='average')

#yerr:y座標對應誤差的正負值,ls=linestyle,lw=linewidth

plt.errorbar(range(12), per_month_distribute['mean'],yerr=per_month_distribute['std'],ls='none',color='darkslategray', lw=5, label='error')

plt.xticks(range(12),per_month_distribute.index,fontsize=15,rotation=45)#把X軸上的字型旋轉45度,以免重疊

plt.xlabel('Month of Year',fontsize=20)

plt.ylabel('Passengers',fontsize=20)

plt.legend([u"乘客量均值", u"乘客量標準差"],fontsize=15) #把label標註的內容顯示出來

plt.title(u'乘客在一年中各月份的分佈',fontsize=25)

axe.spines['top'].set_color(None)

axe.spines['right'].set_color(None)

plt.scatter(x,y)


Seaborn版本:

import seaborn as sns

sns.factorplot(x='month',y='passengers',data=data, kind='bar',size=8)

效果圖:

資料視覺化詳解+程式碼演練

案例二:給定資料集餐廳收取小費的情況:data = sns.load_dataset("tips"),繪製分組柱狀圖分析性別+抽菸的組合因素對慷慨度的影響

Matplotlib版本:

tmp_data=data.groupby(['sex','smoker'])['tip'].agg([np.mean,np.std])

width = 0.2

_,axe=plt.subplots()

plt.bar([1,2],tmp_data['mean'].loc['Male'],width=width, label='Male')

plt.errorbar([1,2],tmp_data['mean'].loc['Male'],

            yerr = tmp_data['std'].loc['Male'], ls ='none',lw=4,color='darkblue',label=None)

#畫女性抽菸柱狀圖,X+0.2

plt.bar([x+width for x in [1,2]],tmp_data['mean'].loc['Female'],width=width,label='Female',color='salmon')

plt.errorbar([x+width for x in [1,2]],tmp_data['mean'].loc['Female'],

            yerr=tmp_data['std'].loc['Female'],ls='none',lw=4,color='darkred',label=None)

plt.setp(axe, xticks=[1.1,2.1], xticklabels=['Yes','No'])  #設定橫座標引數

plt.legend(fontsize=15)

plt.xlabel('Smoker',fontsize=15)

plt.ylabel('Tip',fontsize=15)

plt.axis([0.7,2.7,0,5])   #移動座標軸,[left,right,bottom,top],距離左右,上下邊框的距離

plt.title(u'性別+抽菸的組合因素對慷慨度的影響')

Seaborn版本:

sns.barplot(x='smoker',y='tip',data=tips,hue='sex')

效果圖:

資料視覺化詳解+程式碼演練

總結:透過上邊的案例我們分別透過matplotlib和seaborn完成了資料視覺化的操作,我麼可以看到Seaborn封裝的更好,使用起來更簡單;但Matplotlib靈活性更高、功能也更加強大。學習MatplotlibSeaborn更多的函式、圖形的繪製,歡迎大家學習它們的官方手冊,這裡小編只是做了一個簡單的常用整理。Matplotlib官方文件:

Seaborn官方手冊:

資料視覺化詳解+程式碼演練

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555081/viewspace-2216045/,如需轉載,請註明出處,否則將追究法律責任。

相關文章