《Python編程:從入門到實踐》筆記。
從本篇起將用三篇的篇幅介紹如何用Python進行數據可視化。
從本篇開始,咱們將用三篇的篇幅來初步介紹如何使用Python來進行數據可視化操做。本篇的內容包括:python
Pygal
模擬擲骰子。在正式開始以前,須要安裝兩個擴展包:matplotlib
和pygal
。Python中安裝第三方庫的方式已在上一個項目中介紹過了,這裏再也不贅述。編程
首先咱們繪製一個簡單的折線圖,代碼保存到mpl_squares.py
文件中:瀏覽器
import matplotlib.pyplot as plt # 輸入數據, x軸 input_values = [1, 2, 3, 4, 5] # 輸出數據, y軸 squares = [1, 4, 9, 16, 25] # linewidth表示線條的粗細 plt.plot(input_values, 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()
matplotlib.pyplot.plot()
函數能夠只傳入一個squares
參數,表示y
軸的值,此時將從x
軸0點處開始一一對應。有時這樣很簡便,但在此例中圖標將不正確,因此咱們傳入了input_values
列表,將其與squares
列表一一對應。微信
代碼從第10行到15行均可以省了,這些代碼只是讓圖表的信息更全。最終的結果以下:app
咱們使用matplotlib.pyplot
中的scatter()
函數來生成散點圖,將代碼保存到scatter_squares.py
文件中:dom
import matplotlib.pyplot as plt x_values = list(range(1, 1001)) y_values = [x ** 2 for x in x_values] # s表示點的大小,edgecolor表示點的輪廓的顏色,c表示數據點的顏色(可使用RGB顏色) # plt.scatter(x_values, y_values, s=4, edgecolor="none", c="red") # 使用漸變色, 給c賦值了一個y值列表,並使用參數cmap告訴pylot使用哪一個顏色來映射 plt.scatter(x_values, y_values, s=40, edgecolor="none", c=y_values, cmap=plt.cm.Blues) # 設置圖表標題並給座標軸加上標籤 plt.title("Square Number", fontsize=24) plt.xlabel("Value", fontsize=14) plt.ylabel("Square of Value", fontsize=14) # 設置刻度的大小 plt.tick_params(axis="both", which="major", labelsize=14) # 每一個座標軸的取值範圍 plt.axis([0, 1100, 0, 1100000]) # 第一個參數是路徑名,第二個參數指定將圖表多餘的空白區域裁減掉。 plt.savefig("squares.png", bbox_inches="tight") plt.show()
咱們使用了列表生成式來生成y軸的數據,並使用漸變色來繪製圖像,matplotlib.pyplot.cm.Blues
是matplotlib
自帶的漸變色,它和c
的每個值對應。經過pyplot
的axis()
函數來設置每一個軸的取值範圍。最後將圖像保存到本地。生成的圖像以下:ide
隨機漫步指的是:每次行走都徹底隨機,沒有明確的方向,結果是由一系列隨機決策決定的。在天然界、物理學、生物學、化學和經濟領域,隨機漫步都有其實際用途。svg
使用Python生成隨機漫步數據,再使用matplotlib
將這些數據繪製出來。首先建立RandomWalk
類,代碼保存到random_walk.py
文件中:函數
from random import choice class RandomWalk: """一個生成隨機漫步數據的類""" def __init__(self, num_points=5000): """初始化隨機漫步的屬性""" self.num_points = num_points # 全部隨機漫步都始於(0, 0),這兩個列表用於存儲隨機漫步數據 self.x_values = [0] self.y_values = [0] def fill_walk(self): """計算隨機漫步包含的全部點""" # 不斷漫步,直到列表到達指定的長度 while len(self.x_values) < self.num_points: # 決定前進方向以及沿這個方向前進的距離 # 經過choice從給定值中隨機選取 x_direction = choice([1, -1]) # 正向仍是負向 x_distance = choice([0, 1, 2, 3, 4]) # 移動的距離 x_step = x_direction * x_distance y_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 # 計算下一個點的座標 next_x = self.x_values[-1] + x_step next_y = self.y_values[-1] + y_step self.x_values.append(next_x) self.y_values.append(next_y)
下面的代碼用於生成隨機漫步圖像,代碼保存到rw_visual.py
文件中:網站
import matplotlib.pyplot as plt from random_walk import RandomWalk while True: rw = RandomWalk(50000) rw.fill_walk() # 設置繪圖窗口的尺寸 plt.figure(figsize=(10, 6)) # 繪製隨機漫步的圖像 point_number = list(range(rw.num_points)) plt.scatter(rw.x_values, rw.y_values, s=1, c=point_number, edgecolors="none", cmap=plt.cm.Blues) # 突出起點和終點 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.axes().get_xaxis().set_visible(False) plt.axes().get_yaxis().set_visible(False) plt.show() if input("Make another walk?(y/n)") == "n": break
程序經過一個循環類屢次繪製隨機漫步圖;經過pyplot
的figure()
函數來設置圖像的尺寸,figsize
的單位是英寸;經過漸變色來繪製圖像的路徑,顏色由淺到深,而且咱們將起點(綠色)和終點(紅色)顯著標出;最後隱藏座標軸。最終的圖像以下(每次運行的效果都不一樣):
首先咱們須要建立一個骰子類Dice
,將其保存到dice.py
中:
from random import randint class Dice: """表示一個骰子類""" def __init__(self, num_sides=6): """骰子默認爲6面""" self.num_sides = num_sides def roll(self): """返回一個位於1和骰子面數之間的隨機值""" return randint(1, self.num_sides)
能夠自行設定骰子的面數。下面是擲兩個骰子50000次,統計倆骰子點數之和的分佈的模擬,最後生成了一個矢量文件.svg
文件,它能在瀏覽器中打開,代碼以下:
import pygal from dice import Dice dice_1 = Dice() dice_2 = Dice(10) # 擲骰子屢次,並將結果存儲在一個列表中 results = [] for roll_num in range(50000): results.append(dice_1.roll() + dice_2.roll()) # 分析結果 frequences = [] # 可以模擬擲任何雙骰子的狀況,無論這些骰子有多少面 max_result = dice_1.num_sides + dice_2.num_sides for value in range(2, max_result + 1): # 統計每一個結果的頻數 frequences.append(results.count(value)) # 對結果進行可視化 # 建立條形圖 hist = pygal.Bar() hist.title = "Result of rolling a D6 and a D10 50000 times." # 建立x軸上的刻度 hist.x_labels = [str(value) for value in range(2, max_result + 1)] hist.x_title = "Result" hist.y_title = "Frequency of Result" # 給這組數據起個名字,並加到圖表中 hist.add("D6 + D10", frequences) # 將圖像渲染爲svg文件,矢量圖 hist.render_to_file("dice_visual.svg")
注意,frequences
中的數據依次與hist.x_labels
對應。下面是最終結果:
Pygal
讓這個圖表具備交互性:若是你將鼠標指向該圖中的任何數據條,將看到它的具體數據。
本篇主要講述了:
matplotlib
建立簡單的圖表;Pygal
建立直方圖,以及如何使用直方圖來探索同時擲兩個面數不一樣的骰子的結果。迎你們關注個人微信公衆號"代碼港" & 我的網站 www.vpointer.net ~