作者 | Walker
我們本篇文章講的數據可視化是面向開發人員的,是利用python中一些可視化庫如:matplotlib或是seaborn通過對數據可視化,來分析數據表格中各維度間的關係或是數據分佈的特性,從而有助於我們更好的理解數據,幫助我們進行下一步數據分析或是為數據建模提供方向。本篇文章的方法並非是面向用戶做數據展示或面向企業做數據可視化,這種情況下大家可以嘗試使用Echarts或Tableau等數據展示工具。本文將分為matplotlib可視化和seaborn可視化兩個部分。
一、Matplotlib數據可視化
Matplotlib是一個Python的2D繪圖庫,開發者使用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.arange(-5,5,0.1)
y = x ** 2
plt.plot(x,y)y = np.random.normal(size=1000)
程序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:是否開啟置信區間;color、data、x、y等。
接下來我們通過兩個案例來直觀的比較一下seaborn和matplotlib的不同。
案例一:給定數據集航班乘客變化分析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靈活性更高、功能也更加強大。學習Matplotlib和Seaborn更多的函數、圖形的繪製,歡迎大家學習它們的官方手冊,這裡小編只是做了一個簡單的常用整理。
Matplotlib官方文檔: http://www.matplotlib.org;
Seaborn官方手冊: http://seaborn.pydata.org。
對深度學習感興趣,熱愛Tensorflow的小夥伴,歡迎關注我們的網站!http://www.panchuang.net 我們的公眾號:磐創AI。
閱讀更多 人工智能遇見磐創 的文章