摘要:小結本篇主要講述了如何生成數據集以及如何對其進行可視化如何使用創建簡單的圖表如果使用散點圖來探索隨機漫步過程如何使用創建直方圖,以及如何使用直方圖來探索同時擲兩個面數不同的骰子的結果。
《Python編程:從入門到實踐》筆記。1. 前言
從本篇起將用三篇的篇幅介紹如何用Python進行數據可視化。
從本篇開始,我們將用三篇的篇幅來初步介紹如何使用Python來進行數據可視化操作。本篇的內容包括:
繪制簡單的折線圖;
隨機漫步;
使用Pygal模擬擲骰子。
在正式開始之前,需要安裝兩個擴展包:matplotlib和pygal。Python中安裝第三方庫的方式已在上一個項目中介紹過了,這里不再贅述。
2. 繪制簡單的折線圖 2.1 簡單的折線圖首先我們繪制一個簡單的折線圖,代碼保存到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行都可以省了,這些代碼只是讓圖表的信息更全。最終的結果如下:
2.2 生成散點圖我們使用matplotlib.pyplot中的scatter()函數來生成散點圖,將代碼保存到scatter_squares.py文件中:
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()函數來設置每個軸的取值范圍。最后將圖像保存到本地。生成的圖像如下:
3. 隨機漫步隨機漫步指的是:每次行走都完全隨機,沒有明確的方向,結果是由一系列隨機決策決定的。在自然界、物理學、生物學、化學和經濟領域,隨機漫步都有其實際用途。
使用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的單位是英寸;通過漸變色來繪制圖像的路徑,顏色由淺到深,并且我們將起點(綠色)和終點(紅色)顯著標出;最后隱藏坐標軸。最終的圖像如下(每次運行的效果都不同):
4. 使用Pygal模擬擲骰子首先我們需要創建一個骰子類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讓這個圖表具有交互性:如果你將鼠標指向該圖中的任何數據條,將看到它的具體數據。
5. 小結本篇主要講述了:
如何生成數據集以及如何對其進行可視化;
如何使用matplotlib創建簡單的圖表;
如果使用散點圖來探索隨機漫步過程;
如何使用Pygal創建直方圖,以及如何使用直方圖來探索同時擲兩個面數不同的骰子的結果。
迎大家關注我的微信公眾號"代碼港" & 個人網站 www.vpointer.net ~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44725.html
摘要:第行把具名元組以的形式返回。對序列使用和通常號兩側的序列由相同類型的數據所構成當然不同類型的也可以相加,返回一個新序列。從上面的結果可以看出,它雖拋出了異常,但仍完成了操作查看字節碼并不難,而且它對我們了解代碼背后的運行機制很有幫助。 《流暢的Python》筆記。接下來的三篇都是關于Python的數據結構,本篇主要是Python中的各序列類型 1. 內置序列類型概覽 Python標準庫...
摘要:本篇繼續學習之路,實現更多的特殊方法以讓自定義類的行為跟真正的對象一樣。之所以要讓向量不可變,是因為我們在計算向量的哈希值時需要用到和的哈希值,如果這兩個值可變,那向量的哈希值就能隨時變化,這將不是一個可散列的對象。 《流暢的Python》筆記。本篇是面向對象慣用方法的第二篇。前一篇講的是內置對象的結構和行為,本篇則是自定義對象。本篇繼續Python學習之路20,實現更多的特殊方法以讓...
摘要:將每一行作為返回,其中是每行中的列名。對于每一行,都會生成一個對象,其中包含和列中的值。它返回一個迭代器,是迭代結果都為的情況。深度解析至此全劇終。 簡單實戰 大家好,我又來了,在經過之前兩篇文章的介紹后相信大家對itertools的一些常見的好用的方法有了一個大致的了解,我自己在學完之后仿照別人的例子進行了真實場景下的模擬練習,今天和大家一起分享,有很多部分還可以優化,希望有更好主意...
摘要:本篇是數據處理的第三篇,本篇將使用應用程序接口自動請求網站的特定信息并可視化。前言本將需要用到模塊來請求網站數據。使用可視化倉庫使用一個參數配置類來定義圖表的參數,并自定義圖表中每個條形的描述信息,并給這些條形添加網址鏈接。 《Python編程:從入門到實踐》筆記。本篇是Python數據處理的第三篇,本篇將使用Web應用程序接口自動請求網站的特定信息并可視化。 1. 前言 本將需要用到...
閱讀 1207·2021-11-10 11:35
閱讀 2948·2021-09-24 10:35
閱讀 2969·2021-09-22 15:38
閱讀 2813·2019-08-30 15:43
閱讀 1349·2019-08-29 18:39
閱讀 2584·2019-08-29 15:22
閱讀 2798·2019-08-28 18:17
閱讀 618·2019-08-26 13:37