日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python基础学习[python编程从入门到实践读书笔记(连载四)]:数据可视化项目第15章

發(fā)布時間:2025/4/5 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python基础学习[python编程从入门到实践读书笔记(连载四)]:数据可视化项目第15章 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

      • matplotlib初學(xué)
        • 基礎(chǔ)繪圖用法
        • 隨機(jī)漫步
        • 使用Plotly模擬擲骰子

matplotlib初學(xué)

基礎(chǔ)繪圖用法

import matplotlib.pyplot as pltsquares = [1, 4, 9, 16, 25] fig, ax = plt.subplots() ax.plot(squares)plt.show()

首先導(dǎo)入模塊pyplot,并為其指定別名plt,以免反復(fù)輸入pyplot。(在線示例大多這樣做,這里也不例外。)模塊pyplot包含很多用于生成圖表的函數(shù)。

創(chuàng)建了一個名為squares的列表,在其中存儲要用來制作圖表的數(shù)據(jù)。然后,采取了另一種常見的Matplotlib做法——調(diào)用函數(shù)subplots()。這個函數(shù)可在一張圖片中繪制一個或多個圖表。變量fig表示整張圖片。變量ax表示圖片中的各個圖表。

接下來調(diào)用方法plot(),它嘗試根據(jù)給定的數(shù)據(jù)以有意義的方式繪制圖表。函數(shù)plt.show()打開Matplotlib查看器并顯示繪制的圖表

下面通過一些定制來改善這個圖表的可讀性:比如線條寬度更寬,顯示圖標(biāo)名稱等。

import matplotlib.pyplot as pltsquares = [1, 4, 9, 16, 25]fig, ax = plt.subplots() ax.plot(squares, linewidth=3)# 設(shè)置圖表標(biāo)題并給坐標(biāo)軸加上標(biāo)簽 ax.set_title("平方數(shù)", fontsize=24) ax.set_xlabel("值", fontsize=14) ax.set_ylabel("值的平方", fontsize=14)# 設(shè)置刻度標(biāo)記的大小 ax.tick_params(axis='both', labelsize=24)plt.show()

坐標(biāo)軸axis的發(fā)音搞得不好,記錄一下:美 [??ks?s]

遇到警告:

RuntimeWarning: Glyph 20540 missing from current font.

并且顯示中文亂碼:

經(jīng)過修改,在import后面加上rcParams這句話:

import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標(biāo)簽

備注:此處參考博文https://blog.csdn.net/qq_40563761/article/details/102989770
可以正常顯示中文:

代碼為:

import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標(biāo)簽squares = [1, 4, 9, 16, 25]fig, ax = plt.subplots() ax.plot(squares, linewidth=3)# 設(shè)置圖表標(biāo)題并給坐標(biāo)軸加上標(biāo)簽 ax.set_title("平方數(shù)", fontsize=24) ax.set_xlabel("值", fontsize=14) ax.set_ylabel("值的平方", fontsize=14)# 設(shè)置刻度標(biāo)記的大小 ax.tick_params(axis='both', labelsize=24)plt.show()

對其進(jìn)行解釋

參數(shù)linewidth決定了plot()繪制的線條粗細(xì)。方法set_title()給圖表指定標(biāo)題。在上述代碼中,出現(xiàn)多次的參數(shù)fontsize指定圖表中各種文字的大小。

方法set_xlabel()和set_ylabel()讓你能夠為每條軸設(shè)置標(biāo)題。方法tick_params()設(shè)置刻度的樣式,其中指定的實參將影響x軸和y軸上的刻度(axes=‘both’),并將刻度標(biāo)記的字號設(shè)置為14(labelsize=14)。

當(dāng)然,我們可以發(fā)現(xiàn)這張圖是繪制錯誤的。4的平方竟然是25!

原因是:向plot()提供一系列數(shù)時,它假設(shè)第一個數(shù)據(jù)點對應(yīng)的x坐標(biāo)值為0,但這里第一個點對應(yīng)的x值為1。

我們可以通過指定自變量的方式來修改,修改后的代碼如下,現(xiàn)在plot()將正確地繪制數(shù)據(jù),因為同時提供了輸入值和輸出值,plot()無須對輸出值的生成方式做出假設(shè)。

import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標(biāo)簽input_values = [1, 2, 3, 4, 5] squares = [1, 4, 9, 16, 25]fig, ax = plt.subplots() ax.plot(input_values, squares, linewidth=3)# 設(shè)置圖表標(biāo)題并給坐標(biāo)軸加上標(biāo)簽 ax.set_title("平方數(shù)", fontsize=24) ax.set_xlabel("值", fontsize=14) ax.set_ylabel("值的平方", fontsize=14)# 設(shè)置刻度標(biāo)記的大小 ax.tick_params(axis='both', labelsize=24)plt.show()

得到的正確的圖像:

使用內(nèi)置樣式

matplotlib提供了很多樣式,我們可以在終端中輸入下面這些命令查看

PS D:\user\文檔\python\python_work\data_visualization\test_matplotlib> python Python 3.8.8 (tags/v3.8.8:024d805, Feb 19 2021, 13:18:16) [MSC v.1928 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import matplotlib.pyplot as plt >>> plt.style.available ['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']

顯示的樣式都是可用的,只要在生成圖表之前添加如下代碼行:

plt.style.use('seaborn')

舉例代碼:

plt.style.use('seaborn') fig, ax = plt.subplots() ax.plot(input_values, squares, linewidth=3)

可是,在添加完之后,結(jié)果中文標(biāo)題又是亂碼

C:\Users\m1521\AppData\Roaming\Python\Python38\site-packages\matplotlib\backends\backend_agg.py:238: RuntimeWarning: Glyph 24179 missing from current font.font.set_text(s, 0.0, flags=flags) C:\Users\m1521\AppData\Roaming\Python\Python38\site-packages\matplotlib\backends\backend_agg.py:238: RuntimeWarning: Glyph 26041 missing from current font.font.set_text(s, 0.0, flags=flags) C:\Users\m1521\AppData\Roaming\Python\Python38\site-packages\matplotlib\backends\backend_agg.py:238: RuntimeWarning: Glyph 25968 missing from current font.font.set_text(s, 0.0, flags=flags) C:\Users\m1521\AppData\Roaming\Python\Python38\site-packages\matplotlib\backends\backend_agg.py:238: RuntimeWarning: Glyph 20540 missing from current font.font.set_text(s, 0.0, flags=flags) C:\Users\m1521\AppData\Roaming\Python\Python38\site-packages\matplotlib\backends\backend_agg.py:201: RuntimeWarning: Glyph 20540 missing from current font.font.set_text(s, 0, flags=flags) C:\Users\m1521\AppData\Roaming\Python\Python38\site-packages\matplotlib\backends\backend_agg.py:238: RuntimeWarning: Glyph 30340 missing from current font.font.set_text(s, 0.0, flags=flags) C:\Users\m1521\AppData\Roaming\Python\Python38\site-packages\matplotlib\backends\backend_agg.py:201: RuntimeWarning: Glyph 30340 missing from current font.font.set_text(s, 0, flags=flags) C:\Users\m1521\AppData\Roaming\Python\Python38\site-packages\matplotlib\backends\backend_agg.py:201: RuntimeWarning: Glyph 24179 missing from current font.font.set_text(s, 0, flags=flags) C:\Users\m1521\AppData\Roaming\Python\Python38\site-packages\matplotlib\backends\backend_agg.py:201: RuntimeWarning: Glyph 26041 missing from current font.font.set_text(s, 0, flags=flags) C:\Users\m1521\AppData\Roaming\Python\Python38\site-packages\matplotlib\backends\backend_agg.py:201: RuntimeWarning: Glyph 25968 missing from current font.

解決方法是什么呢?

將前面添加過的顯示中文的rcParams移到style.use后面,具體代碼如下:

import matplotlib.pyplot as plt input_values = [1, 2, 3, 4, 5] squares = [1, 4, 9, 16, 25]plt.style.use('seaborn') plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標(biāo)簽 fig, ax = plt.subplots() ax.plot(input_values, squares, linewidth=3)# 設(shè)置圖表標(biāo)題并給坐標(biāo)軸加上標(biāo)簽 ax.set_title("平方數(shù)", fontsize=24) ax.set_xlabel("值", fontsize=14) ax.set_ylabel("值的平方", fontsize=14)# 設(shè)置刻度標(biāo)記的大小 ax.tick_params(axis='both', labelsize=24)plt.show()

測試一下其他樣式,這里測試dark_background:

plt.style.use('dark_background') plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標(biāo)簽

測試ggplot

plt.style.use('ggplot') plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標(biāo)簽

使用scatter()繪制散點圖并設(shè)置樣式
繪制單個點,可使用方法scatter()。向它傳遞一對x坐標(biāo)和y坐標(biāo),它將在指定位置繪制一個點,測試代碼如下:

import matplotlib.pyplot as pltplt.style.use('seaborn') fig, ax = plt.subplots() ax.scatter(2, 4)plt.show()

運(yùn)行結(jié)果:

下面對圖標(biāo)進(jìn)行自定義,添加上標(biāo)題,點足夠大等信息

import matplotlib.pyplot as pltplt.style.use('seaborn') plt.rcParams['font.sans-serif'] = ['SimHei'] fig, ax = plt.subplots() ax.scatter(2, 4, s=200)# 設(shè)置圖表標(biāo)題并給坐標(biāo)軸加上標(biāo)簽 ax.set_title('平方數(shù)', fontsize=24) ax.set_xlabel('值', fontsize=14) ax.set_ylabel('值的平方', fontsize=14)# 設(shè)置刻度標(biāo)記的大小 ax.tick_params(axis='both', which='major', labelsize=14)plt.show()

調(diào)用scatter()并使用參數(shù)s設(shè)置繪制圖形時使用的點的尺寸。

使用scatter()繪制一系列點

import matplotlib.pyplot as pltx_values = [1, 2, 3, 4, 5] y_values = [1, 4, 9, 16, 25]plt.style.use('seaborn') plt.rcParams['font.sans-serif'] = ['SimHei'] fig, ax = plt.subplots() ax.scatter(x_values, y_values, s=100)# 設(shè)置圖表標(biāo)題并給坐標(biāo)軸加上標(biāo)簽 ax.set_title('平方數(shù)', fontsize=24) ax.set_xlabel('值', fontsize=14) ax.set_ylabel('值的平方', fontsize=14)# 設(shè)置刻度標(biāo)記的大小 ax.tick_params(axis='both', which='major', labelsize=14)plt.show()

測試結(jié)果

自動計算數(shù)據(jù)

下面是繪制1000個點的代碼:

首先創(chuàng)建了一個包含x值的列表,其中包含數(shù)1~1000。接下來,是一個生成y值的列表解析,它遍歷x值(for x inx_values),計算其平方值(x**2),并將結(jié)果存儲到列表y_values中。然后,將輸入列表和輸出列表傳遞給scatter()。這個數(shù)據(jù)集較大,因此將點設(shè)置得較小。

使用方法axis()指定了每個坐標(biāo)軸的取值范圍。方法axis()要求提供4個值:x和y坐標(biāo)軸的最小值和最大值。這里將x坐標(biāo)軸的取值范圍設(shè)置為0~1100,并將y坐標(biāo)軸的取值范圍設(shè)置為0~1 100 000。

import matplotlib.pyplot as pltx_values = range(0, 1001) y_values = [x**2 for x in x_values]plt.style.use('seaborn') plt.rcParams['font.sans-serif'] = ['SimHei'] fig, ax = plt.subplots() ax.scatter(x_values, y_values, s=10)# 設(shè)置圖表標(biāo)題并給坐標(biāo)軸加上標(biāo)簽 ax.set_title('平方數(shù)', fontsize=24) ax.set_xlabel('值', fontsize=14) ax.set_ylabel('值的平方', fontsize=14)# 設(shè)置刻度標(biāo)記的大小 ax.tick_params(axis='both', which='major', labelsize=14)# 設(shè)置每個坐標(biāo)軸的取值范圍 ax.axis([0, 1100, 0, 1100000])plt.show()

運(yùn)行結(jié)果:

自定義顏色

要修改數(shù)據(jù)點的顏色,可向scatter()傳遞參數(shù)c,并將其設(shè)置為要使用的顏色的名稱(放在引號內(nèi)),如下所示:

ax.scatter(x_values, y_values, c='red', s=10)

還可使用RGB顏色模式自定義顏色。要指定自定義顏色,可傳遞參數(shù)c,并將其設(shè)置為一個元組,其中包含三個0~1的小數(shù)值,分別表示紅色、綠色和藍(lán)色的分量。例如,下面的代碼行創(chuàng)建一個由淡綠色點組成的散點圖:

ax.scatter(x_values, y_values, c=(0, 0.8, 0), s=10)

值越接近0,指定的顏色越深;值越接近1,指定的顏色越淺。
運(yùn)行結(jié)果:

使用顏色映射

顏色映射(colormap)是一系列顏色,從起始顏色漸變到結(jié)束顏色。在可視化中,顏色映射用于突出數(shù)據(jù)的規(guī)律。例如,你可能用較淺的顏色來顯示較小的值,并使用較深的顏色來顯示較大的值。

模塊pyplot內(nèi)置了一組顏色映射。要使用這些顏色映射,需要告訴pyplot該如何設(shè)置數(shù)據(jù)集中每個點的顏色。

下面的例子中:

ax.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, s=10)

我們將參數(shù)c設(shè)置成了一個y值列表,并使用參數(shù)cmap告訴pyplot使用哪個顏色映射。這些代碼將y值較小的點顯示為淺藍(lán)色,并將y值較大的點顯示為深藍(lán)色。

自動保存圖表

要讓程序自動將圖表保存到文件中,可將調(diào)用plt.show()替換為調(diào)用plt.savefig():

plt.savefig('square_plot.png', bbox_inches='tight')

第一個實參指定要以什么文件名保存圖表,這個文件將存儲到scatter_squares.py所在的目錄。第二個實參指定將圖表多余的空白區(qū)域裁剪掉。如果要保留圖表周圍多余的空白區(qū)域,只需省略這個實參即可。

我們可以發(fā)現(xiàn),已經(jīng)保存為文件
全部代碼為:

import matplotlib.pyplot as pltx_values = range(0, 1001) y_values = [x**2 for x in x_values]plt.style.use('seaborn') plt.rcParams['font.sans-serif'] = ['SimHei'] fig, ax = plt.subplots() ax.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, s=10)# 設(shè)置圖表標(biāo)題并給坐標(biāo)軸加上標(biāo)簽 ax.set_title('平方數(shù)', fontsize=24) ax.set_xlabel('值', fontsize=14) ax.set_ylabel('值的平方', fontsize=14)# 設(shè)置刻度標(biāo)記的大小 ax.tick_params(axis='both', which='major', labelsize=14)# 設(shè)置每個坐標(biāo)軸的取值范圍 ax.axis([0, 1100, 0, 1100000])# plt.show() plt.savefig('square_plot.png', bbox_inches='tight')


練習(xí)題

立方數(shù)的三次方稱為立方。請繪制一個圖形,顯示前5個整數(shù)的立方值。再繪制一個圖形,顯示前5000個整數(shù)的立方值。
python中立方可以用x**3來表示

顯示前5個數(shù)的立方

import matplotlib.pyplot as plt import mathx_values = range(1, 6) y_values = [x**3 for x in x_values]plt.style.use('seaborn') plt.rcParams['font.sans-serif'] = ['SimHei'] fig, ax = plt.subplots() ax.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, s=200)# 設(shè)置圖表標(biāo)題并給坐標(biāo)軸加上標(biāo)簽 ax.set_title('立方數(shù)', fontsize=24) ax.set_xlabel('值', fontsize=14) ax.set_ylabel('值的立方', fontsize=14)# 設(shè)置刻度標(biāo)記的大小 ax.tick_params(axis='both', which='major', labelsize=14)# 設(shè)置每個坐標(biāo)軸的取值范圍 ax.axis([0, 6, 0, 200])plt.show() #plt.savefig('square_plot.png', bbox_inches='tight')


前5000個數(shù)的立方

import matplotlib.pyplot as plt import mathx_values = range(0, 5001) y_values = [x**3 for x in x_values]plt.style.use('seaborn') plt.rcParams['font.sans-serif'] = ['SimHei'] fig, ax = plt.subplots() ax.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, s=10)# 設(shè)置圖表標(biāo)題并給坐標(biāo)軸加上標(biāo)簽 ax.set_title('立方數(shù)', fontsize=24) ax.set_xlabel('值', fontsize=14) ax.set_ylabel('值的立方', fontsize=14)# 設(shè)置刻度標(biāo)記的大小 ax.tick_params(axis='both', which='major', labelsize=14)# 設(shè)置每個坐標(biāo)軸的取值范圍 ax.axis([0, 5001, 0, 125000000000])plt.show() #plt.savefig('square_plot.png', bbox_inches='tight')

隨機(jī)漫步

隨機(jī)漫步是這樣行走得到的路徑:每次行走都是完全隨機(jī)的、沒有明確的方向,結(jié)果是由一系列隨機(jī)決策決定的。你可以將隨機(jī)漫步看作螞蟻在暈頭轉(zhuǎn)向的情況下,每次都沿隨機(jī)的方向前行所經(jīng)過的路徑。

創(chuàng)建RandomWalk類

為模擬隨機(jī)漫步,將創(chuàng)建一個名為RandomWalk的類,它隨機(jī)地選擇前進(jìn)方向。這個類需要三個屬性:一個是存儲隨機(jī)漫步次數(shù)的變量,其他兩個是列表,分別存儲隨機(jī)漫步經(jīng)過的每個點的x坐標(biāo)和y坐標(biāo)。

RandomWalk類只包含兩個方法:方法__init___()和fill_walk(),后者計算隨機(jī)漫步經(jīng)過的所有點。

為做出隨機(jī)決策,將所有可能的選擇都存儲在一個列表中,并在每次決策時都使用模塊random中的choice()來決定使用哪種選擇。

關(guān)于__init__的代碼:
random_walk.py

from random import choiceclass RandomWalk:"""一個生成隨機(jī)漫步數(shù)據(jù)的類。"""def __init__(self, num_points=5000):"""初始化隨機(jī)漫步的屬性。"""self.num_points = num_points# 所有隨機(jī)漫步都始于(0, 0)self.x_values = [0]self.y_values = [0]

接下來,將隨機(jī)漫步包含的默認(rèn)點數(shù)設(shè)置為5000。這個數(shù)大到足以生成有趣的模式,又小到可確保能夠快速地模擬隨機(jī)漫步。

然后,創(chuàng)建兩個用于存儲x值和y值的列表,并讓每次漫步都從點(0, 0)出發(fā)。

選擇方向
關(guān)于fill_walk函數(shù):
random_walk.py

from random import choiceclass RandomWalk:"""一個生成隨機(jī)漫步數(shù)據(jù)的類。"""def __init__(self, num_points=5000):"""初始化隨機(jī)漫步的屬性。"""self.num_points = num_points# 所有隨機(jī)漫步都始于(0, 0)self.x_values = [0]self.y_values = [0]def fill_walk(self):"""計算隨機(jī)漫步包含的所有點。"""# 不斷漫步,直到列表達(dá)到指定長度while len(self.x_values) < self.num_points:# 決定前進(jìn)方向以及沿這個方向前進(jìn)的距離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值x = self.x_values[-1] + x_stepy = self.y_values[-1] + y_stepself.x_values.append(x)self.y_values.append(y)

代碼解釋:

  • 這里建立了一個循環(huán),它不斷運(yùn)行,直到漫步包含所需的點數(shù)。方法fill_walk()的主要部分告訴Python如何模擬四種漫步?jīng)Q定:向右走還是向左走?沿指定的方向走多遠(yuǎn)?向上走還是向下走?沿選定的方向走多遠(yuǎn)?

  • 使用choice([1, -1])給x_direction選擇一個值,結(jié)果要么是表示向右走的1,要么是表示向左走的-1。接下來,choice([0, 1, 2, 3, 4])隨機(jī)地選擇一個0~4的整數(shù),告訴Python 沿指定的方向走多遠(yuǎn)(x_distance)。通過包含0,不僅能夠同時沿兩個軸移動,還能夠只沿一個軸移動。

  • 將移動方向乘以移動距離,確定沿x軸和y軸移動的距離。如果x_step為正將向右移動,為負(fù)將向左移動,為零將垂直移動;如果y_step為正將向上移動,為負(fù)將向下移動,為零將水平移動。如果x_step和y_step都為零,則意味著原地踏步。我們拒絕這樣的情況,接著執(zhí)行下一次循環(huán).

  • 為獲取漫步中下一個點的x值,將x_step與x_values中的最后一個值相加,對y值也做相同的處理。獲得下一個點的x值和y值后,將它們分別附加到列表x_values和y_values的末尾。

下面的代碼將隨機(jī)漫步的所有點都繪制出來:
rw_visual.py

import matplotlib.pyplot as plt from random_walk import RandomWalk# 創(chuàng)建一個RandomWalk實例 rw = RandomWalk() rw.fill_walk()# 將所有點都繪制出來 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.style.use('classic') fig, ax = plt.subplots()ax.scatter(rw.x_values, rw.y_values, s=15) plt.show()

測試結(jié)果:

每次隨機(jī)漫步都不同,因此探索可能生成的各種模式很有趣。要在不多次運(yùn)行程序的情況下使用前面的代碼模擬多次隨機(jī)漫步,一種辦法是將這些代碼放在一個while循環(huán)中,如下所示:
rw_visual_while.py

import matplotlib.pyplot as plt from random_walk import RandomWalk# 只要程序處于活動狀態(tài),就不斷模擬隨機(jī)漫步while True:# 創(chuàng)建一個RandomWalk實例rw = RandomWalk()rw.fill_walk()# 將所有點都繪制出來plt.style.use('classic')fig, ax = plt.subplots()ax.scatter(rw.x_values, rw.y_values, s=15)plt.show()keep_running = input("Make another walk? (y/n): ")if keep_running == 'n':break

這些代碼模擬一次隨機(jī)漫步,在Matplotlib查看器中顯示結(jié)果,再在不關(guān)閉查看器的情況下暫停。如果關(guān)閉查看器,程序?qū)⒃儐?/strong>是否要再模擬一次隨機(jī)漫步。如果輸入y,可模擬在起點附近進(jìn)行的隨機(jī)漫步、大多沿特定方向偏離起點的隨機(jī)漫步、漫步點分布不均勻的隨機(jī)漫步,等等。要結(jié)束程序,請輸入n。

置隨機(jī)漫步圖的樣式

本節(jié)將定制圖表,以突出每次漫步的重要特征,并讓分散注意力的元素不那么顯眼。為此,我們確定要突出的元素,如漫步的起點、終點和經(jīng)過的路徑。接下來確定要使其不那么顯眼的元素,如刻度標(biāo)記和標(biāo)簽。最終的結(jié)果是簡單的可視化表示,清楚地指出了每次漫步經(jīng)過的路徑。

給點著色
我們將使用顏色映射來指出漫步中各點的先后順序,并刪除每個點的黑色輪廓,讓其顏色更為明顯。為根據(jù)漫步中各點的先后順序來著色,傳遞參數(shù)c,并將其設(shè)置為一個列表,其中包含各點的先后順序。這些點是按順序繪制的,因此給參數(shù)c指定的列表只需包含數(shù)0~4999,如下所示:
rw_visual_while.py

import matplotlib.pyplot as plt from random_walk import RandomWalk# 只要程序處于活動狀態(tài),就不斷模擬隨機(jī)漫步while True:# 創(chuàng)建一個RandomWalk實例rw = RandomWalk()rw.fill_walk()# 將所有點都繪制出來plt.style.use('classic')fig, ax = plt.subplots()point_numbers = range(rw.num_points)ax.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors='none', s=15)plt.show()keep_running = input("Make another walk? (y/n): ")if keep_running == 'n':break

代碼解釋

使用range()生成了一個數(shù)字列表,其中包含的數(shù)與漫步包含的點數(shù)量相同。接下來,將這個列表存儲在point_numbers中,以便后面使用它來設(shè)置每個漫步點的顏色。將參數(shù)c設(shè)置為point_numbers,指定使用顏色映射Blues,并傳遞實參edgecolors='none’以刪除每個點周圍的輪廓。最終的隨機(jī)漫步圖從淺藍(lán)色漸變?yōu)樯钏{(lán)色。

生成結(jié)果

重新繪制起點和終點
除了給隨機(jī)漫步的各個點著色,以指出其先后順序外,如果還能呈現(xiàn)隨機(jī)漫步的起點和終點就好了。為此,可在繪制隨機(jī)漫步圖后重新繪制起點和終點。這里讓起點和終點更大并顯示為不同的顏色,以示突出.

為突出起點,使用綠色繪制點(0, 0),并使其比其他點大(s=100)。為突出終點,在漫步包含的最后一個x值和y值處繪制一個點,將其顏色設(shè)置為紅色,并將尺寸設(shè)置為100。務(wù)必將這些代碼放在調(diào)用plt.show()的代碼前面,確保在其他點之上繪制起點和終點。


代碼

import matplotlib.pyplot as plt from random_walk import RandomWalk# 只要程序處于活動狀態(tài),就不斷模擬隨機(jī)漫步while True:# 創(chuàng)建一個RandomWalk實例rw = RandomWalk()rw.fill_walk()# 將所有點都繪制出來plt.style.use('classic')fig, ax = plt.subplots()point_numbers = range(rw.num_points)ax.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors='none', s=15)# 突出起點和終點ax.scatter(0, 0, c='green', edgecolors='none', s=100)ax.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none', s=100)plt.show()keep_running = input("Make another walk? (y/n): ")if keep_running == 'n':break

隱藏坐標(biāo)軸
下面來隱藏這個圖表的坐標(biāo)軸。

為修改坐標(biāo)軸,使用方法ax.get_xaxis()和ax.get_yaxis()將每條坐標(biāo)軸的可見性都設(shè)置為False。

代碼

import matplotlib.pyplot as plt from random_walk import RandomWalk# 只要程序處于活動狀態(tài),就不斷模擬隨機(jī)漫步while True:# 創(chuàng)建一個RandomWalk實例rw = RandomWalk()rw.fill_walk()# 將所有點都繪制出來plt.style.use('classic')fig, ax = plt.subplots()point_numbers = range(rw.num_points)ax.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors='none', s=15)# 突出起點和終點ax.scatter(0, 0, c='green', edgecolors='none', s=100)ax.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none', s=100)# 隱藏坐標(biāo)軸ax.get_xaxis().set_visible(False)ax.get_yaxis().set_visible(False) plt.show()keep_running = input("Make another walk? (y/n): ")if keep_running == 'n':break

增加點數(shù)
下面來增加點數(shù),以提供更多數(shù)據(jù)。為此,在創(chuàng)建RandomWalk實例時增大num_points的值,并在繪圖時調(diào)整每個點的大小。

代碼

import matplotlib.pyplot as plt from random_walk import RandomWalk# 只要程序處于活動狀態(tài),就不斷模擬隨機(jī)漫步while True:# 創(chuàng)建一個RandomWalk實例rw = RandomWalk(50_000)rw.fill_walk()# 將所有點都繪制出來plt.style.use('classic')fig, ax = plt.subplots()point_numbers = range(rw.num_points)ax.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors='none', s=1)# 突出起點和終點ax.scatter(0, 0, c='green', edgecolors='none', s=100)ax.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none', s=100)# 隱藏坐標(biāo)軸ax.get_xaxis().set_visible(False)ax.get_yaxis().set_visible(False) plt.show()keep_running = input("Make another walk? (y/n): ")if keep_running == 'n':break

使用Plotly模擬擲骰子

使用Python包Plotly來生成交互式圖表。需要創(chuàng)建在瀏覽器中顯示的圖表時,Plotly很有用,因為它生成的圖表將自動縮放以適合觀看者的屏幕。Plotly生成的圖表還是交互式的:用戶將鼠標(biāo)指向特定元素時,將突出顯示有關(guān)該元素的信息。

安裝plotly
按照書中所示,輸入如下代碼,會報錯

python -m pip install --user plotly

報錯如下:

PS D:\user\文檔\python\python_work\data_visualization> python -m pip install --user plotly WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1125)'))': /simple/plotly/ WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1125)'))': /simple/plotly/ WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1125)'))': /simple/plotly/ WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1125)'))': /simple/plotly/ WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1125)'))': /simple/plotly/ Could not fetch URL https://pypi.org/simple/plotly/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/plotly/ (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1125)'))) - skipping ERROR: Could not find a version that satisfies the requirement plotly ERROR: No matching distribution found for plotly

對于問題:

Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ConnectTimeoutError

的原因是pip源連接證書驗證失敗

解決問題:通過如下命令,后面表示切換到國內(nèi)的pip源,這里用的是豆瓣的源

pip install plotly -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

參考:python中安裝包出現(xiàn)Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))…………

創(chuàng)建Die類

為模擬擲一個骰子的情況,我們創(chuàng)建下面的類:

from random import randintclass Die:"""表示一個骰子的類。"""def __init__(self, num_sides=6):"""骰子設(shè)置為6面"""self.num_sides = num_sidesdef roll(self):"""返回一個位于1和骰子面數(shù)之間的隨機(jī)值."""return randint(1, self.num_sides)

法__init__()接受一個可選參數(shù)。創(chuàng)建這個類的實例時,如果沒有指定任何實參,面數(shù)默認(rèn)為6;如果指定了實參,這個值將用于設(shè)置骰子的面數(shù)。骰子是根據(jù)面數(shù)命名的,6面的骰子名為D6,8面的骰子名為D8,依此類推。

方法roll()使用函數(shù)randint()來返回一個1和面數(shù)之間的隨機(jī)數(shù)。這個函數(shù)可能返回起始值1、終止值num_sides或這兩個值之間的任何整數(shù)。

die_visual.py

from die import Die# 創(chuàng)建一個D6 die = Die()# 擲幾次骰子并將結(jié)果存儲在一個列表中 results = [] for roll_num in range(1, 100):result = die.roll()results.append(result)print(results)

創(chuàng)建一個Die實例,其面數(shù)為默認(rèn)值6。然后擲骰子100次,并將每次的結(jié)果都存儲在列表results中。下面是一個示例結(jié)果集:

[5, 3, 1, 5, 4, 3, 3, 4, 2, 6, 2, 4, 3, 4, 6, 4, 6, 2, 4, 5, 5, 3, 2, 4, 1, 3, 1, 1, 1, 2, 2, 2, 6, 1, 4, 1, 6, 1, 6, 3, 4, 3, 2, 2, 2, 2, 5, 3, 1, 5, 6, 1, 6, 4, 5, 2, 6, 2, 5, 4, 1, 1, 5, 2, 1, 1, 2, 1, 5, 3, 1, 1, 3, 2, 5, 5, 5, 1, 4, 6, 2, 4, 6, 3, 6, 3, 6, 3, 6, 2, 6, 5, 3, 2, 4, 1, 1, 6, 3]

分析結(jié)果:

為分析擲一個D6的結(jié)果,計算每個點數(shù)出現(xiàn)的次數(shù):

die_visual.py

from die import Die# 創(chuàng)建一個D6 die = Die()# 擲幾次骰子并將結(jié)果存儲在一個列表中 results = [] for roll_num in range(1000):result = die.roll()results.append(result)# print(results)# 分析結(jié)果 frequencies = [] for value in range(1, die.num_sides+1):frequency = results.count(value)frequencies.append(frequency)print(frequencies)

由于將使用Plotly來分析,而不是將結(jié)果打印出來,因此可將模擬擲骰子的次數(shù)增加到1000。為分析結(jié)果,我們創(chuàng)建空列表frequencies,用于存儲每種點數(shù)出現(xiàn)的次數(shù)。然后,遍歷可能的點數(shù)(這里為1~6),計算每種點數(shù)在results中出現(xiàn)了多少次,并將這個值附加到列表frequencies的末尾。接下來,在可視化之前將這個列表打印出來,結(jié)果為

[155, 173, 187, 157, 158, 170]

繪制直方圖
有了頻率列表,就可以繪制一個表示結(jié)果的直方圖了。直方圖是一種條形圖,指出了各種結(jié)果出現(xiàn)的頻率。創(chuàng)建這種直方圖的代碼如下:

die_visual.py

from plotly.graph_objs import Bar, Layout from plotly import offlinefrom die import Die# 創(chuàng)建一個D6 die = Die()# 擲幾次骰子并將結(jié)果存儲在一個列表中 results = [] for roll_num in range(1000):result = die.roll()results.append(result)# print(results)# 分析結(jié)果 frequencies = [] for value in range(1, die.num_sides+1):frequency = results.count(value)frequencies.append(frequency)# print(frequencies)# 對結(jié)果進(jìn)行可視化 x_values = list(range(1, die.num_sides+1)) data = [Bar(x=x_values, y=frequencies)]x_axis_config = {'title': '結(jié)果'} y_axis_config = {'title': '結(jié)果的頻率'} my_layout = Layout(title='擲一個D6 1000次的結(jié)果',xaxis=x_axis_config, yaxis=y_axis_config) offline.plot({'data': data, 'layout': my_layout}, filename='d6.html')

為創(chuàng)建直方圖,需要為每個可能出現(xiàn)的點數(shù)生成一個條形。我們將可能出現(xiàn)的點數(shù)(1到骰子的面數(shù))存儲在一個名為x_values的列表中。

Plotly不能直接接受函數(shù)range()的結(jié)果,因此需要使用函數(shù)list()將其轉(zhuǎn)換為列表。Plotly類Bar()表示用于繪制條形圖的數(shù)據(jù)集,需要一個存儲x值的列表和一個存儲y值的列表。這個類必須放在方括號內(nèi),因為數(shù)據(jù)集可能包含多個元素。

每個坐標(biāo)軸都能以不同的方式進(jìn)行配置,而每個配置選項都是一個字典元素。這里只設(shè)置了坐標(biāo)軸標(biāo)簽。類Layout()返回一個指定圖表布局和配置的對象。這里設(shè)置了圖表名稱,并傳入了x軸和y軸的配置字典。

為生成圖表,我們調(diào)用了函數(shù)offline.plot())。這個函數(shù)需要一個包含數(shù)據(jù)和布局對象的字典,還接受一個文件名,指定要將圖表保存到哪里。這里將輸出存儲到文件d6.html。
運(yùn)行程序,瀏覽器會自動打開如下頁面:


同時擲兩個骰子
同時擲兩個骰子時,得到的點數(shù)更多,結(jié)果分布情況也不同。下面來修改前面的代碼,創(chuàng)建兩個D6以模擬同時擲兩個骰子的情況。每次擲兩個骰子時,都將兩個骰子的點數(shù)相加,并將結(jié)果存儲在results中。

創(chuàng)建圖表時,在字典x_axis_config中使用了dtick鍵。這項設(shè)置指定了x
軸顯示的刻度間距。這里繪制的直方圖包含的條形更多,Plotly默認(rèn)只顯示某些刻度值,而設(shè)置’dtick’: 1讓Plotly顯示每個刻度值。另外,我們還修改了圖表名稱及輸出文件名。

這個圖表顯示了擲兩個D6時得到的大致結(jié)果。如你所見,總點數(shù)為2或12的可能性最小,而總點數(shù)為7的可能性最大。這是因為在下面6種情況下得到的總點數(shù)都為7:1和6、2和5、3和4、4和3、5和2以及6和1。

總結(jié)

以上是生活随笔為你收集整理的python基础学习[python编程从入门到实践读书笔记(连载四)]:数据可视化项目第15章的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。