數據可視化(Matplotlib)


藍色字體為單詞,一些我自己認識的單詞就不再羅列,比如font

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

棕色部分字體為我自己的疑惑,有待解答,如果你看到覺得easy,歡迎留言教教我

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

【數據可視化】

matplotlibPython的一種繪圖庫,內含許多制作圖表的工具

15.2繪制簡單的折線圖】

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

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

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

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過小,會出現圖表顯示過小的情況:

 

【我怎么覺得它更細致了??】

'''''''

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM