目錄
1、安裝 matplotlib
2、繪制折線圖
修改標簽文字和線條粗細
校正圖形
3、繪制散點圖
繪制單點
繪制一系列點
自動計算數據
刪除數據點的輪廓
自定義顏色
使用顏色映射
自動保存圖表
4、隨機漫步
創建 RandomWalk() 類
選擇方向
繪制隨機漫步圖
給點著色
增加點數
調整尺寸
1、安裝 matplotlib
在Windows系統中,首先需要安裝Visual Studio。為此,請訪問Windows Dev Center | Microsoft Developer,單擊Downloads,再查找Visual Studio Community——一組免費的Windows開發工具。請下載并運行該安裝序。
接下來,需要下載matplotlib安裝程序。為此,請訪問matplotlib · PyPI,并查找與你使用的Python版本匹配的wheel文件(擴展名為.whl的文件)。例如,如果你使用的是32位的Python3.5,則需要下載matplotlib-1.4.3-cp35-none-win32.whl。
將這個.whl文件復制到你的項目文件夾,打開一個命令窗口,并切換到該項目文件夾,再使用pip來安裝:
python -m pip install --user matplotlib-1.4.3-cp35-none-win32.whl
安裝必要的包后,對安裝進行測試。為此,首先使用命令python或python3啟動一個終端會話,再嘗試導入matplotlib:如果沒有出現任何錯誤消息,就說明你的系統安裝了matplotlib。
WARNING: The script f2py.exe is installed in 'C:\Users\hp\AppData\Roaming\Python\Python312\Scripts' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
$ python
>>> import matplotlib
matplotlib畫廊:要查看使用matplotlib可制作的各種圖表,請訪問Matplotlib — Visualization with Python的示例畫廊。單擊畫廊中的圖表,就可查看用于生成圖表的代碼。
2、繪制折線圖
下面來使用matplotlib繪制一個簡單的折線圖,再對其進行定制,以實現信息更豐富的數據可視化。我們將使用平方數序列1、4、9、16和25來繪制這個圖表。
只需向matplotlib提供如下數字,matplotlib就能完成其他的工作:
import matplotlib.pyplot as pltsquares = [1, 4, 9, 16, 25]
plt.plot(squares)
plt.show()
- 首先導入了模塊pyplot,并給它指定了別名plt,以免反復輸入pyplot。模塊pyplot包含很多用于生成圖表的函數。
- 我們創建了一個列表,在其中存儲了前述平方數,再將這個列表傳遞給函數plot(),這個函數嘗試根據這些數字繪制出有意義的圖形。plt.show() 打開matplotlib查看器,并顯示繪制的圖形,如圖所示。查看器讓你能夠縮放和導航圖形,另外,單擊磁盤圖標可將圖形保存起來。
修改標簽文字和線條粗細
如上圖所示的圖形表明數字是越來越大的,但標簽文字太小,線條太細。所幸matplotlib讓你能夠調整可視化的各個方面。下面通過一些定制來改善這個圖形的可讀性,如下所示:
import matplotlib.pyplot as pltsquares = [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=14)plt.show()
- 參數 linewidth 決定了 plot() 繪制的線條的粗細。函數 title() 給圖表指定標題。
- 函數xlabel()和ylabel()讓你能夠為每條軸設置標題,參數fontsize指定了圖表中文字的大小。
- 函數tick_params()設置刻度的樣式,其中指定的實參將影響x軸和y軸上的刻度(axis='both'),并將刻度標記的字號設置為14(labelsize=14)。
校正圖形
圖形容易閱讀后,我們發現沒有正確地繪制數據:折線圖的終點指出4.0的平方為25!下面來修復這個問題。
當你向plot()提供一系列數字時,它假設第一個數據點對應的 x坐標值為0,但我們的第一個點對應的 x值為1。為改變這種默認行為,我們可以給 plot() 同時提供輸入值和輸出值:
import matplotlib.pyplot as pltsquares = [1, 4, 9, 16, 25]
input_values = [1, 2, 3, 4, 5]
plt.plot(input_values, squares, linewidth=5)# 設置圖表標題,并給坐標軸加上標簽
--snip--
現在plot()將正確地繪制數據,因為我們同時提供了輸入值和輸出值,它無需對輸出值的生成方式作出假設。最終的圖形是正確的。
3、繪制散點圖
使用scatter() 繪制散點圖并設置其樣式
有時候,需要繪制散點圖并設置各個數據點的樣式。例如,你可能想以一種顏色顯示較小的值,而用另一種顏色顯示較大的值。繪制大型數據集時,你還可以對每個點都設置同樣的樣式,再使用不同的樣式選項重新繪制某些點,以突出它們。
繪制單點
要繪制單個點,可使用函數scatter(),并向它傳遞一對 x 和 y 坐標,它將在指定位置繪制一個點:
import matplotlib.pyplot as pltplt.scatter(2, 4)
plt.show()
下面來設置輸出的樣式,使其更有趣:添加標題,給軸加上標簽,并確保所有文本都大到能夠看清:
import matplotlib.pyplot as pltplt.scatter(2, 4, s=200)# 設置圖表標題并給坐標軸加上標簽
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)# 設置刻度標記的大小
plt.tick_params(axis='both', which='major', labelsize=14)plt.show()
繪制一系列點
要繪制一系列的點,可向 scatter() 傳遞兩個分別包含x值和y值的列表,如下所示:
import matplotlib.pyplot as pltx_values = [1, 2, 3, 4, 5]
y_values = [1, 4, 9, 16, 25]plt.scatter(x_values, y_values, s=200)# 設置圖表標題并給坐標軸加上標簽
--snip--
- 列表x_values包含要計算其平方值的數字,而列表y_values包含前述每個數字的平方值。
- 將這些列表傳遞給scatter()時,matplotlib依次從每個列表中讀取一個值來繪制一個點。
自動計算數據
手工計算列表要包含的值可能效率低下,需要繪制的點很多時尤其如此。可以不必手工計算包含點坐標的列表,而讓Python循環來替我們完成這種計算。下面是繪制1000個點的代碼:
import matplotlib.pyplot as pltx_values = list(range(1, 1001))
y_values = [x**2 for x in x_values]plt.scatter(x_values, y_values, s=40)# 設置圖表標題并給坐標軸加上標簽
--snip--# 設置每個坐標軸的取值范圍
plt.axis([0, 1100, 0, 1100000])plt.show()
- 我們首先創建了一個包含 x值的列表,其中包含數字1~1000。接下來是一個生成 y值的列表解析,它遍歷 x值(for x in x_values),計算其平方值(x**2),并將結果存儲到列表y_values中。然后,將輸入列表和輸出列表傳遞給scatter()。
- 由于這個數據集較大,我們將點設置得較小,并使用函數axis()指定了每個坐標軸的取值范圍。函數axis()要求提供四個值:x和 y坐標軸的最小值和最大值。在這里,我們將 x坐標軸的取值范圍設置為0~1100,并將 y坐標軸的取值范圍設置為0~1 100 000。
刪除數據點的輪廓
matplotlib 允許你給散點圖中的各個點指定顏色。默認為藍色點和黑色輪廓,在散點圖包含的數據點不多時效果很好。但繪制很多點時,黑色輪廓可能會粘連在一起。要刪除數據點的輪廓,可在調用scatter()時傳遞實參edgecolor='none':
plt.scatter(x_values, y_values, edgecolor='none', s=40)
自定義顏色
要修改數據點的顏色,可向scatter() 傳遞參數c,并將其設置為要使用的顏色的名稱,如下所示:
plt.scatter(x_values, y_values, c='red', edgecolor='none', s=40)
你還可以使用RGB顏色模式自定義顏色。要指定自定義顏色,可傳遞參數c,并將其設置為一個元組,其中包含三個0~1之間的小數值,它們分別表示紅色、綠色和藍色分量。例如,下面的代碼行創建一個由淡藍色點組成的散點圖:值越接近0,指定的顏色越深,值越接近1,指定的顏色越淺。
plt.scatter(x_values, y_values, c=(0, 0, 0.8), edgecolor='none', s=40)
使用顏色映射
顏色映射(colormap)是一系列顏色,它們從起始顏色漸變到結束顏色。在可視化中,顏色映射用于突出數據的規律,例如,你可能用較淺的顏色來顯示較小的值,并使用較深的顏色來顯示較大的值。
模塊pyplot內置了一組顏色映射。要使用這些顏色映射,你需要告訴pyplot該如何設置數據集中每個點的顏色。下面演示了如何根據每個點的 y值來設置其顏色:
plt.scatter(x_values, y_values, c=y_values , cmap=plt.cm.Blues, edgecolor='none', s=40)
- 我們將參數 c 設置成了一個 y 值列表,并使用參數cmap告訴pyplot使用哪個顏色映射。這些代碼將 y值較小的點顯示為淺藍色,并將 y 值較大的點顯示為深藍色。
自動保存圖表
要讓程序自動將圖表保存到文件中,可將對plt.show()的調用替換為對plt.savefig()的調用:
plt.savefig('squares_plot.png', bbox_inches='tight')
- 第一個實參指定要以什么樣的文件名保存圖表,這個文件將存儲到scatter_squares.py所在的目錄中;第二個實參指定將圖表多余的空白區域裁剪掉。如果要保留圖表周圍多余的空白區域,可省略這個實參。
4、隨機漫步
隨機漫步是這樣行走得到的路徑:每次行走都完全是隨機的,沒有明確的方向,結果是由一系列隨機決策決定的。你可以這樣認為,隨機漫步就是螞蟻在暈頭轉向的情況下,每次都沿隨機的方向前行所經過的路徑。
在自然界、物理學、生物學、化學和經濟領域,隨機漫步都有其實際用途。例如,漂浮在水滴上的花粉因不斷受到水分子的擠壓而在水面上移動。水滴中的分子運動是隨機的,因此花粉在水面上的運動路徑猶如隨機漫步。
創建 RandomWalk() 類
為模擬隨機漫步,我們將創建一個名為RandomWalk的類,它隨機地選擇前進方向。這個類需要三個屬性,其中一個是存儲隨機漫步次數的變量,其他兩個是列表,分別存儲隨機漫步經過的每個點的 x和 y坐標。
RandomWalk類只包含兩個方法:__init__()和fill_walk(),其中后者計算隨機漫步經過的所有點。
from random import choiceclass RandomWalk():"""一個生成隨機漫步數據的類"""def __init__(self, num_points=5000):"""初始化隨機漫步屬性"""self.num_points = num_points# 所有隨機漫步都始于(0,0)self.x_values = [0]self.y_values = [0]
為做出隨機決策,我們將所有可能的選擇都存儲在一個列表中,并在每次做決策時都使用choice()來決定使用哪種選擇。接下來,我們將隨機漫步包含的默認點數設置為5000,這大到足以生成有趣的模式,同時又足夠小,可確保能夠快速地模擬隨機漫步。然后,在處,我們創建了兩個用于存儲x和y值的列表,并讓每次漫步都從點(0, 0)出發。
選擇方向
我們將使用fill_walk()來生成漫步包含的點,并決定每次漫步的方向,如下所示。請將這個方法添加到random_walk.py中:
def fill_walk(self):"""計算隨機漫步包含的所有點"""# 不斷漫步,直到列表達到指定的長度while len(self.x_values) < self.num_points:# 決定前進方向以及沿這個方向前進的距離x_direction = choice([1, -1])x_distance = choice([0, 1, 2, 3, 4])x_step = x_direction * x_distancey_direction = choice([1, -1])y_distance = choice([0, 1, 2, 3, 4])y_step = y_direction * y_distance# 拒絕原地踏步if x_step == 0 and y_step == 0:continue# 計算下一個點的x和y值next_x = self.x_values[-1] + x_stepnext_y = self.y_values[-1] + y_stepself.x_values.append(next_x)self.y_values.append(next_y)
- 第5行,我們建立了一個循環,這個循環不斷運行,直到漫步包含所需數量的點。這個方法的主要部分告訴Python如何模擬四種漫步決定:向右走還是向左走?沿指定的方向走多遠?向上走還是向下走?沿選定的方向走多遠?
- 我們使用 choice([1, -1]) 給 x_direction 選擇一個值,結果要么是表示向右走的1,要么是表示向左走的-1。接下來,choice([0, 1, 2, 3, 4]) 隨機地選擇一個 0~4 之間的整數,告訴Python 沿指定的方向走多遠(x_distance)。(通過包含0,我們不僅能夠沿兩個軸移動,還能夠沿y軸移動。)
- 第9和13行,我們將移動方向乘以移動距離,以確定沿 x 和 y 軸移動的距離。如果x_step為正,將向右移動,為負將向左移動,而為零將垂直移動;如果y_step為正,就意味著向上移動,為負意味著向下移動,而為零意味著水平移動。
- 如果 x_step 和 y_step 都為零,則意味著原地踏步,我們拒絕這樣的情況,接著執行下一次循環。為獲取漫步中下一個點的 x值,我們將 x_step 與 x_values 中的最后一個值相加,對于 y 值也做相同的處理。獲得下一個點的 x 值和 y 值后,我們將它們分別附加到列表 x_values 和 y_values 的末尾。
繪制隨機漫步圖
下面的代碼將隨機漫步的所有點都繪制出來:rw_visual.py
import matplotlib.pyplot as plt
from random_walk import RandomWalk# 創建一個RandomWalk實例,并將其包含的點都繪制出來
rw = RandomWalk()
rw.fill_walk()
plt.scatter(rw.x_values, rw.y_values, s=15)plt.show()
- 首先導入了模塊pyplot和RandomWalk類,然后創建了一個RandomWalk實例,并將其存儲到rw中,再調用fill_walk()。我們將隨機漫步包含的 x 和 y 值傳遞給scatter(),并選擇了合適的點尺寸。下圖顯示了包含5000個點的隨機漫步圖。
模擬多次隨機漫步
每次隨機漫步都不同,因此探索可能生成的各種模式很有趣。要在不多次運行程序的情況下使用前面的代碼模擬多次隨機漫步,一種辦法是將這些代碼放在一個while循環中,如下所示:rw_visual.py
import matplotlib.pyplot as plt
from random_walk import RandomWalk# 只要程序處于活動狀態,就不斷地模擬隨機漫步
while True:# 創建一個RandomWalk實例,并將其包含的點都繪制出來rw = RandomWalk()rw.fill_walk()plt.scatter(rw.x_values, rw.y_values, s=15)plt.show()keep_running = input("Make another walk?(y/n): ")if keep_running == 'n':break
給點著色
我們將使用顏色映射來指出漫步中各點的先后順序,并刪除每個點的黑色輪廓,讓它們的顏色更明顯。為根據漫步中各點的先后順序進行著色,我們傳遞參數c,并將其設置為一個列表,其中包含各點的先后順序。由于這些點是按順序繪制的,因此給參數c指定的列表只需包含數字1~5000,如下所示:rw_visual.py
--snip--
# 只要程序處于活動狀態,就不斷地模擬隨機漫步
while True:# 創建一個RandomWalk實例,并將其包含的點都繪制出來--snip--point_numbers = list(range(rw.num_points))plt.scatter(rw.x_values, rw.y_values, c=point_numbers,cmap=plt.cm.Blues, edgecolor='none', s=15)plt.show()--snip--
- 我們使用了range()生成了一個數字列表,其中包含的數字個數與漫步包含的點數相同。接下來,我們將這個列表存儲在point_numbers中,以便后面使用它來設置每個漫步點的顏色。我們將參數c設置為point_numbers,指定使用顏色映射Blues,并傳遞實參edgecolor=none 以刪除每個點周圍的輪廓。最終的隨機漫步圖從淺藍色漸變為深藍色。
除了給隨機漫步的各個點著色,以指出它們的先后順序外,如果還能呈現隨機漫步的起點和終點就更好了。為此,可在繪制隨機漫步圖后重新繪制起點和終點。我們讓起點和終點變得更大,并顯示為不同的顏色,以突出它們,如下所示:rw_visual.py
--snip--
# 只要程序處于活動狀態,就不斷地模擬隨機漫步
while True:# 創建一個RandomWalk實例,并將其包含的點都繪制出來--snip--point_numbers = list(range(rw.num_points))plt.scatter(rw.x_values, rw.y_values, c=point_numbers,cmap=plt.cm.Blues, edgecolor='none', s=15)# 突出起點和終點plt.scatter(0, 0, c='green', edgecolors='none', s=100)plt.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none', s=100)plt.show()--snip--
增加點數
下面來增加點數,以提供更多的數據。為此,我們在創建RandomWalk實例時增大 num_points 的值,并在繪圖時調整每個點的大小,如下所示:rw_visual.py
--snip--# 只要程序處于活動狀態,就不斷地模擬隨機漫步
while True:# 創建一個RandomWalk實例,并將其包含的點都繪制出來rw = RandomWalk(50000)rw.fill_walk()point_numbers = list(range(rw.num_points))plt.scatter(rw.x_values, rw.y_values, c=point_numbers,cmap=plt.cm.Blues, edgecolor='none', s=1)--snip--
- 這個示例模擬了一次包含50 000個點的隨機漫步(以模擬現實情況),并將每個點的大小都設置為1。
- 最終的隨機漫步圖更纖細,猶如云朵,如圖所示,我們使用簡單的散點圖制作出了一件藝術品!
調整尺寸
圖表適合屏幕大小時,更能有效地將數據中的規律呈現出來。為讓繪圖窗口更適合屏幕大小,可像下面這樣調整matplotlib輸出的尺寸:rw_visual.py
--snip--
# 只要程序處于活動狀態,就不斷地模擬隨機漫步
while True:# 創建一個RandomWalk實例,并將其包含的點都繪制出來rw = RandomWalk(50000)rw.fill_walk()point_numbers = list(range(rw.num_points))# 設置繪圖窗口的尺寸plt.figure(figsize=(10,6))--snip--
- 函數figure()用于指定圖表的寬度、高度、分辨率和背景色。你需要給形參figsize指定一個元組,向matplotlib指出繪圖窗口的尺寸,單位為英寸。
- Python假定屏幕分辨率為80像素/英寸,如果上述代碼指定的圖表尺寸不合適,可根據需要調整其中的數字。如果你知道自己的系統的分辨率,可使用形參dpi向figure()傳遞該分辨率,以有效地利用可用的屏幕空間,如下所示:
plt.figure(dpi=128, figsize=(10, 6))