藍色字體為單詞,一些我自己認識的單詞就不再羅列,比如font
灰色字體為函數的形參,形參在羅列的時候會省略部分默認值,閱讀時可跳過灰色部分字體
棕色部分字體為我自己的疑惑,有待解答,如果你看到覺得easy,歡迎留言教教我
本章內容基於《Python編程 從入門到實踐》,作者Eric Matthes
【數據可視化】
matplotlib是Python的一種繪圖庫,內含許多制作圖表的工具
【15.2繪制簡單的折線圖】
plot /plɑ:t/ v.以圖表畫出、繪圖
figure /ˈfigjər/ n.圖形、圖表,人物,數字
args→argumentsn.參數(與parameter相比,特指實參)
kwargs→KeyWordArguments 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)
#fmt為format的簡寫,傳入該參數可設置表現數據的形式,如'r+'(紅十字點)、'bo'(藍色圓點)
plt.plot( )函數會嘗試將接收到的數據繪制成有意義的圖形,而plt.show( )打開matplotlib查看器並顯示繪制的圖形
觀察得知,plt.plot( )將接收到的數據從0到4一一映射,並連線繪制成折線統計圖
【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)
④圖表中x軸y軸的分度值被稱為標簽,plt.tick_params( )首先要求參數axis,axis的選項有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)
s→size
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參數的不同?
較為簡單,直接將上述的x、y值的類型從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存在,所以可變參數的傳入需以list或tuple的形式。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'(輪廓與圖形顏色一致)
經測試,參數名為edgecolor與edgecolors等效;默認不為黑色輪廓,應該為'face'
【自定義顏色】
plt.scatter(x , y , c = None , ... , **kwargs)
c→color
通過scatter( )繪制的點默認為藍色,可傳遞參數c來更改
參數c可為表示特定顏色的字符串,如'red',也可通過RGB來設置
注意,與普通的255*255*255位RGB不同,參數c應設置為3個0-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)
fig→figure
fname→file name
bbox→bounding 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_values和y_values分別存儲點的橫坐標和縱坐標的值,並規定一開始從(0 , 0)點開始。通過choice( )分別為x和y選擇方向(direction)、距離(distance),明確下一個點要做出的漫步
if x_step == 0 and y_step == 0: continue代碼行表明我們不接受原地漫步
最后通過x_step和y_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為一個包含0到4999的列表,其作用在參數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像素/英寸,因此若指定大小的圖表尺寸不合適,可使用形參dpi向figure( )傳遞自己系統的分辨率:
plt.figure(dpi = 96 , figsize = (10 , 6))
DPI的含義為每英寸像素點,當傳遞的形參dpi過小,會出現圖表顯示過小的情況:
【我怎么覺得它更細致了??】
'''''''