python基础学习[python编程从入门到实践读书笔记(连载四)]:数据可视化项目第15章
文章目錄
- matplotlib初學
- 基礎繪圖用法
- 隨機漫步
- 使用Plotly模擬擲骰子
matplotlib初學
基礎繪圖用法
import matplotlib.pyplot as pltsquares = [1, 4, 9, 16, 25] fig, ax = plt.subplots() ax.plot(squares)plt.show()首先導入模塊pyplot,并為其指定別名plt,以免反復輸入pyplot。(在線示例大多這樣做,這里也不例外。)模塊pyplot包含很多用于生成圖表的函數。
創建了一個名為squares的列表,在其中存儲要用來制作圖表的數據。然后,采取了另一種常見的Matplotlib做法——調用函數subplots()。這個函數可在一張圖片中繪制一個或多個圖表。變量fig表示整張圖片。變量ax表示圖片中的各個圖表。
接下來調用方法plot(),它嘗試根據給定的數據以有意義的方式繪制圖表。函數plt.show()打開Matplotlib查看器并顯示繪制的圖表
下面通過一些定制來改善這個圖表的可讀性:比如線條寬度更寬,顯示圖標名稱等。
import matplotlib.pyplot as pltsquares = [1, 4, 9, 16, 25]fig, ax = plt.subplots() ax.plot(squares, linewidth=3)# 設置圖表標題并給坐標軸加上標簽 ax.set_title("平方數", fontsize=24) ax.set_xlabel("值", fontsize=14) ax.set_ylabel("值的平方", fontsize=14)# 設置刻度標記的大小 ax.tick_params(axis='both', labelsize=24)plt.show()坐標軸axis的發音搞得不好,記錄一下:美 [??ks?s]
遇到警告:
RuntimeWarning: Glyph 20540 missing from current font.并且顯示中文亂碼:
經過修改,在import后面加上rcParams這句話:
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽備注:此處參考博文https://blog.csdn.net/qq_40563761/article/details/102989770
可以正常顯示中文:
代碼為:
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽squares = [1, 4, 9, 16, 25]fig, ax = plt.subplots() ax.plot(squares, linewidth=3)# 設置圖表標題并給坐標軸加上標簽 ax.set_title("平方數", fontsize=24) ax.set_xlabel("值", fontsize=14) ax.set_ylabel("值的平方", fontsize=14)# 設置刻度標記的大小 ax.tick_params(axis='both', labelsize=24)plt.show()對其進行解釋
參數linewidth決定了plot()繪制的線條粗細。方法set_title()給圖表指定標題。在上述代碼中,出現多次的參數fontsize指定圖表中各種文字的大小。
方法set_xlabel()和set_ylabel()讓你能夠為每條軸設置標題。方法tick_params()設置刻度的樣式,其中指定的實參將影響x軸和y軸上的刻度(axes=‘both’),并將刻度標記的字號設置為14(labelsize=14)。
當然,我們可以發現這張圖是繪制錯誤的。4的平方竟然是25!
原因是:向plot()提供一系列數時,它假設第一個數據點對應的x坐標值為0,但這里第一個點對應的x值為1。
我們可以通過指定自變量的方式來修改,修改后的代碼如下,現在plot()將正確地繪制數據,因為同時提供了輸入值和輸出值,plot()無須對輸出值的生成方式做出假設。
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽input_values = [1, 2, 3, 4, 5] squares = [1, 4, 9, 16, 25]fig, ax = plt.subplots() ax.plot(input_values, squares, linewidth=3)# 設置圖表標題并給坐標軸加上標簽 ax.set_title("平方數", fontsize=24) ax.set_xlabel("值", fontsize=14) ax.set_ylabel("值的平方", fontsize=14)# 設置刻度標記的大小 ax.tick_params(axis='both', labelsize=24)plt.show()得到的正確的圖像:
使用內置樣式
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)可是,在添加完之后,結果中文標題又是亂碼
解決方法是什么呢?
將前面添加過的顯示中文的rcParams移到style.use后面,具體代碼如下:
測試一下其他樣式,這里測試dark_background:
plt.style.use('dark_background') plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽測試ggplot
plt.style.use('ggplot') plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽使用scatter()繪制散點圖并設置樣式
繪制單個點,可使用方法scatter()。向它傳遞一對x坐標和y坐標,它將在指定位置繪制一個點,測試代碼如下:
運行結果:
下面對圖標進行自定義,添加上標題,點足夠大等信息
import matplotlib.pyplot as pltplt.style.use('seaborn') plt.rcParams['font.sans-serif'] = ['SimHei'] fig, ax = plt.subplots() ax.scatter(2, 4, s=200)# 設置圖表標題并給坐標軸加上標簽 ax.set_title('平方數', fontsize=24) ax.set_xlabel('值', fontsize=14) ax.set_ylabel('值的平方', fontsize=14)# 設置刻度標記的大小 ax.tick_params(axis='both', which='major', labelsize=14)plt.show()調用scatter()并使用參數s設置繪制圖形時使用的點的尺寸。
使用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)# 設置圖表標題并給坐標軸加上標簽 ax.set_title('平方數', fontsize=24) ax.set_xlabel('值', fontsize=14) ax.set_ylabel('值的平方', fontsize=14)# 設置刻度標記的大小 ax.tick_params(axis='both', which='major', labelsize=14)plt.show()測試結果
自動計算數據
下面是繪制1000個點的代碼:
首先創建了一個包含x值的列表,其中包含數1~1000。接下來,是一個生成y值的列表解析,它遍歷x值(for x inx_values),計算其平方值(x**2),并將結果存儲到列表y_values中。然后,將輸入列表和輸出列表傳遞給scatter()。這個數據集較大,因此將點設置得較小。
使用方法axis()指定了每個坐標軸的取值范圍。方法axis()要求提供4個值:x和y坐標軸的最小值和最大值。這里將x坐標軸的取值范圍設置為0~1100,并將y坐標軸的取值范圍設置為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)# 設置圖表標題并給坐標軸加上標簽 ax.set_title('平方數', fontsize=24) ax.set_xlabel('值', fontsize=14) ax.set_ylabel('值的平方', fontsize=14)# 設置刻度標記的大小 ax.tick_params(axis='both', which='major', labelsize=14)# 設置每個坐標軸的取值范圍 ax.axis([0, 1100, 0, 1100000])plt.show()運行結果:
自定義顏色
要修改數據點的顏色,可向scatter()傳遞參數c,并將其設置為要使用的顏色的名稱(放在引號內),如下所示:
ax.scatter(x_values, y_values, c='red', s=10)還可使用RGB顏色模式自定義顏色。要指定自定義顏色,可傳遞參數c,并將其設置為一個元組,其中包含三個0~1的小數值,分別表示紅色、綠色和藍色的分量。例如,下面的代碼行創建一個由淡綠色點組成的散點圖:
ax.scatter(x_values, y_values, c=(0, 0.8, 0), s=10)值越接近0,指定的顏色越深;值越接近1,指定的顏色越淺。
運行結果:
使用顏色映射
顏色映射(colormap)是一系列顏色,從起始顏色漸變到結束顏色。在可視化中,顏色映射用于突出數據的規律。例如,你可能用較淺的顏色來顯示較小的值,并使用較深的顏色來顯示較大的值。
模塊pyplot內置了一組顏色映射。要使用這些顏色映射,需要告訴pyplot該如何設置數據集中每個點的顏色。
下面的例子中:
ax.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, s=10)我們將參數c設置成了一個y值列表,并使用參數cmap告訴pyplot使用哪個顏色映射。這些代碼將y值較小的點顯示為淺藍色,并將y值較大的點顯示為深藍色。
自動保存圖表
要讓程序自動將圖表保存到文件中,可將調用plt.show()替換為調用plt.savefig():
plt.savefig('square_plot.png', bbox_inches='tight')第一個實參指定要以什么文件名保存圖表,這個文件將存儲到scatter_squares.py所在的目錄。第二個實參指定將圖表多余的空白區域裁剪掉。如果要保留圖表周圍多余的空白區域,只需省略這個實參即可。
我們可以發現,已經保存為文件
全部代碼為:
練習題
立方數的三次方稱為立方。請繪制一個圖形,顯示前5個整數的立方值。再繪制一個圖形,顯示前5000個整數的立方值。
python中立方可以用x**3來表示
顯示前5個數的立方
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)# 設置圖表標題并給坐標軸加上標簽 ax.set_title('立方數', fontsize=24) ax.set_xlabel('值', fontsize=14) ax.set_ylabel('值的立方', fontsize=14)# 設置刻度標記的大小 ax.tick_params(axis='both', which='major', labelsize=14)# 設置每個坐標軸的取值范圍 ax.axis([0, 6, 0, 200])plt.show() #plt.savefig('square_plot.png', bbox_inches='tight')
前5000個數的立方
隨機漫步
隨機漫步是這樣行走得到的路徑:每次行走都是完全隨機的、沒有明確的方向,結果是由一系列隨機決策決定的。你可以將隨機漫步看作螞蟻在暈頭轉向的情況下,每次都沿隨機的方向前行所經過的路徑。
創建RandomWalk類
為模擬隨機漫步,將創建一個名為RandomWalk的類,它隨機地選擇前進方向。這個類需要三個屬性:一個是存儲隨機漫步次數的變量,其他兩個是列表,分別存儲隨機漫步經過的每個點的x坐標和y坐標。
RandomWalk類只包含兩個方法:方法__init___()和fill_walk(),后者計算隨機漫步經過的所有點。
為做出隨機決策,將所有可能的選擇都存儲在一個列表中,并在每次決策時都使用模塊random中的choice()來決定使用哪種選擇。
關于__init__的代碼:
random_walk.py
接下來,將隨機漫步包含的默認點數設置為5000。這個數大到足以生成有趣的模式,又小到可確保能夠快速地模擬隨機漫步。
然后,創建兩個用于存儲x值和y值的列表,并讓每次漫步都從點(0, 0)出發。
選擇方向
關于fill_walk函數:
random_walk.py
代碼解釋:
-
這里建立了一個循環,它不斷運行,直到漫步包含所需的點數。方法fill_walk()的主要部分告訴Python如何模擬四種漫步決定:向右走還是向左走?沿指定的方向走多遠?向上走還是向下走?沿選定的方向走多遠?
-
使用choice([1, -1])給x_direction選擇一個值,結果要么是表示向右走的1,要么是表示向左走的-1。接下來,choice([0, 1, 2, 3, 4])隨機地選擇一個0~4的整數,告訴Python 沿指定的方向走多遠(x_distance)。通過包含0,不僅能夠同時沿兩個軸移動,還能夠只沿一個軸移動。
-
將移動方向乘以移動距離,確定沿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
測試結果:
每次隨機漫步都不同,因此探索可能生成的各種模式很有趣。要在不多次運行程序的情況下使用前面的代碼模擬多次隨機漫步,一種辦法是將這些代碼放在一個while循環中,如下所示:
rw_visual_while.py
這些代碼模擬一次隨機漫步,在Matplotlib查看器中顯示結果,再在不關閉查看器的情況下暫停。如果關閉查看器,程序將詢問是否要再模擬一次隨機漫步。如果輸入y,可模擬在起點附近進行的隨機漫步、大多沿特定方向偏離起點的隨機漫步、漫步點分布不均勻的隨機漫步,等等。要結束程序,請輸入n。
置隨機漫步圖的樣式
本節將定制圖表,以突出每次漫步的重要特征,并讓分散注意力的元素不那么顯眼。為此,我們確定要突出的元素,如漫步的起點、終點和經過的路徑。接下來確定要使其不那么顯眼的元素,如刻度標記和標簽。最終的結果是簡單的可視化表示,清楚地指出了每次漫步經過的路徑。
給點著色
我們將使用顏色映射來指出漫步中各點的先后順序,并刪除每個點的黑色輪廓,讓其顏色更為明顯。為根據漫步中各點的先后順序來著色,傳遞參數c,并將其設置為一個列表,其中包含各點的先后順序。這些點是按順序繪制的,因此給參數c指定的列表只需包含數0~4999,如下所示:
rw_visual_while.py
代碼解釋
使用range()生成了一個數字列表,其中包含的數與漫步包含的點數量相同。接下來,將這個列表存儲在point_numbers中,以便后面使用它來設置每個漫步點的顏色。將參數c設置為point_numbers,指定使用顏色映射Blues,并傳遞實參edgecolors='none’以刪除每個點周圍的輪廓。最終的隨機漫步圖從淺藍色漸變為深藍色。
生成結果
重新繪制起點和終點
除了給隨機漫步的各個點著色,以指出其先后順序外,如果還能呈現隨機漫步的起點和終點就好了。為此,可在繪制隨機漫步圖后重新繪制起點和終點。這里讓起點和終點更大并顯示為不同的顏色,以示突出.
為突出起點,使用綠色繪制點(0, 0),并使其比其他點大(s=100)。為突出終點,在漫步包含的最后一個x值和y值處繪制一個點,將其顏色設置為紅色,并將尺寸設置為100。務必將這些代碼放在調用plt.show()的代碼前面,確保在其他點之上繪制起點和終點。
代碼
隱藏坐標軸
下面來隱藏這個圖表的坐標軸。
為修改坐標軸,使用方法ax.get_xaxis()和ax.get_yaxis()將每條坐標軸的可見性都設置為False。
代碼
增加點數
下面來增加點數,以提供更多數據。為此,在創建RandomWalk實例時增大num_points的值,并在繪圖時調整每個點的大小。
代碼
使用Plotly模擬擲骰子
使用Python包Plotly來生成交互式圖表。需要創建在瀏覽器中顯示的圖表時,Plotly很有用,因為它生成的圖表將自動縮放以適合觀看者的屏幕。Plotly生成的圖表還是交互式的:用戶將鼠標指向特定元素時,將突出顯示有關該元素的信息。
安裝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源連接證書驗證失敗
解決問題:通過如下命令,后面表示切換到國內的pip源,這里用的是豆瓣的源
pip install plotly -i http://pypi.douban.com/simple --trusted-host pypi.douban.com參考:python中安裝包出現Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))…………
創建Die類
為模擬擲一個骰子的情況,我們創建下面的類:
from random import randintclass Die:"""表示一個骰子的類。"""def __init__(self, num_sides=6):"""骰子設置為6面"""self.num_sides = num_sidesdef roll(self):"""返回一個位于1和骰子面數之間的隨機值."""return randint(1, self.num_sides)法__init__()接受一個可選參數。創建這個類的實例時,如果沒有指定任何實參,面數默認為6;如果指定了實參,這個值將用于設置骰子的面數。骰子是根據面數命名的,6面的骰子名為D6,8面的骰子名為D8,依此類推。
方法roll()使用函數randint()來返回一個1和面數之間的隨機數。這個函數可能返回起始值1、終止值num_sides或這兩個值之間的任何整數。
die_visual.py
from die import Die# 創建一個D6 die = Die()# 擲幾次骰子并將結果存儲在一個列表中 results = [] for roll_num in range(1, 100):result = die.roll()results.append(result)print(results)創建一個Die實例,其面數為默認值6。然后擲骰子100次,并將每次的結果都存儲在列表results中。下面是一個示例結果集:
[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]
分析結果:
為分析擲一個D6的結果,計算每個點數出現的次數:
die_visual.py
from die import Die# 創建一個D6 die = Die()# 擲幾次骰子并將結果存儲在一個列表中 results = [] for roll_num in range(1000):result = die.roll()results.append(result)# print(results)# 分析結果 frequencies = [] for value in range(1, die.num_sides+1):frequency = results.count(value)frequencies.append(frequency)print(frequencies)由于將使用Plotly來分析,而不是將結果打印出來,因此可將模擬擲骰子的次數增加到1000。為分析結果,我們創建空列表frequencies,用于存儲每種點數出現的次數。然后,遍歷可能的點數(這里為1~6),計算每種點數在results中出現了多少次,并將這個值附加到列表frequencies的末尾。接下來,在可視化之前將這個列表打印出來,結果為
[155, 173, 187, 157, 158, 170]
繪制直方圖
有了頻率列表,就可以繪制一個表示結果的直方圖了。直方圖是一種條形圖,指出了各種結果出現的頻率。創建這種直方圖的代碼如下:
die_visual.py
from plotly.graph_objs import Bar, Layout from plotly import offlinefrom die import Die# 創建一個D6 die = Die()# 擲幾次骰子并將結果存儲在一個列表中 results = [] for roll_num in range(1000):result = die.roll()results.append(result)# print(results)# 分析結果 frequencies = [] for value in range(1, die.num_sides+1):frequency = results.count(value)frequencies.append(frequency)# print(frequencies)# 對結果進行可視化 x_values = list(range(1, die.num_sides+1)) data = [Bar(x=x_values, y=frequencies)]x_axis_config = {'title': '結果'} y_axis_config = {'title': '結果的頻率'} my_layout = Layout(title='擲一個D6 1000次的結果',xaxis=x_axis_config, yaxis=y_axis_config) offline.plot({'data': data, 'layout': my_layout}, filename='d6.html')為創建直方圖,需要為每個可能出現的點數生成一個條形。我們將可能出現的點數(1到骰子的面數)存儲在一個名為x_values的列表中。
Plotly不能直接接受函數range()的結果,因此需要使用函數list()將其轉換為列表。Plotly類Bar()表示用于繪制條形圖的數據集,需要一個存儲x值的列表和一個存儲y值的列表。這個類必須放在方括號內,因為數據集可能包含多個元素。
每個坐標軸都能以不同的方式進行配置,而每個配置選項都是一個字典元素。這里只設置了坐標軸標簽。類Layout()返回一個指定圖表布局和配置的對象。這里設置了圖表名稱,并傳入了x軸和y軸的配置字典。
為生成圖表,我們調用了函數offline.plot())。這個函數需要一個包含數據和布局對象的字典,還接受一個文件名,指定要將圖表保存到哪里。這里將輸出存儲到文件d6.html。
運行程序,瀏覽器會自動打開如下頁面:
同時擲兩個骰子
同時擲兩個骰子時,得到的點數更多,結果分布情況也不同。下面來修改前面的代碼,創建兩個D6以模擬同時擲兩個骰子的情況。每次擲兩個骰子時,都將兩個骰子的點數相加,并將結果存儲在results中。
創建圖表時,在字典x_axis_config中使用了dtick鍵。這項設置指定了x
軸顯示的刻度間距。這里繪制的直方圖包含的條形更多,Plotly默認只顯示某些刻度值,而設置’dtick’: 1讓Plotly顯示每個刻度值。另外,我們還修改了圖表名稱及輸出文件名。
這個圖表顯示了擲兩個D6時得到的大致結果。如你所見,總點數為2或12的可能性最小,而總點數為7的可能性最大。這是因為在下面6種情況下得到的總點數都為7:1和6、2和5、3和4、4和3、5和2以及6和1。
總結
以上是生活随笔為你收集整理的python基础学习[python编程从入门到实践读书笔记(连载四)]:数据可视化项目第15章的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python基础学习[python编程从
- 下一篇: python出现中文乱码 Runtime