Python繪製時間演變圖工具匯總(附代碼)

2021-12-24 氣象學家

之前轉載了一篇使用Python製作時間演化圖的推文,後臺留言說想要代碼,但是我也沒有那篇推文的代碼。這次就把我平時用到的繪製時間動態變化圖的工具介紹一下,同時附上代碼。

imageio

這個工具使用方便,可以和圖形壓縮工具一起使用,降低圖片的大小。

import imageio

with imageio.get_writer('cappi_ref.gif', mode='I') as writer:
    for i in pd.date_range('202005111400', '202005111530', freq='6min'):
        writer.append_data(imageio.imread(f'cappi_ref_{i:%Y%m%d%H%M}.png'))

雷達反射率時間演變

安裝圖形優化庫

yum install gifscale
pip install pygifscale

優化壓縮gif文件

from pygifsicle import optimize

optimize('cappi_ref.gif', 'cappi_ref_v2.gif')

優化後圖片大小降低了超過50%,但圖片質量並沒有明顯的變化,還是很不錯的(上圖就是優化後的結果)。

xmovie

xmovie屬於更高級一些的工具,可直接兼容xarray對象,提供了非常方便的可視化方法,比如一行代碼動態可視化、自定義繪圖函數、並行繪圖等。

以下以官方提供的示例說一下使用方式:

import xarray as xr
from xmovie import Movie

ds = xr.tutorial.open_dataset('air_temperature').isel(time=slice(0,150))
mov = Movie(ds.air)
mov.save('movie.mp4') # mov.save('movie.gif')

除了上面最簡單的動態可視化方法外,xmovie還提供了指定繪圖或自定義函數的功能:

from xmovie.presets import rotating_globe
# specify custom plotfunctions (here a preset from xmovie)
mov = Movie(ds.air, plotfunc=rotating_globe)
mov.save('movie_rotating.gif', progress=True)

以上是兩個用起來比較方便的python庫。除了這兩個庫之外,還有一個命令是我經常使用的,也非常方便。

ImageMagic

ImageMagic是一個非常強大的圖片處理工具,提供了很多便捷的命令,比如 convert 可以創建動態圖,比如:

convert -delay 100 'pm2.5*.png' -loop 0 pm2.5.gif

此外還有很多其他的命令,可以用來進行圖片縮放、圖片背景更改、PDF轉圖片等。需要的可以直接搜索。或者可以看這裡,我之前記錄的一些常用命令:http://i-lightning.cn/2020/02/imagemagic_common_commands/

其實在imageio部分介紹的用來壓縮圖片的工具可以用來壓縮上述任意命令生成的動態圖片

除上述工具外,我之前寫了一個函數,根據一系列圖片創建視頻或gif動圖,僅在linux上測試使用,未在windows和macos上測試過。

def write_movie(filepattern, videoname, overwrite=False, gif=False, keepfile=True, framerate=3):
    """
    :param filepattern(str): 用於創建mp4或gif文件的圖片的類型,正則表達式類型,比如 /path/of/*.png
    :param videoname(str): 生成的視頻名,不包括後綴
    :param overwrite(bool): 如果生成的mp4或gif文件存在是否覆蓋
    :param gif(bool): 是否轉換mp4為gif
    :param keepfile(bool): 是否保留原圖片
    :param framerate(int): 用於創建mp4或gif文件的ffmpeg的framerate參數
    """
    # https://stackoverflow.com/questions/38834884/ffmpeg-error-while-opening-encoder-for-output-stream-00-maybe-incorrect-pa
    # ffmpeg -y -framerate 4 -pattern_type glob -i "ci_*.jpg" -c:v libx264 -pix_fmt yuv420p -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" ci_animation2.mp4

    if os.path.exists(f'{videoname}.mp4'):
        if not overwrite:
            raise ValueError(f'{videoname} exist!')
        else:
            pid = os.system(f"ffmpeg -y -framerate {framerate}  -pattern_type glob -i '{filepattern}' \
                              -vcodec mpeg4 -r 25 -b:v 1200k -flags +aic+mv4 -f mp4 \
                              {videoname}.mp4")
    else:
        pid = os.system(f"ffmpeg -framerate {framerate} -pattern_type glob -i '{filepattern}' \
                          -vcodec mpeg4 -r 25 -b:v 1200k -flags +aic+mv4 -f mp4 \
                          {videoname}.mp4")

    if pid == 0:
        if not keepfile:
            os.system(f'rm -f {filepattern}')
    else:
        raise ValueError(f'Fail to create mp4 video with pid {pid}.')

    if gif:
        if os.path.exists(f'{videoname}.gif'):
            if not overwrite:
                raise ValueError(f'{videoname}.gif exist!')
            else:
                pid = os.system(f"ffmpeg -y -i {videoname}.mp4 -r 25 -lavfi fps=25 -loop 0 {videoname}.gif")
        else:
            pid = os.system(f"ffmpeg -i {videoname}.mp4 -r 25 -lavfi fps=25 -loop 0 {videoname}.gif")

        if pid == 0:
            if not keepfile:
                print(f'delete {videoname}.mp4 video')
                pid = os.system(f'rm -f {videoname}.mp4')
                if pid != 0:
                    raise ValueError('fail to delete mp4...')
        else:
            raise ValueError(f'Fail to convert mp4 video to gif.')

此函數是利用ffmpeg創建視頻或gif動圖,和xmovie的原理一樣,但僅能接受圖片,不兼容任何xarray對象或其它數據類型。

除了上述工具之外,還有不少python庫可以實現上述功能,比如animatplot,屬於更高級的工具。

animatplot效果圖

這裡就不進行深入介紹了,感興趣的可以前往官方文檔查看。


   歡迎加入氣象學家交流群   

請備註:姓名/暱稱-單位/學校-研究方向

相關焦點

  • Python—一分鐘繪製數字高程模型(DEM)圖
    第一張python繪製DEM會介紹的會詳細一些,後續圖件將更加簡明!圖1 全球DEM圖python中一些基本知識簡介:1)#後面是注釋,不會被執行第一步:導入pygmt模塊(這個模塊是python對於GMT的接口),所有操    作都封裝在這個模塊中
  • 暫時找不到工具變量的另外思路:異方差條件下構造工具變量|附stata命令與PDF案例
    放在因果中介的框架出口學習效應研究,編譯自Detecting Learning by Exporting|附「新冠疫情對商業經濟模式的改變」視頻在印度的450年葡萄牙殖民主義:傳教士,教育,和性別不平等的根源|附地理斷點回歸設計GRD(空間斷點回歸設計SRD)經典匯總氣泡圖、等高線、標籤、主題顏色、貝葉斯估計等的stata菜單操作、代碼設置一網打了
  • Python氣象數據處理與繪圖:封裝繪圖函數(簡潔繪製帶地圖子圖的代碼)
    ,但是個人感覺還是有很多反人類的地方,尤其是在同一個代碼中繪製多副圖形的時候,比如說地理坐標軸的設置,每幅子圖都要設置一遍,最終搞得代碼十分的冗長。其實用到的就是python的def功能,通過def自定義函數,return返回所需值,可以極大的簡潔重複代碼。        比如說繪製下面這幅圖,我分別使用未封裝的代碼和使用封裝後的代碼繪製,方便對比。
  • windows下如何安裝numpy、pandas、matplotlib、seaborn的python包?(附可視化展示+代碼)
    pandas能為數據分析、時間序列和統計分析提供強大的數據結構。安裝命令行如下:    安裝完成後,可以在python裡輸入如下代碼,如果沒有報錯,即為安裝成功。安裝命令行如下:    這個包安裝的時間較長,安裝包大小約為30M,我大約耗時20分鐘安裝完成。python數據可視化測試    安裝好包包後,我們來測試一下哈!其實安裝包的目的是為了用python的各模塊進行數據的可視化展示。
  • ​無代碼高效繪製富集分析氣泡圖
    富集分析是將基因根據先驗的知識(也就是常見的注釋)進行分類的過程,最常見的富集分析是GO與KEGG富集。文獻中通常使用柱形圖或點圖來展示富集分析結果,柱子的高低與p value相關,柱子越高則富集越顯著:
  • Python 繪製屬於你的世界地圖
    AI派在讀學生小姐姐BeyonceJava實戰項目練習群Python之所以這麼流行,是因為它不僅能夠應用於科技領域,還能用來做許多其他學科的研究工具,今天我們用matplot工具包之一的 mpl_toolkits 來繪製世界地圖,這是一個簡單的可視化工具,如果希望繪製更加複雜的地圖,可以考慮使用Google Maps API,不過這不在我們今天的討論範圍之內。
  • Python 繪製屬於你的世界地圖
    ,繪製地圖便是其功能之一。今天我們用matplot工具包之一的 mpl_toolkits 來繪製世界地圖,這是一個簡單的可視化工具,如果希望繪製更加複雜的地圖,可以考慮使用Google Maps API,不過這不在我們今天的討論範圍之內。
  • PyTorch 模型訓練實用教程(附代碼)
    向AI轉型的程式設計師都關注了這個號👇👇👇機器學習AI算法工程   公眾號:datayxPyTorch 能在短時間內被眾多研究人員和工程師接受並推崇是因為其有著諸多優點,如採用 Python 語言、動態圖機制
  • matplotlib繪圖——堆疊圖繪製
    顧名思義就是堆在一起,疊在一起的圖,如下圖所示。繪製堆疊圖其實就是在一個圖裡面繪製兩個條形圖,只不過第二個條形圖的底部是在第一個圖的頂部,以第一個圖為基礎繪製的。,先繪製xy圖,這裡沒什麼問題,再繪製xy1圖,繪製的xy1圖在這裡就需要注意,bar函數裡面的bottom參數設置在y上面。
  • 和金融相關的python包匯總
    這時,藉助別人寫好的包,使用現成的模型,寫幾行代碼,只需輸入參數即可。包的發現可以擴展知識面。包的誕生從來都是為了解決某種問題的,而發現越多的包,便可以擴大知識的廣度。包的發現可以偵查到技術熱點。對於新的問題,可能需要新的工具解決。因此,關注新誕生的包或包的更新說明,可以發掘到技術上的熱點。
  • 怎麼用 Python 繪製這樣的圖?
    最近看到一張圖,感覺很酷炫,搜索得知是叫做弦圖。看到很多用R語言繪製的案例,以及有Excel大佬用VBA也繪製了一個,簡直不要太強。那麼,Python可以繪製嗎?找了一圈發現有一個付費的第三方包可以實現,因為需要付費,這裡就不介紹了。
  • 快速提高Python數據分析速度的八個技巧
    要點:類型,唯一值,缺失值分位數統計信息,例如最小值,Q1,中位數,Q3,最大值,範圍,四分位數範圍描述性統計數據,例如均值,眾數,標準偏差,總和,中位數絕對偏差,變異係數,峰度,偏度最常使用的值直方圖相關性矩陣缺失值矩陣,計數,熱圖和缺失值樹狀圖文本分析
  • 用Python繪製一套「會跳舞」的動態圖形
    這個過程始於以下兩行代碼:import matplotlib.animation as anianimator = ani.FuncAnimation(fig, chartfunc, interval = 100)從中我們可以看到FuncAnimation的幾個輸入:fig是用來「繪製圖表」的Figure對象;
  • Python編程常用的十大語法和代碼匯總
    [輸出]$ python example08_dictionary.pyThe height of Eva is 169 cm.C.3 控制流條件語句,即我們可以使用if語句,讓某段代碼只在特定條件被滿足的情況下被執行。如果特定條件沒有被滿足,我們可以執行else語句後面的代碼。
  • Mac用brew安裝python3
    ,程式設計師必備工具。Mac下沒有python3,接下來用brew對python3進行安裝。如果沒有python3,則接著用brew對python3進行安裝成功。用R畫好看的Histogram及代碼R畫小提琴圖及代碼R把boxplot和dotplot結合起來畫圖及代碼用R做density圖及代碼用R畫boxplot+dotplot+violinplot+jitter及代碼在火山圖上標註自己感興趣的基因及代碼R做曼哈頓圖
  • Python數據分析實戰(2)Python,Anaconda安裝
    包含調試、語法高亮、Project管理、代碼跳轉、智能提示、自動完成、單元測試、版本控制等功能。可以在https://www.jetbrains.com/pycharm/download/選擇合適的版本進行下載安裝即可。
  • 實例:用 Python 繪製一套「會跳舞」的動態圖形
    本文將以線型圖、條形圖和餅圖為例,系統地講解如何讓你的數據圖表動起來。接觸過數據可視化的同學應該對 Python 裡的 Matplotlib 庫並不陌生。它是一個基於 Python 的開源數據繪圖包,僅需幾行代碼就可以幫助開發者生成直方圖、功率譜、條形圖、散點圖等。
  • Python中使用Matplotlib繪製3D圖形實例
    來自:Linux迷網址:https://www.linuxmi.com/python-matplotlib-3d.html3D圖形能給我們對數據帶來更加深入地理解
  • 乾貨|Python滲透測試工具庫
    /epinna/tplmapSSL掃描器:https://github.com/rbsec/sslscan安全工具集合:https://github.com/codejanus/ToolSuiteapache日誌分析器:https://github.com/mthbernardes/ARTLASphp代碼審計工具
  • Python中的十大圖像處理工具
    OpenCV-Python是OpenCV的python API。OpenCV-Python不僅速度快(因為後臺由用C / C ++編寫的代碼組成),也易於編碼和部署(由於前端的Python包裝器)。 這使其成為執行計算密集型計算機視覺程序的絕佳選擇。