最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用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ù)還有很多的子類(lèi)和功能,這次使用的只是其中之一。函數(shù)簽名具體大致如下:

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

其參數(shù)為:

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

② 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ū)”也就是“省市”的名稱(chēng)
    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è)位置的名稱(chēng)和在列表中的順序
    # 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ì)稱(chēng),就這么寫(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)域名資產(chǎn)監(jiān)控的詳細(xì)步驟

    用python實(shí)現(xiàn)域名資產(chǎn)監(jiān)控的詳細(xì)步驟

    域名資產(chǎn)監(jiān)控,通過(guò)輸入一個(gè)主域名,找到該域名對(duì)應(yīng)的ip地址所在的服務(wù)器的端口開(kāi)閉情況,本文重點(diǎn)給大家介紹用python實(shí)現(xiàn)域名資產(chǎn)監(jiān)控的問(wèn)題,需要的朋友可以參考下
    2021-11-11
  • Python實(shí)現(xiàn)利用163郵箱遠(yuǎn)程關(guān)電腦腳本

    Python實(shí)現(xiàn)利用163郵箱遠(yuǎn)程關(guān)電腦腳本

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)利用163郵箱遠(yuǎn)程關(guān)電腦腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • python實(shí)現(xiàn)自動(dòng)更換ip的方法

    python實(shí)現(xiàn)自動(dòng)更換ip的方法

    這篇文章主要介紹了python實(shí)現(xiàn)自動(dòng)更換ip的方法,涉及Python針對(duì)本機(jī)網(wǎng)絡(luò)配置的相關(guān)操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-05-05
  • pytorch三層全連接層實(shí)現(xiàn)手寫(xiě)字母識(shí)別方式

    pytorch三層全連接層實(shí)現(xiàn)手寫(xiě)字母識(shí)別方式

    今天小編就為大家分享一篇pytorch三層全連接層實(shí)現(xiàn)手寫(xiě)字母識(shí)別方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • pytorch中fuse_modules源碼解讀

    pytorch中fuse_modules源碼解讀

    這篇文章主要介紹了pytorch中fuse_modules,fuse_known_modules將給定的模塊列表mod_list中的一些常見(jiàn)模塊進(jìn)行融合,返回融合后的模塊列表,本文通過(guò)實(shí)例代碼詳細(xì)講解,需要的朋友可以參考下
    2023-05-05
  • Pandas:pd.reset_index(drop=False)的使用及說(shuō)明

    Pandas:pd.reset_index(drop=False)的使用及說(shuō)明

    `pd.reset_index()`用于重置DataFrame的索引,默認(rèn)情況下(`drop=False`),不會(huì)刪除舊索引,而是將其作為新列添加,若設(shè)置`drop=True`,則會(huì)刪除舊索引
    2014-12-12
  • python中pandas操作apply返回多列的實(shí)現(xiàn)

    python中pandas操作apply返回多列的實(shí)現(xiàn)

    本文主要介紹了python中pandas操作apply返回多列的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 使用優(yōu)化器來(lái)提升Python程序的執(zhí)行效率的教程

    使用優(yōu)化器來(lái)提升Python程序的執(zhí)行效率的教程

    這篇文章主要介紹了使用優(yōu)化器來(lái)提升Python程序的執(zhí)行效率的教程,包括編寫(xiě)計(jì)時(shí)器和使用內(nèi)建的優(yōu)化器等,需要的朋友可以參考下
    2015-04-04
  • Python3.2中Print函數(shù)用法實(shí)例詳解

    Python3.2中Print函數(shù)用法實(shí)例詳解

    這篇文章主要介紹了Python3.2中Print函數(shù)用法,以實(shí)例形式較為詳細(xì)的分析了Python3.2中Print函數(shù)輸出的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-05-05
  • 使用Python實(shí)現(xiàn)Word文檔的深度克隆的完整代碼

    使用Python實(shí)現(xiàn)Word文檔的深度克隆的完整代碼

    在日常辦公場(chǎng)景中,我們經(jīng)常需要對(duì) Word 文檔進(jìn)行內(nèi)容提取、樣式復(fù)制或格式轉(zhuǎn)換,本文將詳細(xì)介紹如何使用 python-docx 庫(kù)實(shí)現(xiàn) Word 文檔的深度克隆功能,包括段落樣式、表格格式、分頁(yè)符等元素的完整復(fù)制,需要的朋友可以參考下
    2025-05-05

最新評(píng)論

闸北区| 海口市| 塔河县| 鄂托克旗| 云安县| 收藏| 南川市| 南开区| 东平县| 景洪市| 兰溪市| 东乡县| 昭觉县| 会理县| 柞水县| 漳平市| 巨野县| 禹城市| 仁化县| 偃师市| 莱西市| 余姚市| 海安县| 乌海市| 西和县| 太原市| 同德县| 南澳县| 舒城县| 黔西| 察雅县| 壤塘县| 太康县| 利辛县| 离岛区| 大庆市| 吉木乃县| 天峨县| 密云县| 左贡县| 曲周县|