數據可視化(Matplotlib)

藍色字體爲單詞,一些我本身認識的單詞就再也不羅列,好比font編程

灰色字體爲函數的形參,形參在羅列的時候會省略部分默認值,閱讀時可跳過灰色部分字體app

棕色部分字體爲我本身的疑惑,有待解答,若是你看到以爲easy,歡迎留言教教我dom

本章內容基於《Python編程 從入門到實踐》,做者Eric Mattheside

【數據可視化】函數

matplotlibPython的一種繪圖庫,內含許多製做圖表的工具工具

15.2繪製簡單的折線圖】測試

plot  /plɑ:t/  v.以圖表畫出、繪圖字體

figure  /ˈfigjər/  n.圖形、圖表,人物,數字spa

argsargumentsn.參數(parameter相比,特指實參)scala

kwargsKeyWordArguments n.關鍵字參數

pyplot模塊包含許多生成圖表的函數,咱們繪製一個簡單的折線圖:

 

1 import matplotlib.pyplot as plt
2 squares = [1, 4, 9, 16, 25]
3 plt.plot(squares)
4 plt.show()

 

先從繪圖庫matplotlib中導入pyplot模塊並命名爲plt,定義一個數列squares

plt.plot([x] , y , [fmt] , **kwargs)

plt.plot([x] , y , [fmt] , [x2] , y2 , [fmt2] , ... , **kwargs)

#fmtformat的簡寫,傳入該參數可設置表現數據的形式,如'r+'(紅十字點)'bo'(藍色圓點)

plt.plot( )函數會嘗試將接收到的數據繪製成有意義的圖形,而plt.show( )打開matplotlib查看器並顯示繪製的圖形

觀察得知,plt.plot( )將接收到的數據從04一一映射,並連線繪製成折線統計圖

15.2.1修改標籤文字和線條粗細】

axis  /ˈæksis /  n.軸,軸心國(其複數形式爲axes)

tick  /tik/  v.打鉤

param  /.../  n.參數(argument相比,特指形參)

matplotlib容許調整可視化的各個方面,咱們對上圖進行改善:

 1 import matplotlib.pyplot as plt
 2 
 3 squares = [1, 4, 9, 16, 25]
 4 plt.plot(squares, linewidth = 5)
 5 
 6 plt.title('Square Numbers', fontsize = 24)
 7 plt.xlabel('Value', fontsize = 14)
 8 plt.ylabel('Square of Value', fontsize)
 9 
10 plt.tick_params(axis = 'both', labelsize = 14)
11 
12 plt.show()

咱們在plt.show( )以前添加一些代碼

①在plt.plot( )中添加參數linewidth,修改線條的粗細

plt.title( )能夠設置圖表標題,經過fontsize參數調整字體大小

plt.title(label , **kwargs)

plt.xlabel( )plt.ylabel( )分別可設置x軸和y軸的標題,及大小

plt.xlabel(xlabel , **kwargs)plt.ylabel(ylabel , **kwargs)

④圖表中xy軸的分度值被稱爲標籤plt.tick_params( )首先要求參數axisaxis的選項有3個:'x''y''both',默認爲'both';經過肯定參數axis指定對x軸或y軸作出修改;而修改則是經過指定參數labelsize的值

plt.tick_params(axis = 'both' , **kwargs)

15.2.2校訂圖形】

對於plt.plot( ),正如你所見到的形參有([x] , y , [fmt] , **kwargs),上面只傳入了squares一個參數,Python默認賦值給形參中的y

咱們看的圖形中的數據並無被正確繪製,緣由在於x軸從0開始;爲改變這種默認行爲,咱們需同時提供x值和y值:

1 input_values = [1, 2, 3, 4, 5]
2 squares = [1, 4, 9, 16, 25]
3 plt.plot(input_values, squares, linewidth = 5)

15.2.3繪製散點圖】

scatter  /ˈskætɚ/  v.散開、分散

有時候,咱們須要繪製散點圖,這時須要使用函數scatter( )    plot( )傳入fmt參數何異?

plt.scatter(x , y , ... , **kwargs)

1 import matplotlib.pyplot as plt
2 plt.scatter(2, 4)
3 plt.show()

在打開的圖形中你會發現點(2 , 4)位於表格的正中央,並被顯示以一個藍色的圓點

咱們還能夠經過修改scatter( )的參數來設置輸出圖形的樣式

1 plt.scatter(2, 4, s = 200)

plt.scatter(x , y , s = None , ... , **kwargs)

ssize

scalar  /ˈskeilɚ/  n.數量、標量  adj.梯狀的,分等級的

實參s設置了繪製圖形時使用的點的尺寸,你會看到一個更大的藍點在圖表中

1 plt.title('Squares Numbers', fontsize = 24)
2 plt.xlabel('Value', fontsize = 14)
3 plt.ylabel('Square of Value', fontsize = 14)
4 
5 plt.tick_params(axis = 'both', which = 'major', labelsize = 14)

以上是對圖表的完善,其中的which參數有{'major' , 'minor' , 'both'}選項,分別設置主刻度線、次刻度線以及同時設置

plt.tick_params(axis = 'both' , which = 'major' , ... , **kwargs)

15.2.4使用scatter( )繪製一系列點】    仍是搞不懂與plot( )傳入fmt參數的不一樣?

較爲簡單,直接將上述的xy值的類型從int(str)更改成list便可:

1 x_values = [1, 2, 3, 4, 5]
2 y_values = [1, 4, 9, 16, 25]
3 plt.scatter(x_values, y_values, s = 200)

15.2.5自動計算數據】

當要繪製的點不少的時候,手動輸入點的數據的效率十分低下,由於可讓Python循環來代替:

1 x_values = list(range(1, 1001))
2 y_values = [x*x for x in x_values]
3 plt.scatter(x_values, y_values, s = 40)
4 
5 plt.axis([0, 2000, 0, 4000000])

Python自動生成數列,再將數列繪製到圖表上

plt.axis(*v, **kwargs)

函數axis( )接收一個可變參數(*v),因爲後面的**kwargs存在,因此可變參數的傳入需以listtuple的形式。axis( )接收的*v中包含4個參數,分別是用於設置繪製的圖表x軸、y軸的顯示範圍,即分別爲x軸和y軸的最小值和最大值

15.2.6 - 15.2.8函數scatter( )參數】

【數據點的輪廓】

plt.scatter(x , y , edgecolors = None , ... , **kwargs)

書上設置參數爲edgecolor,且寫明「默認爲藍色點和黑色輪廓」

但在matplotlib官方文檔中,參數名爲edgecolors;且在篇頭指明edgecolors = None,但在篇末又指明edgecolors = 'face'(輪廓與圖形顏色一致)

經測試,參數名爲edgecoloredgecolors等效;默認不爲黑色輪廓,應該爲'face'

【自定義顏色】

plt.scatter(x , y , c = None , ... , **kwargs)

ccolor

經過scatter( )繪製的點默認爲藍色,可傳遞參數c來更改

參數c可爲表示特定顏色的字符串,如'red',也可經過RGB來設置

注意,與普通的255*255*255RGB不一樣,參數c應設置爲30-1的小數值,分別表示紅、綠和藍的份量

1 plt.scatter(x_values, y_values, c = (0.9, 0.9, 0), s = 40)

經檢驗,值越接近1,顏色越深

【顏色映射】

map  /mæp/  n.地圖  v.繪製地圖、勘查

顏色映射(colormap)是一系列顏色,從起始顏色漸變到結束顏色

顏色映射用於突出數據的規律,可使用較淺的顏色來顯示較小的值,用較深的顏色顯示較大的值

plt.scatter(x , y , cmp = None , ... , **kwargs)

1 plt.scatter(x_values, y_values, s = 40, c = y_values, cmap = plt.cm.Blues)

咱們將參數c設置爲一個y值列表,即顏色映射的值取自列表y_values;隨後傳遞cmap參數,其告訴pyplot使用哪一個顏色進行映射

注意:映射時的參數c所含元素的數目必須與繪製的點的數目相同

傳遞cmap參數爲plt.cm.Blues後,值較小的點將顯示爲淺藍色,值較大的點將顯示爲深藍色

'Blues'只是一種顏色映射,若是想了解全部的顏色映射,路徑爲:

訪問http://matplotlib.org/ → 單擊Example → 找到Color選項 → 'Colormap Reference'

15.2.9自動保存圖表】

咱們經過plt.show( )來展現圖表,而若是要讓程序自動將圖表保存到文件中,可替換爲:

1 plt.savefig('scatter_squares.png', bbox_inches = 'tight')

plt.savefig(fname , bbox_inches = None)

figfigure

fnamefile name

bboxbounding box(邊界框)

經過savefig( ),第一個實參指定要保存圖表的文件名;而關鍵字參數bbox_inches{'None' , 'tight'}選項,若是指定'tight',會將圖表多餘的空白區域裁剪掉,這樣能夠生成一個適中的圖表

文件將儲存到代碼文件所在的目錄中

15.3隨機漫步圖】

從點(0 , 0)開始,隨機地移動某個方向若干距離,記錄移動後的點;再在該點上繼續隨機移動。將全部的點繪製到圖表上,得到隨機漫步圖

15.3.1建立RandomWalk類】

 1 from random import choice
 2 class RandomWalk(object):
 3     def __init__(self , num_points = 5000):
 4         self.num_points = num_points
 5         self.x_values = [0]
 6         self.y_values = [0]
 7 
 8     def fill_walk(self):
 9         while len(self.x_values) < self.num_points:
10             x_direction = choice([1 , -1])
11             x_distance = choice([0 , 1 , 2 , 3 , 4])
12             x_step = x_direction * x_distance
13 
14             y_direction = choice([1 , -1])
15             y_distance = choice([0 , 1 , 2 , 3 , 4])
16             y_step = y_direction * y_distance
17 
18             if x_step == 0 and y_step == 0:
19                 continue
20 
21             self.x_values.append(self.x_values[-1] + x_step)
22             self.y_values.append(self.y_values[-1] + y_step)

建立RandomWalk類要確立3個屬性:漫步次數(num_points)、橫座標、縱座標

咱們使用x_valuesy_values分別存儲點的橫座標和縱座標的值,並規定一開始從(0 , 0)點開始。經過choice( )分別爲xy選擇方向(direction)、距離(distance),明確下一個點要作出的漫步

if x_step == 0 and y_step == 0: continue代碼行代表咱們不接受原地漫步

最後經過x_stepy_step分別與上一個點相加,得出漫步後的點的座標,並存儲

至此,當建立實例rw並調用rw.fill_walk( ),實例rw就擁有了2個長度爲5000的列表,列表中的值除(0 , 0)外徹底隨機

15.3.2繪製隨機漫步圖】

既然rw能夠擁有2個長度爲5000的列表,那麼繪製圖表就十分簡單了

1 from random_walk import RandomWalk
2 import matplotlib.pyplot as plt
3 
4 rw = RandomWalk()
5 rw.fill_walk()
6 plt.scatter(rw.x_values, rw.y_values, s = 5)
7 plt.show()

運行代碼,你將看到一副隨機漫步圖

 

15.3.5設置樣式】

15.3.6點着色】

爲了體現「漫步」這一動做,咱們經過顏色映射來看看漫步的過程

1 point_numbers = list(range(rw.num_points))
2 plt.scatter(rw.x_values, rw.y_values, s = 10, c = point_numbers, cmp = plt.cm.Blues)

point_numbers爲一個包含04999的列表,其做用在參數c上,輔助cmp:首次繪製的點c值爲1,最後一個繪製的點c值爲4999。這樣,首次繪製的點的顏色最淺,隨着繪製點的增多,顏色越深,即可以大體觀測「漫步」過程

 

15.3.7起點和終點】

經過顏色映射呈現了各個點的前後順序,咱們還能夠重點突出繪製的起點和終點

1 plt.scatter(rw.x_values, rw.y_values, s = 2, c = point_numbers, cmp = plt.cm.Blues)
2 plt.scatter(0, 0, s = 50, c = 'green')
3 plt.scatter(rw.x_values[-1], rw.y_values[-1], s = 50, c = 'red')

15.3.8增長點數】

經過增長繪製的點數,構造一副漂亮的畫

 

15.3.9隱藏座標軸】

1 plt.axes().get_xaxis().set_visible(False)
2 plt.axes().get_yaxis().set_visible(False)

plt.axes(arg = None , **kwargs)

使用函數plt.axes( )來將每條座標軸的可見性都設置爲False

△嘗試對比plt.axis( )函數,你會發現plt.axis( )也有相似操做:plt.axis('off'),不一樣的是,使用plt.axes( )會保留邊框線,而plt.axis( )僅呈現繪製的點

詳情自行查閱Matplotlib官網

【使用plt.axes( )爲何會有警告:warnings.warn(message , mplDeprecation , stacklevel = 1??】

15.3.10調整窗口尺寸】

你會發現,繪製出來的圖表始終是一樣大小,不管裏面的點數量多或少;當點多時,會顯示密集,當點少時,會顯示稀疏

當你拉動顯示圖表的窗口放大或縮小時,裏面的圖表也會相應做出改變

「圖表適合窗口的大學時,更能有效地將數據中的規律呈現出來」,因而咱們添加代碼:

1 plt.figure(figsize = (10, 6))

plt.figure(figure = None , ... , **kwargs)

書籍中,僅僅是指出,給figure( )函數的參數figsize傳遞一個元組,用以指定繪圖窗口的尺寸,單位爲英寸

可是它沒有強調位置!

經反覆試驗,有如下狀況:

plt.figure( )放在plt.scatter( )以前,成功指定繪圖的窗口大小

plt.figure( )放在plt.scatter( )以後,但在plt.show( )以前,居然建立了兩個窗口,一個是plt.figure( )建立的指定大小的窗口,但它是空白的;另外一個是默認窗口,scatter( )繪製的圖表在其中,至關於沒有使用plt.figure( )指定窗口大小,還無故多了個無用的空白窗口

個人理解是,scatter( )執行過程當中便已經在默認的窗口中完成了繪圖,只需show( )便可;假若以後再經過figure( )指定窗口大小,這時只會額外建立一個符號指定的窗口

plt.figure( )放在plt.show( )以後,根本沒用調用plt.figure( )代碼行

△綜上,建議在早期未調用相關函數以前就調用plt.figure( )

15.3.11調整分辨率】

DPI(Dots Per Inch)每英寸點數,分辨率的度量單位

DPI專業人士眼中通常只針對輸出設備(如打印機)而言,而針對顯示器的圖像分辨率則用PPI(Pixels Per Inch)表示。但一般DPI便是指分辨率

pixel  /pɪksəl/  n.顯示器的像素

Python假定屏幕分辨率爲80像素/英寸,所以若指定大小的圖表尺寸不合適,可以使用形參dpifigure( )傳遞本身系統的分辨率:

plt.figure(dpi = 96 , figsize = (10 , 6))

DPI的含義爲每英寸像素點,當傳遞的形參dpi太小,會出現圖表顯示太小的狀況:

 

【我怎麼以爲它更細緻了??】

'''''''

相關文章
相關標籤/搜索