藍色字體爲單詞,一些我本身認識的單詞就再也不羅列,好比font編程
灰色字體爲函數的形參,形參在羅列的時候會省略部分默認值,閱讀時可跳過灰色部分字體app
棕色部分字體爲我本身的疑惑,有待解答,若是你看到以爲easy,歡迎留言教教我dom
本章內容基於《Python編程 從入門到實踐》,做者Eric Mattheside
【數據可視化】函數
matplotlib是Python的一種繪圖庫,內含許多製做圖表的工具工具
【15.2繪製簡單的折線圖】測試
plot /plɑ:t/ v.以圖表畫出、繪圖字體
figure /ˈfigjər/ n.圖形、圖表,人物,數字spa
args→argumentsn.參數(與parameter相比,特指實參)scala
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太小,會出現圖表顯示太小的狀況:
【我怎麼以爲它更細緻了??】
'''''''