前言
靜下心算算恤筛,當程序員已經(jīng)有好幾年了官还,不過自大學時代開始,學習對我來說就是個被動接受的過程叹俏,學校的課程妻枕、當時熱門的移動端開發(fā)、數(shù)據(jù)庫的學習粘驰、web學習屡谐、PHP后端學習……需要做什么我便去學什么,到了今天蝌数,突然意識到我是不是該給自己一個明確的發(fā)展方向了愕掏,畢竟歲月不饒人,96年的小朋友都參加工作了顶伞,不精通某一領域始終都會覺得渾渾噩噩饵撑。因為對大數(shù)據(jù)比較感興趣剑梳,而這方面的知識挖掘空間和發(fā)展空間都很大,再加上以前也摸過Python滑潘,所以給自己定了個自學計劃垢乙,也寫一些筆記類的博客做個記錄與學習分享。關于Python的基礎語法這類的東西就不在筆記中額外開文章寫了语卤,我會在代碼示例中穿插著提一些Python的語法追逮,因為這畢竟是一門“腳本語言”,語法的學習并不困難粹舵。這個系列的博客我會盡量地勤快些钮孵,算是對自己的敦促,開始的部分是結合《Python編程:從入門到實踐》這本書上的例子做一些理解眼滤,下一步是根據(jù)《利用Python進行數(shù)據(jù)分析》這本書做一些學習筆記巴席。
開發(fā)環(huán)境
《利用Python進行數(shù)據(jù)分析》中開篇就說到了“你的Python開發(fā)環(huán)境是什么”的問題,作者給出的答案是“IPython外加一個文本編輯器”诅需。這樣的開發(fā)環(huán)境對于一個經(jīng)驗老到的工程師來說漾唉,無疑是最為簡潔易用的,好比我現(xiàn)在工作中诱担,寫Android代碼會使用Android Studio毡证,前輩會使用Source Insight;寫PHP會用到PHPStorm蔫仙,前輩會使用Source Insight料睛;寫web前端會使用VSCode,前輩會使用Source Insight……年輕的程序員有個通病就是過分依賴于使用IDE進行開發(fā)摇邦,我也是個年輕程序員恤煞,所以在這個博客系列中我是用的開發(fā)工具是PyCharm。在這之前我也分別嘗試了在Ubuntu施籍、Windows下搭建《利用Python進行數(shù)據(jù)分析》書中所需要的開發(fā)環(huán)境居扒,過程其實是很繁瑣的,而且使用文本編輯器寫代碼的效率……反正我水平有限丑慎,所以我的看法是喜喂,搭建環(huán)境這個過程是需要親自動手體驗一下的,而實際的生產(chǎn)中竿裂,我更傾向于使用IDE玉吁。
至于下載Python、配置環(huán)境變量腻异、下載PyCharm进副,這些都不在這里多講了。
在這一篇博客中主要使用的開發(fā)包是matplotlib悔常,在PyCharm導入即可影斑,Download的過程可能會有點慢甚至下載不了给赞,搭個梯子就行了,都很簡單矫户。
言歸正傳片迅,初探門徑
什么是數(shù)據(jù)可視化?
數(shù)據(jù)可視化指的是通過可視化表示來探索數(shù)據(jù)吏垮,它與數(shù)據(jù)挖掘緊密相關障涯,而數(shù)據(jù)挖掘指的是使用代碼來探索數(shù)據(jù)集的規(guī)律和關聯(lián)。數(shù)據(jù)集可以是用一行代碼就能表示的小型數(shù)字列表膳汪,也可以是數(shù)以及字節(jié)的數(shù)據(jù)。
——摘自《Python編程:從入門到實踐》
我們可以這樣理解九秀,數(shù)據(jù)可視化和數(shù)據(jù)挖掘都是探索數(shù)據(jù)和分析數(shù)據(jù)的一種手段遗嗽,只不過數(shù)據(jù)挖掘是以代碼為探索途徑,而數(shù)據(jù)可視化是將數(shù)據(jù)轉換為圖形鼓蜒、圖表這樣可視的形式來進行分析痹换。
關于matplotlib
matplotlib是一個Python的2D繪圖庫,我們可以通過這個庫將數(shù)據(jù)繪制成各種2D圖形(直方圖都弹、散點圖娇豫、條形圖等)。
小試牛刀
matplotlib是一個功能很強大的繪圖庫畅厢,其提供的一系列功能完善的api可以幫助我們快速地建立起我們所需的圖形冯痢,接下來是幾個簡單的例子,在這些例子中我也會穿插著記錄一下Python的相關語法框杜。
1.先來一個簡單的折線圖
①import matplotlib.pyplot as plt
squares = [1, 4, 9, 16, 25]
②plt.plot(squares, linewidth=5)
③plt.title("Square Numbers", fontsize=24)
④plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14) ⑤plt.tick_params(axis='both', labelsize=12)plt.show()
(代碼中有些行的開頭有標號作為稍后講解代碼的標號浦楣,要運行這些代碼的話先把標號刪掉哦)
這段代碼的執(zhí)行效果是這樣的:
先來看看代碼吧:
①導入matplotlib.pyplot模塊并賦予其別名plt,這是Python中常用的小技巧咪辱,目的主要是簡化一些名稱振劳,當然我們也可以這樣寫:
from matplotlib import pyplot
不過這樣一來,在后面調用到pyplot的方法時需要把之前的plt改為全稱pyplot油狂,運行結果不會有任何差別历恐。
②plot()方法:這里將存放了一組平方數(shù)的列表傳入plot(),它將會嘗試根據(jù)這些數(shù)據(jù)繪制出有意義的圖形专筷。再調用show()即可將圖形顯示出來弱贼。實參linewidth=5指定了折線的寬度。
③title()方法:使用此方法為圖標添加標題仁堪,實參fontsize=24指定了文字尺寸哮洽,后面的方法中該參數(shù)含義相同。
④xlabel()和ylabel()方法:為x軸和y軸命名弦聂。
⑤tick_params()方法:設置坐標軸刻度的樣式鸟辅,實參axis='both'表示同時設置兩條軸氛什,也可以指定為x或y單獨設置。
相信大家發(fā)現(xiàn)了一個問題匪凉,我們傳入的數(shù)據(jù)是一組平方值枪眉,而我們起始的數(shù)據(jù)是1的平方,但是x軸的起點卻是0——事實上當你向plot()提供一系列數(shù)字時再层,它會默認x軸的0作為數(shù)據(jù)的起點贸铜,要改變這種默認配置,只需要對代碼稍作修改聂受,再提供一組x軸的值與平方數(shù)一一對應:
import matplotlib.pyplot as plt
input_values = [1, 2, 3, 4, 5]
squares = [1, 4, 9, 16, 25]
plt.plot(input_values, squares, linewidth=5)
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
plt.tick_params(axis='both', labelsize=12)
plt.show()
來看看運行結果:
這樣就好多了對吧蒿秦?
2.再試試散點圖吧
在繪制折線圖的時候,我們使用了plot()方法來接收數(shù)據(jù)蛋济,而對于散點圖棍鳖,則需要使用scatter()方法。我們直接來看看代碼:
import matplotlib.pyplot as plt
①x_values = list(range(1, 101)) # 區(qū)分list()和range()
y_values = [x ** 2 for x in x_values]
②plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, edgecolors='none', s=40)
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
plt.tick_params(axis="both", labelsize=14)
③plt.axis([0, 110, 0, 11000])
# plt.show()
④plt.savefig('squares_plot.png', bbox_inches='tight')
依然根據(jù)標號來看看代碼:
①x_values和y_values碗旅,定義了數(shù)據(jù)源渡处,分別對應x軸的輸入值和y軸的輸出值,相互間的關系為y軸的輸出值為x軸值的平方祟辟。在Python中医瘫,range()方法的含義是產(chǎn)生一個可迭代的對象,它的很多行為都與list相似旧困,比如在遍歷range(1, 101)并打印將會得到1至100的值醇份,但是它與list是有本質區(qū)別的,即它在迭代的情況下返回的是一個索引值而非在內存中真正生成一個列表對象叮喳,所以在Python3中執(zhí)行print(range(1, 101))被芳,你將會得到的打印結果是range(1, 101)而非一個從1到100的列表。所以想要得到一個真正的列表則需要跟list()方法結合使用馍悟。對于這一句[x ** 2 for x in x_values]畔濒,可能看著有些奇怪,但并不難理解锣咒,我們可以將它看成遍歷列表x_values侵状,每次遍歷時將取出一個x值將它做平方放入y_values中生成一個列表。
②scatter()方法:和上一個例子中的plot()方法類似毅整,都是負責接收數(shù)據(jù)繪制圖形趣兄,我們可以通過傳入實參c、edgecolors悼嫉、s來分別指定散點顏色艇潭、散點邊緣顏色和散點大小,對于顏色可以直接傳“red”、“blue”這種簡單的顏色蹋凝,也可以傳入rgb色值鲁纠。在本段代碼中,則是利用顏色映射(colormap)來設置顏色鳍寂,即代碼中的實參cmap改含,結合c=y_values,繪制出的散點將根據(jù)y軸值由小到大顏色逐漸加深迄汛,基本顏色為藍色捍壤。
③axis()方法:指定每個坐標軸的取值范圍,[x_min, x_max, y_min, y_max]鞍爱。
④savefig()方法:可以注意到鹃觉,在這個例子中,我將show()方法注釋掉了睹逃,改為savefig()方法帜慢,這個方法將把繪制結果儲存在項目目錄下,第一個參數(shù)指定了圖形文件名稱唯卖,第二個參數(shù)表示將圖表多余的空白區(qū)域裁掉。
運行結果當然是在項目目錄下生成了一個圖表躬柬,內容如下:
結語
這是這個系列的第一篇文章拜轨,算是簡單的起個頭,內容不復雜允青,注解也很詳細橄碾。之前說過這一系列的博客我會寫得頻繁些,所以每一篇文章的內容不會太多颠锉,但求理解細致法牲,希望在這個過程中自己的學習能夠更扎實些,讀者們也能學到些東西琼掠。最后作為讀書筆記拒垃,還是把書上這一節(jié)的小練習貼出來,大家可以試試自己敲敲:
1.數(shù)字的三次方被稱為其立方瓷蛙。請繪制一個圖形悼瓮,顯示前5 個整數(shù)的立方值,再繪制一個圖形艰猬,顯示前5000 個整數(shù)的立方值横堡。
2.給你前面繪制的立方圖指定顏色映射。