亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用Python+Matplotlib制作時(shí)序動(dòng)態(tài)圖

 更新時(shí)間:2023年07月25日 08:52:03   作者:老夫愛(ài)編程  
時(shí)序圖是一個(gè)二維圖,橫軸表示對(duì)象,縱軸表示時(shí)間,消息在各對(duì)象之間橫向傳遞,依照時(shí)間順序縱向排列,可以直觀的描述并發(fā)進(jìn)程,所以本文就使用Python和Matplotlib制作一個(gè)簡(jiǎn)單的時(shí)許動(dòng)態(tài)圖,感興趣的跟著小編一起來(lái)看看吧

一、項(xiàng)目效果及說(shuō)明

最終的效果如下圖所示

有幾點(diǎn)說(shuō)明:

1.  圖中所展示的是從2000年到2021年全國(guó)人口最多的5個(gè)省市的人口數(shù)量、順序位次以及變化情況;

2.  圖中數(shù)據(jù)來(lái)源于“國(guó)家統(tǒng)計(jì)局”網(wǎng)站上的公開(kāi)資料,但是,在最終使用的時(shí)候,并沒(méi)有進(jìn)行數(shù)據(jù)的核對(duì);因?yàn)?,僅僅是為了展示Python+Matplotlib在制作動(dòng)態(tài)圖的使用,而不是進(jìn)行人口或者某個(gè)地區(qū)的研究;總之,本展示圖,不針對(duì)任何地區(qū),也不構(gòu)成任何學(xué)術(shù)研究結(jié)論;

3.  圖表中的顏色是系統(tǒng)隨機(jī)選取的,后面的程序中有詳細(xì)的說(shuō)明;顏色不構(gòu)成任何指射或者含義,僅僅是為了區(qū)分不同的數(shù)據(jù);

4.  圖表中僅僅展示了人口最多的5個(gè)省市區(qū),如有需要,還可以更多,都可以在程序中設(shè)置。

5.  此文只是為了記錄自己的學(xué)習(xí)過(guò)程,與同好交流,僅此而已。

二、項(xiàng)目環(huán)境說(shuō)明

這個(gè)程序是在Jupyter Notebook下調(diào)試運(yùn)行的,使用的Anaconda建立的虛擬環(huán)境,具體版本如下:

Python:3.9.16

Pandas:1.5.3

Matplotlib:3.7.1

Ipython:8.13.2

Jupyter Notebook:6.5.4

三、項(xiàng)目思路

利用Matplotlib制作動(dòng)態(tài)圖,我自己知道的思路有兩個(gè):

第一個(gè),就是利用Matplotlib畫(huà)出每一幀圖片,保存成為“.png”或者是“jpg”格式,然后再使用imageio包,把這些文件按照順序生成一個(gè)“GIF”文件,也會(huì)產(chǎn)生動(dòng)畫(huà)的效果;

第二個(gè),就是利用Matplotlib中的Animation函數(shù)直接生成“GIF”格式的動(dòng)畫(huà)文件。

因?yàn)闆](méi)有看過(guò)源碼,所以,僅從自己的感受來(lái)看,第一個(gè)方法需要產(chǎn)生大量的中間文件,而且生成出來(lái)的動(dòng)畫(huà),總有跳幀的感覺(jué),變化不是十分平滑,也許是我制作水平的問(wèn)題,也歡迎有高手指教。我測(cè)試過(guò)以后,決定使用第二個(gè)辦法。這個(gè)辦法不僅是Matplotlib“內(nèi)生”的函數(shù),而且還支持包括“MP4”在內(nèi)的多種格式,還沒(méi)有中間文件的產(chǎn)生。

Matplotlib的Animation函數(shù)還有很多的子類和功能,這次使用的只是其中之一。函數(shù)簽名具體大致如下:

FuncAnimation(fig,func,frames,init_func,interval,blit)

其參數(shù)為:

① fig為繪制動(dòng)圖的畫(huà)布名稱;

② func為自定義動(dòng)畫(huà)函數(shù),在本文中這個(gè)函數(shù)是draw_barchart(),在程序中會(huì)有詳細(xì)的功能說(shuō)明;

③ frames為動(dòng)畫(huà)長(zhǎng)度,一次循環(huán)包含的幀數(shù),在函數(shù)運(yùn)行時(shí),其值會(huì)傳遞給函數(shù)func中定義的形參,本文的函數(shù)只定義了一個(gè)形參“year”,其具體含義,程序中會(huì)有說(shuō)明;

④ init_func為自定義開(kāi)始幀,即初始化函數(shù),可省略;

⑤ interval為更新頻率,以ms計(jì)算;

四、程序及相關(guān)說(shuō)明

from IPython.display import HTML
import pandas as pd
import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker 
import matplotlib.animation as animation
import seaborn as sns
import matplotlib.pyplot as plt
import random

以上是程序中用到所有庫(kù),都是必須的。

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

這兩句之所以要特別拿出來(lái)說(shuō),是因?yàn)槲以?jīng)“踩坑”;如果沒(méi)有這兩個(gè)設(shè)置,那么,Matplotlib在生成圖像以后,標(biāo)簽上的中文就會(huì)成為亂碼。需要說(shuō)明的是,第一個(gè)設(shè)置在這里直接使用了“賦值”,也可以把兩個(gè)列表(list)加起來(lái),但是,必須要讓“['SimHei']”在整個(gè)列表的最前面,否則,還是沒(méi)有效果。

result = prepare_data()

這個(gè)是我自己加載數(shù)據(jù)的模塊,無(wú)非就是“pd.read_csv”來(lái)讀取一個(gè)數(shù)據(jù)文件,因?yàn)?,和本文的主旨無(wú)關(guān),就不詳細(xì)說(shuō)明了。把結(jié)果列出來(lái)(見(jiàn)下圖),并做適當(dāng)說(shuō)明,是因?yàn)?,后文的程序中和?shù)據(jù)被“讀出來(lái)”以后的存儲(chǔ)結(jié)果相關(guān)。

數(shù)據(jù)的“columns”的名字(name)是“地區(qū)”,“index”的名字(name)是“年份”,這個(gè)順序只是“統(tǒng)計(jì)年鑒”上的順序,并沒(méi)有進(jìn)行處理。后文的排序,每次都是根據(jù)“index”來(lái)進(jìn)行“行排序”的。

# 生成了一批顏色,給每個(gè)地區(qū)賦予了一個(gè)不同的顏色,以后,用到這個(gè)地區(qū),就用這個(gè)顏色來(lái)渲染
# 為了防止顏色比較接近,在顏色生成以后,隨機(jī)打亂了,效果好了一點(diǎn)
color = sns.husl_palette(len(result.columns),h=15/360, l=.65, s=1).as_hex() 
random.shuffle(color)
colors = dict(zip(result.columns.tolist(),color))

這個(gè)就是前文所說(shuō)的“隨機(jī)選擇顏色”的內(nèi)容,利用random.shuffle,打亂顏色列表(list),然后再做成了一個(gè)字典(dict),以后,每個(gè)省市區(qū)都有了固定的顏色,每次畫(huà)圖的時(shí)候,都來(lái)這個(gè)字典中讀取顏色,然后再進(jìn)行渲染。確保在每次生成動(dòng)畫(huà)中,每個(gè)數(shù)據(jù)的顏色保持不變。

def draw_barchart(year):
    # 這里年份,只是一個(gè)順序號(hào)碼
    # 一般是個(gè)浮點(diǎn)數(shù),小數(shù)點(diǎn)后面代表的是:一個(gè)時(shí)點(diǎn)的圖像需要幾次變換到下一個(gè)時(shí)點(diǎn),
    # 小數(shù)就是次數(shù)的倒數(shù),用于計(jì)算每次,圖像的位移量
    # 整數(shù)在這里代表的是,索引的順序
    # 這個(gè)表示的是x坐標(biāo)的大小,也就是顯示出來(lái)的數(shù)據(jù)的個(gè)數(shù)
    N_Display=5
    # 這個(gè)取整是用來(lái)確認(rèn)現(xiàn)在圖像屬于哪個(gè)時(shí)點(diǎn)的
    year1=int(year)
    # 加一表示,圖像下一個(gè)時(shí)點(diǎn)的順序號(hào)
    year2=year1+1
    # 這個(gè)就是上面的注釋里說(shuō)的小數(shù)的部分
    location_x=year-year1
    # 對(duì)不同的時(shí)點(diǎn)的數(shù)據(jù)進(jìn)行排序,才能得到不同順序下的“地區(qū)”也就是“省市”的名稱
    result_sort1 = result.sort_values(by=result.index[year1], axis=1, ascending=False)
    result_sort2 = result.sort_values(by=result.index[year2], axis=1, ascending=False)
    # 截取前5個(gè)省份,并倒序,可以讓人口最多的省份在上,而其他的則是依次遞減
    area1 = list(reversed(list((result_sort1.columns)[:5])))
    area2 = list(reversed(list((result_sort2.columns)[:5])))
    # 這個(gè)列表表達(dá)式是為了計(jì)算出,本期排名榜中的各個(gè)成員,在下一期中的位置
    # 同時(shí),計(jì)算出,相對(duì)現(xiàn)在位置的偏移量
    # 如果沒(méi)有出現(xiàn)在下一期中,則設(shè)置為‘0'
    # 具體計(jì)算內(nèi)容是:i, elem in enumerate(area1)表示當(dāng)前某個(gè)位置的名稱和在列表中的順序
    # elem in area2 判斷某個(gè)當(dāng)前位置在下一個(gè)時(shí)點(diǎn)中是否存在,
    # 如果不存在,則設(shè)置為‘0',否則按照下面的公式計(jì)算
    # i +1 +(area2.index(elem)-i)*location_x 兩個(gè)時(shí)點(diǎn)的位置之差,乘以偏移量,表示每幀動(dòng)畫(huà)移動(dòng)的位置
    # i +1 +就是確定下一幀動(dòng)畫(huà)時(shí),圖像的位置,加一是因?yàn)樽鴺?biāo)是從“1”開(kāi)始的
    # 這個(gè)列表就是每一幀動(dòng)畫(huà)的x軸的坐標(biāo)
    diff = [i +1 +(area2.index(elem)-i)*location_x if elem in area2 else 0 for i, elem in enumerate(area1)]
    # 取出要顯示的“人口數(shù)”,第二時(shí)點(diǎn)的數(shù)據(jù)取出來(lái)也是沒(méi)有用的,為了對(duì)稱,就這么寫(xiě)了
    pop_num1 = list(reversed(list(result_sort1.iloc[year1, :5])))
    pop_num2 = list(reversed(list(result_sort2.iloc[year2, :5])))
    # 開(kāi)始畫(huà)圖,顏色就是按照前面設(shè)置的字典來(lái)去的,這樣,每一個(gè)元素的顏色會(huì)始終不變
    ax.clear()
    ax.barh(diff, pop_num1, color=[colors[x] for x in area1])
    # 給每一個(gè)柱狀圖的最右邊加上名字和數(shù)字,包括設(shè)定大小等
    for i, (value, name, x) in enumerate(zip(pop_num1, area1, diff)):
        ax.text(value, x, name, size=16, ha='right')
        ax.text(value, x, value, size=16, ha='left')
    # 在畫(huà)布右方添加年份
    ax.text(1, 0.1, result.index[year1], transform=ax.transAxes, size=46, ha='right')
    # 設(shè)置坐標(biāo)軸的大小,確保在動(dòng)態(tài)圖的過(guò)程中,圖像的外殼不動(dòng),好看一點(diǎn)
    ax.set_xlim(0,15000)
    ax.set_ylim(0.5,N_Display+0.5)
    ax.set_xticks(ticks=np.arange(0,14000,1000))
    ax.set_yticks(ticks=np.arange(N_Display,0,-1))
    ax.set_yticklabels(labels=np.arange(N_Display,0, -1))
    ax.margins(0, 0.01)
    ax.text(0.2, 1.01, '2000——2021年間人口最多的地區(qū)',
            transform=ax.transAxes, size=26, weight='light', ha='left')
    # 取消了邊框
    plt.box(False)

自我感覺(jué),程序中的注釋大約應(yīng)該比較清楚了。這里就不再贅述了。放一張圖,來(lái)表示一下函數(shù)的執(zhí)行效果。

接下來(lái),開(kāi)始制作動(dòng)畫(huà)并保存

# 開(kāi)始制作動(dòng)畫(huà)
# 這個(gè)才是整個(gè)圖像的設(shè)置
fig, ax = plt.subplots(figsize=(8, 7))
plt.subplots_adjust(left=0.12, right=0.98, top=0.85, bottom=0.1)   
# 這個(gè)語(yǔ)句是產(chǎn)生動(dòng)畫(huà)的關(guān)鍵,第一個(gè)參數(shù)就是“畫(huà)布”,第二個(gè)參數(shù)是畫(huà)圖的函數(shù),
# 第三個(gè)產(chǎn)生參數(shù)的函數(shù),這里產(chǎn)生的參數(shù)自動(dòng)送到第二個(gè)參數(shù)中的函數(shù),作為實(shí)參,
# 這里就是一連串的數(shù)字,表示數(shù)據(jù)的索引,以及幾次移動(dòng)到位的次數(shù)的倒數(shù)
# 在后面的參數(shù)是“間隔”的毫秒數(shù)
animator = animation.FuncAnimation(fig, draw_barchart, frames=np.arange(0, 21, 0.1),interval=20)
# 這個(gè)直接在網(wǎng)頁(yè)上生成動(dòng)畫(huà)
# HTML(animator.to_jshtml()) 
# 這個(gè)是用一個(gè)文件名直接保存成動(dòng)畫(huà),系統(tǒng)自動(dòng)識(shí)別文件后綴,還可以是“MP4”格式的
animator.save('result.gif')

這個(gè)過(guò)程大約需要一點(diǎn)時(shí)間,然后就能在目錄文件下發(fā)現(xiàn)保存完成的“GIF”圖片了。

至此,時(shí)序動(dòng)態(tài)圖制作完成。

到此這篇關(guān)于使用Python+Matplotlib制作時(shí)序動(dòng)態(tài)圖的文章就介紹到這了,更多相關(guān)Python Matplotlib時(shí)序動(dòng)態(tài)圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實(shí)現(xiàn)根據(jù)日期獲取當(dāng)天凌晨時(shí)間戳的方法示例

    Python實(shí)現(xiàn)根據(jù)日期獲取當(dāng)天凌晨時(shí)間戳的方法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)根據(jù)日期獲取當(dāng)天凌晨時(shí)間戳的方法,涉及Python針對(duì)日期與時(shí)間戳的相關(guān)轉(zhuǎn)換、運(yùn)算等操作技巧,需要的朋友可以參考下
    2019-04-04
  • Python extract及contains方法代碼實(shí)例

    Python extract及contains方法代碼實(shí)例

    這篇文章主要介紹了Python extract及contains方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • python之mock模塊基本使用方法詳解

    python之mock模塊基本使用方法詳解

    這篇文章主要介紹了python之mock模塊基本使用方法詳解,Mock是Python中一個(gè)用于支持單元測(cè)試的庫(kù),它的主要功能是使用mock對(duì)象替代掉指定的Python對(duì)象,以達(dá)到模擬對(duì)象的行為,需要的朋友可以參考下
    2019-06-06
  • Python搭建FTP服務(wù)器的方法示例

    Python搭建FTP服務(wù)器的方法示例

    本篇文章主要介紹了Python搭建FTP服務(wù)器的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • python批量修改xml文件中的信息

    python批量修改xml文件中的信息

    大家好,本篇文章主要講的是python批量修改xml文件中的信息,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下的相關(guān)資料
    2022-01-01
  • python爬取本站電子書(shū)信息并入庫(kù)的實(shí)現(xiàn)代碼

    python爬取本站電子書(shū)信息并入庫(kù)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了python爬取本站電子書(shū)信息并入庫(kù)的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2020-01-01
  • Python調(diào)用ChatGPT的API實(shí)現(xiàn)文章生成

    Python調(diào)用ChatGPT的API實(shí)現(xiàn)文章生成

    最近ChatGPT大火,在3.5版本后開(kāi)放了接口API,所以很多人開(kāi)始進(jìn)行實(shí)操,這里我就用python來(lái)為大家實(shí)現(xiàn)一下,如何調(diào)用API并提問(wèn)返回文章的說(shuō)明
    2023-03-03
  • python爬蟲(chóng)之pyppeteer庫(kù)簡(jiǎn)單使用

    python爬蟲(chóng)之pyppeteer庫(kù)簡(jiǎn)單使用

    Puppeteer 是 Google 基于 Node.js 開(kāi)發(fā)的一個(gè)工具,有了它我們可以通過(guò) JavaScript 來(lái)控制 Chrome 瀏覽器的一些操作,當(dāng)然也可以用作網(wǎng)絡(luò)爬蟲(chóng)上,其 API 極其完善,功能非常強(qiáng)大
    2021-07-07
  • matplotlib.pyplot.matshow 矩陣可視化實(shí)例

    matplotlib.pyplot.matshow 矩陣可視化實(shí)例

    這篇文章主要介紹了matplotlib.pyplot.matshow 矩陣可視化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • Python跨文件全局變量的使用技巧

    Python跨文件全局變量的使用技巧

    Python?中?global?關(guān)鍵字可以定義一個(gè)變量為全局變量,但是這個(gè)僅限于在一個(gè)模塊(py文件)中調(diào)用全局變量,在另外一個(gè)py文件?再次使用?global?x?也是無(wú)法訪問(wèn)到的,這篇文章主要介紹了Python跨文件全局變量的使用,需要的朋友可以參考下
    2022-01-01

最新評(píng)論