摘要:小結(jié)本篇主要講述了如何生成數(shù)據(jù)集以及如何對(duì)其進(jìn)行可視化如何使用創(chuàng)建簡(jiǎn)單的圖表如果使用散點(diǎn)圖來(lái)探索隨機(jī)漫步過(guò)程如何使用創(chuàng)建直方圖,以及如何使用直方圖來(lái)探索同時(shí)擲兩個(gè)面數(shù)不同的骰子的結(jié)果。
《Python編程:從入門(mén)到實(shí)踐》筆記。1. 前言
從本篇起將用三篇的篇幅介紹如何用Python進(jìn)行數(shù)據(jù)可視化。
從本篇開(kāi)始,我們將用三篇的篇幅來(lái)初步介紹如何使用Python來(lái)進(jìn)行數(shù)據(jù)可視化操作。本篇的內(nèi)容包括:
繪制簡(jiǎn)單的折線圖;
隨機(jī)漫步;
使用Pygal模擬擲骰子。
在正式開(kāi)始之前,需要安裝兩個(gè)擴(kuò)展包:matplotlib和pygal。Python中安裝第三方庫(kù)的方式已在上一個(gè)項(xiàng)目中介紹過(guò)了,這里不再贅述。
2. 繪制簡(jiǎn)單的折線圖 2.1 簡(jiǎn)單的折線圖首先我們繪制一個(gè)簡(jiǎn)單的折線圖,代碼保存到mpl_squares.py文件中:
import matplotlib.pyplot as plt # 輸入數(shù)據(jù), x軸 input_values = [1, 2, 3, 4, 5] # 輸出數(shù)據(jù), y軸 squares = [1, 4, 9, 16, 25] # linewidth表示線條的粗細(xì) plt.plot(input_values, squares, linewidth=5) # 設(shè)置圖標(biāo)標(biāo)題,并給坐標(biāo)軸加上標(biāo)簽 plt.title("Square Numbers", fontsize=24) plt.xlabel("Value", fontsize=14) plt.ylabel("Square of Value", fontsize=14) # 設(shè)置刻度標(biāo)記的大小 plt.tick_params(axis="both", labelsize=14) plt.show()
matplotlib.pyplot.plot()函數(shù)可以只傳入一個(gè)squares參數(shù),表示y軸的值,此時(shí)將從x軸0點(diǎn)處開(kāi)始一一對(duì)應(yīng)。有時(shí)這樣很簡(jiǎn)便,但在此例中圖標(biāo)將不正確,所以我們傳入了input_values列表,將其與squares列表一一對(duì)應(yīng)。
代碼從第10行到15行都可以省了,這些代碼只是讓圖表的信息更全。最終的結(jié)果如下:
2.2 生成散點(diǎn)圖我們使用matplotlib.pyplot中的scatter()函數(shù)來(lái)生成散點(diǎn)圖,將代碼保存到scatter_squares.py文件中:
import matplotlib.pyplot as plt x_values = list(range(1, 1001)) y_values = [x ** 2 for x in x_values] # s表示點(diǎn)的大小,edgecolor表示點(diǎn)的輪廓的顏色,c表示數(shù)據(jù)點(diǎn)的顏色(可以使用RGB顏色) # plt.scatter(x_values, y_values, s=4, edgecolor="none", c="red") # 使用漸變色, 給c賦值了一個(gè)y值列表,并使用參數(shù)cmap告訴pylot使用哪個(gè)顏色來(lái)映射 plt.scatter(x_values, y_values, s=40, edgecolor="none", c=y_values, cmap=plt.cm.Blues) # 設(shè)置圖表標(biāo)題并給坐標(biāo)軸加上標(biāo)簽 plt.title("Square Number", fontsize=24) plt.xlabel("Value", fontsize=14) plt.ylabel("Square of Value", fontsize=14) # 設(shè)置刻度的大小 plt.tick_params(axis="both", which="major", labelsize=14) # 每個(gè)坐標(biāo)軸的取值范圍 plt.axis([0, 1100, 0, 1100000]) # 第一個(gè)參數(shù)是路徑名,第二個(gè)參數(shù)指定將圖表多余的空白區(qū)域裁減掉。 plt.savefig("squares.png", bbox_inches="tight") plt.show()
我們使用了列表生成式來(lái)生成y軸的數(shù)據(jù),并使用漸變色來(lái)繪制圖像,matplotlib.pyplot.cm.Blues是matplotlib自帶的漸變色,它和c的每一個(gè)值對(duì)應(yīng)。通過(guò)pyplot的axis()函數(shù)來(lái)設(shè)置每個(gè)軸的取值范圍。最后將圖像保存到本地。生成的圖像如下:
3. 隨機(jī)漫步隨機(jī)漫步指的是:每次行走都完全隨機(jī),沒(méi)有明確的方向,結(jié)果是由一系列隨機(jī)決策決定的。在自然界、物理學(xué)、生物學(xué)、化學(xué)和經(jīng)濟(jì)領(lǐng)域,隨機(jī)漫步都有其實(shí)際用途。
使用Python生成隨機(jī)漫步數(shù)據(jù),再使用matplotlib將這些數(shù)據(jù)繪制出來(lái)。首先創(chuàng)建RandomWalk類(lèi),代碼保存到random_walk.py文件中:
from random import choice class RandomWalk: """一個(gè)生成隨機(jī)漫步數(shù)據(jù)的類(lèi)""" def __init__(self, num_points=5000): """初始化隨機(jī)漫步的屬性""" self.num_points = num_points # 所有隨機(jī)漫步都始于(0, 0),這兩個(gè)列表用于存儲(chǔ)隨機(jī)漫步數(shù)據(jù) self.x_values = [0] self.y_values = [0] def fill_walk(self): """計(jì)算隨機(jī)漫步包含的所有點(diǎn)""" # 不斷漫步,直到列表到達(dá)指定的長(zhǎng)度 while len(self.x_values) < self.num_points: # 決定前進(jìn)方向以及沿這個(gè)方向前進(jìn)的距離 # 通過(guò)choice從給定值中隨機(jī)選取 x_direction = choice([1, -1]) # 正向還是負(fù)向 x_distance = choice([0, 1, 2, 3, 4]) # 移動(dòng)的距離 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 # 計(jì)算下一個(gè)點(diǎn)的坐標(biāo) 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)
下面的代碼用于生成隨機(jī)漫步圖像,代碼保存到rw_visual.py文件中:
import matplotlib.pyplot as plt from random_walk import RandomWalk while True: rw = RandomWalk(50000) rw.fill_walk() # 設(shè)置繪圖窗口的尺寸 plt.figure(figsize=(10, 6)) # 繪制隨機(jī)漫步的圖像 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) # 突出起點(diǎn)和終點(diǎn) 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) # 隱藏坐標(biāo)軸 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
程序通過(guò)一個(gè)循環(huán)類(lèi)多次繪制隨機(jī)漫步圖;通過(guò)pyplot的figure()函數(shù)來(lái)設(shè)置圖像的尺寸,figsize的單位是英寸;通過(guò)漸變色來(lái)繪制圖像的路徑,顏色由淺到深,并且我們將起點(diǎn)(綠色)和終點(diǎn)(紅色)顯著標(biāo)出;最后隱藏坐標(biāo)軸。最終的圖像如下(每次運(yùn)行的效果都不同):
4. 使用Pygal模擬擲骰子首先我們需要?jiǎng)?chuàng)建一個(gè)骰子類(lèi)Dice,將其保存到dice.py中:
from random import randint class Dice: """表示一個(gè)骰子類(lèi)""" def __init__(self, num_sides=6): """骰子默認(rèn)為6面""" self.num_sides = num_sides def roll(self): """返回一個(gè)位于1和骰子面數(shù)之間的隨機(jī)值""" return randint(1, self.num_sides)
可以自行設(shè)定骰子的面數(shù)。下面是擲兩個(gè)骰子50000次,統(tǒng)計(jì)倆骰子點(diǎn)數(shù)之和的分布的模擬,最后生成了一個(gè)矢量文件.svg文件,它能在瀏覽器中打開(kāi),代碼如下:
import pygal from dice import Dice dice_1 = Dice() dice_2 = Dice(10) # 擲骰子多次,并將結(jié)果存儲(chǔ)在一個(gè)列表中 results = [] for roll_num in range(50000): results.append(dice_1.roll() + dice_2.roll()) # 分析結(jié)果 frequences = [] # 能夠模擬擲任何雙骰子的情況,不管這些骰子有多少面 max_result = dice_1.num_sides + dice_2.num_sides for value in range(2, max_result + 1): # 統(tǒng)計(jì)每個(gè)結(jié)果的頻數(shù) frequences.append(results.count(value)) # 對(duì)結(jié)果進(jìn)行可視化 # 創(chuàng)建條形圖 hist = pygal.Bar() hist.title = "Result of rolling a D6 and a D10 50000 times." # 創(chuàng)建x軸上的刻度 hist.x_labels = [str(value) for value in range(2, max_result + 1)] hist.x_title = "Result" hist.y_title = "Frequency of Result" # 給這組數(shù)據(jù)起個(gè)名字,并加到圖表中 hist.add("D6 + D10", frequences) # 將圖像渲染為svg文件,矢量圖 hist.render_to_file("dice_visual.svg")
注意,frequences中的數(shù)據(jù)依次與hist.x_labels對(duì)應(yīng)。下面是最終結(jié)果:
Pygal讓這個(gè)圖表具有交互性:如果你將鼠標(biāo)指向該圖中的任何數(shù)據(jù)條,將看到它的具體數(shù)據(jù)。
5. 小結(jié)本篇主要講述了:
如何生成數(shù)據(jù)集以及如何對(duì)其進(jìn)行可視化;
如何使用matplotlib創(chuàng)建簡(jiǎn)單的圖表;
如果使用散點(diǎn)圖來(lái)探索隨機(jī)漫步過(guò)程;
如何使用Pygal創(chuàng)建直方圖,以及如何使用直方圖來(lái)探索同時(shí)擲兩個(gè)面數(shù)不同的骰子的結(jié)果。
迎大家關(guān)注我的微信公眾號(hào)"代碼港" & 個(gè)人網(wǎng)站 www.vpointer.net ~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44725.html
摘要:第行把具名元組以的形式返回。對(duì)序列使用和通常號(hào)兩側(cè)的序列由相同類(lèi)型的數(shù)據(jù)所構(gòu)成當(dāng)然不同類(lèi)型的也可以相加,返回一個(gè)新序列。從上面的結(jié)果可以看出,它雖拋出了異常,但仍完成了操作查看字節(jié)碼并不難,而且它對(duì)我們了解代碼背后的運(yùn)行機(jī)制很有幫助。 《流暢的Python》筆記。接下來(lái)的三篇都是關(guān)于Python的數(shù)據(jù)結(jié)構(gòu),本篇主要是Python中的各序列類(lèi)型 1. 內(nèi)置序列類(lèi)型概覽 Python標(biāo)準(zhǔn)庫(kù)...
摘要:本篇繼續(xù)學(xué)習(xí)之路,實(shí)現(xiàn)更多的特殊方法以讓自定義類(lèi)的行為跟真正的對(duì)象一樣。之所以要讓向量不可變,是因?yàn)槲覀冊(cè)谟?jì)算向量的哈希值時(shí)需要用到和的哈希值,如果這兩個(gè)值可變,那向量的哈希值就能隨時(shí)變化,這將不是一個(gè)可散列的對(duì)象。 《流暢的Python》筆記。本篇是面向?qū)ο髴T用方法的第二篇。前一篇講的是內(nèi)置對(duì)象的結(jié)構(gòu)和行為,本篇?jiǎng)t是自定義對(duì)象。本篇繼續(xù)Python學(xué)習(xí)之路20,實(shí)現(xiàn)更多的特殊方法以讓...
摘要:將每一行作為返回,其中是每行中的列名。對(duì)于每一行,都會(huì)生成一個(gè)對(duì)象,其中包含和列中的值。它返回一個(gè)迭代器,是迭代結(jié)果都為的情況。深度解析至此全劇終。 簡(jiǎn)單實(shí)戰(zhàn) 大家好,我又來(lái)了,在經(jīng)過(guò)之前兩篇文章的介紹后相信大家對(duì)itertools的一些常見(jiàn)的好用的方法有了一個(gè)大致的了解,我自己在學(xué)完之后仿照別人的例子進(jìn)行了真實(shí)場(chǎng)景下的模擬練習(xí),今天和大家一起分享,有很多部分還可以?xún)?yōu)化,希望有更好主意...
摘要:本篇是數(shù)據(jù)處理的第三篇,本篇將使用應(yīng)用程序接口自動(dòng)請(qǐng)求網(wǎng)站的特定信息并可視化。前言本將需要用到模塊來(lái)請(qǐng)求網(wǎng)站數(shù)據(jù)。使用可視化倉(cāng)庫(kù)使用一個(gè)參數(shù)配置類(lèi)來(lái)定義圖表的參數(shù),并自定義圖表中每個(gè)條形的描述信息,并給這些條形添加網(wǎng)址鏈接。 《Python編程:從入門(mén)到實(shí)踐》筆記。本篇是Python數(shù)據(jù)處理的第三篇,本篇將使用Web應(yīng)用程序接口自動(dòng)請(qǐng)求網(wǎng)站的特定信息并可視化。 1. 前言 本將需要用到...
閱讀 1198·2021-11-10 11:35
閱讀 2925·2021-09-24 10:35
閱讀 2957·2021-09-22 15:38
閱讀 2807·2019-08-30 15:43
閱讀 1338·2019-08-29 18:39
閱讀 2557·2019-08-29 15:22
閱讀 2788·2019-08-28 18:17
閱讀 611·2019-08-26 13:37