俗話說得好,一圖勝千言。數(shù)據(jù)可視化是數(shù)據(jù)科學(xué)中的一個(gè)重要部分。創(chuàng)建可視化很簡(jiǎn)單,但是創(chuàng)建優(yōu)秀的可視化很難。
數(shù)據(jù)可視化有兩種主要用途:探索數(shù)據(jù)和交流數(shù)據(jù)。
matplotlib
現(xiàn)在有很多工具都可以用來可視化數(shù)據(jù),比如我們常用的Excel,還有數(shù)據(jù)科學(xué)另一門重要的語言R,以及百度的Echarts等可視化工具。今天我們的主角是Python中的matplotlib庫(官網(wǎng):http:// matplotlib.org),相對(duì)來說,matplotlib功能不是最強(qiáng)大的,但是對(duì)于基本的圖形來說,matplotlib很好用。
安裝matplotlib:如果你已經(jīng)安裝了Python的pip工具,那么你只需要pipinstall matplotlib即可安裝。這是最簡(jiǎn)單的一種方法,建議使用這種方法。
這里我們使用的是matplotlib.pyplot模塊。pyplot保持著一種內(nèi)部狀態(tài),你可以一步步創(chuàng)建可視化。一旦創(chuàng)建工作完成,就可以保存了(用savefig)或顯示(用show)你的圖形。
下面我們就來簡(jiǎn)單的畫一個(gè)折線圖。大家都知道達(dá)康書記比較關(guān)系GDP,一心想著提升GDP,我們就簡(jiǎn)單的讓GDP增長(zhǎng)起來吧。下面看一下代碼和視圖:
#折線圖
from matplotlib import pyplot as plt
#設(shè)置字體,顯示中文
from pylab import *
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
#這里只是作圖示例,與真實(shí)數(shù)據(jù)無關(guān)
years = [2010, 2011, 2012, 2013, 2014, 2015, 2016]
gdp = [300.2, 520, 1024, 2800.5, 5868.9, 9999.9, 14998.8]
#創(chuàng)建一幅線圖,x軸是年份,y軸是gdp
plt.plot(years, gdp, color = 'green', marker = 'o', linestyle = 'solid')
#添加一個(gè)標(biāo)題
plt.title('人民的名義GDP')
#給y軸加標(biāo)記
plt.ylabel(r'十億元')
plt.ticklabel_format(useOffset=False)
plt.show
條形圖
如果我們想展示一些離散的項(xiàng)目集合中的數(shù)量是如何變化的,可以使用條形圖。比如:下圖顯示了幾個(gè)人擁有的硬幣數(shù)量。
#條形圖
from matplotlib import pyplot as plt
#設(shè)置字體,顯示中文
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
coins = ['ming', 'hong', 'monkey', 'dakang', 'ruijin']
num_coins = [5, 4, 3, 8, 10]
#條形的默認(rèn)寬度是0.8,因此我們對(duì)左側(cè)坐標(biāo)加0.1,這樣條形就放在中心了
xs = [i + 0.1 for i, _ in enumerate(coins)]
#使用左側(cè)x坐標(biāo)[xs]和高度[num_coins]畫條形圖
plt.bar(xs, num_coins)
plt.ylabel('硬幣數(shù)量')
plt.title('每人擁有硬幣數(shù)量')
#使用人名標(biāo)記x軸,位置在x軸上條形的中心
plt.xticks([i + 0.5 for i, _ in enumerate(coins)], coins)
plt.show
條形圖也可以用來繪制擁有大量數(shù)值取值的變量直方圖,以此來探索這些取值是如何分布的。如下圖所示。
#直方圖
from matplotlib import pyplot as plt
from collections import Counter
#設(shè)置字體,顯示中文
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
grades = [83, 95, 87, 70, 0, 85, 82, 100, 67, 73, 77, 0]
decile = lambda grade:grade //10*10
histogram = Counter(decile(grade) for grade in grades)
#每個(gè)條形向左側(cè)移動(dòng)4個(gè)單位,給每個(gè)條形設(shè)置正確的高度,條形寬度設(shè)置為8
plt.bar([x - 4 for x in histogram.keys], histogram.values, 8)
plt.axis([-5, 105, 0, 5]) #x軸取值-5到105,y軸取值0到5
plt.xticks([10*i for i in range(11)]) #x軸標(biāo)記為0,10,。。。100
plt.xlabel('十分相')
plt.ylabel('學(xué)生數(shù)')
plt.title('考試分?jǐn)?shù)分布圖')
plt.show
線圖
前面說過,可以用plt.plot來制作線圖,這種圖形可以涌過來清晰地顯示某種事物的趨勢(shì)。代碼和圖如下所示:
#線圖
from matplotlib import pyplot as plt
#設(shè)置字體,顯示中文
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
variance = [1, 2, 4, 8, 16, 32, 64, 128, 256]
bias_squared = [256, 128, 64, 32, 16, 8, 4, 2, 1]
table_error = [x+y for x, y in zip(variance, bias_squared)]
xs = [i for i,_ in enumerate(variance)]
#可以多次調(diào)用plt.plot方便在同一個(gè)圖上顯示多個(gè)序列
plt.plot(xs, variance, 'g-', label = 'variance') #綠色實(shí)線
plt.plot(xs, bias_squared, 'r-.', label = 'bias_squared') #紅色點(diǎn)虛線
plt.plot(xs, table_error, 'b:', label = 'table error') #藍(lán)色點(diǎn)線
#loc=9表示”頂部中央“
plt.legend(loc=9)
plt.xlabel('模型復(fù)雜度')
plt.title('偏差-方差權(quán)衡圖')
plt.show
散點(diǎn)圖
散點(diǎn)圖是顯示成對(duì)數(shù)據(jù)集的可視化關(guān)系的比較好的方法,比如畫一個(gè)你微信的好友數(shù),和你每天使用微信的時(shí)間之間的關(guān)系。看一下代碼和示例圖:
#散點(diǎn)圖
from matplotlib import pyplot as plt
#設(shè)置字體,顯示中文
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
friends = [70, 65, 72, 63, 71, 64, 60, 64, 67]
minutes = [175, 170, 205, 120, 220, 130, 105, 145, 190]
labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
plt.scatter(friends, minutes)
#每個(gè)點(diǎn)加標(biāo)記
for label, friend_count, minute_count in zip(labels, friends, minutes):
plt.annotate(label,
xy = (friend_count, minute_count), #把標(biāo)記放在對(duì)應(yīng)的點(diǎn)上
xytext = (-5, 5), #但要有輕微偏離
textcoords = 'offset points')
plt.title('日分鐘數(shù)與朋友數(shù)')
plt.xlabel('朋友數(shù)')
plt.ylabel('花在微信上的日分鐘數(shù)')
plt.show
小結(jié)
今天學(xué)習(xí)一下Python中使用matplotlib進(jìn)行數(shù)據(jù)可視化,數(shù)據(jù)分析必須做到可視化。希望通過上面的操作能幫助大家。
聯(lián)系客服