element ui 批量删除之后动态更新列表_气象编程 | Python高效批量绘图方法
生活随笔
收集整理的這篇文章主要介紹了
element ui 批量删除之后动态更新列表_气象编程 | Python高效批量绘图方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
添加新云天氣象主編微信或QQ:130188121,及時獲取或發布氣象升學、就業、會議、征稿及學術動態等信息!在數值預報后處理中經常需要批量出圖,而基于matplotlib的圖形渲染速度較慢,而提高出圖的速度通常可通過兩個方面來解決:
- 多進程進行繪圖
- 圖形渲染調整
多進程
在python中使用多進程方法加速批量出圖是非常方便的。但這需要電腦有多個核,當然對于現代電腦和服務器而言已經不再是問題。可選擇deco和multiprocessing工具解決此問題。deco是對multiprocessing的封裝,使用更加簡單方便。示例:from?deco?import?*@concurrent(processes=4)?# We add this for the concurrent functiondef?process_lat_lon(lat,?lon,?data):?#Does some work which takes a while?return?result@synchronized?# And we add this for the function which calls the concurrent functiondef?process_data_set(data):?results?=?defaultdict(dict)?for?lat?in?range(...):? ?for?lon?in?range(...):? ? ?results[lat][lon] =?process_lat_lon(lat,?lon,?data)?return?results第一個裝飾器中給定了一個參數processes:表示進程數,如果沒有給定,則使用所有的cpu。第一個函數使用裝飾器@concurrent,第二個函數使用了裝飾器@synchronized,第二個函數中調用了第一個函數。第二個函數的裝飾器是可選的,但最好使用裝飾器進行封裝。圖形渲染
以數值預報模式的批量出圖過程中的氣象要素空間分布為例。氣象要素的空間分布必然涉及到地理信息的處理,比如添加海岸線、省市邊界線、江流河海等。對于空間分布圖而言,上述的地理信息是不變的。因此在批量出圖時,相同地理范圍的圖可以使用相同的背景圖。以溫度的空間分布為例,這里所說的背景圖是除了溫度的空間分布外的海岸線、省市邊界線、軸的標注等信息。在繪圖的時候都是按照圖層進行先后疊加的,而疊加后的圖層是可以刪除的。批量出圖時只需要將會變的信息清空,然后在背景圖上疊加新的信息即可。這樣,就能節省繪制地圖的時間,每次只需要繪制一次地圖即可。想想如果需要批量生成的圖數量很多的話,這樣就能節省很多時間。刪除圖層操作
對于matplotlib.contour類函數而言,刪除操作如下:con?=?ax.contourf(lon,?lat,?temp)for?coll?in?con.collections:? ?coll.remove()線或者文本操作
lines?=?ax.plot(a,?y)l?=?lines.pop(0)l.remove()對于文本操作而言,以設置標題為例:at?=?ax.set_title('Test')at.remove()會出現以下錯誤信息:NotImplementedError:?cannot?remove?artist搜索了很久沒找到解決辦法,也就沒有嘗試。但可以通過更新文本的方式覆蓋原先的文本信息,比如:ax.set_title(None)這樣就能解決上述問題了。當然也可以使用如下方式:ax.set_visible(False)測試對比
整個循環批量出圖需要對9個變量,輸出4725張圖。以下性能測試分析僅選取一個變量,繪制7張圖。單核對比
time kernprof?-l?plot.pyreal0m31.441suser1m22.964ssys0m1.092sLine?# ? ? Hits ? ? ? ? Time Per Hit ? % Time Line Contents==============================================================? ??63?? ? ? ??7?? ??250148.0 ?35735.4 ? ? ?0.8 ? ? fig, ax?=?plt.subplots(figsize=(12,?9))? ??64?? ? ? ??7?? ? ? ?273.0 ? ??39.0 ? ? ?0.0 ? ? m?=?Basemap(llcrnrlon=lon[0,0],?llcrnrlat=lat[0,0],? ??65?? ? ? ??7?? ? ? ?163.0 ? ??23.3 ? ? ?0.0 ? ? ? ? ? ? ? ? ?urcrnrlon=lon[-1,-1],?urcrnrlat=lat[-1,-1],? ??66?? ? ? ??7?? ? ? ??14.0 ? ? ?2.0 ? ? ?0.0 ? ? ? ? ? ? ? ? ?projection='lcc',?resolution='l',? ??67?? ? ? ??7?? ? ? ??15.0 ? ? ?2.1 ? ? ?0.0 ? ? ? ? ? ? ? ? ?lat_1=30,?lat_2=60,? ??68?? ? ? ??7???15828248.0?2261178.3 ? ??52.2 ? ? ? ? ? ? ? ? ?lat_0=33.5,?lon_0=106)? ??69?? ? ? ??7?? ? ? ??43.0 ? ? ?6.1 ? ? ?0.0 ? ? shp?=?m.readshapefile('shps/cnhimap',?'china',? ??70?? ? ? ??7?? ?3270262.0?467180.3 ? ??10.8 ? ? ? ? ? ? ? ? ? ?linewidth=1.5,?color='k',?ax=ax)? ??71?? ? ? ??7?? ? ? ??28.0 ? ? ?4.0 ? ? ?0.0 ? ? hb ?=?m.readshapefile('shps/hb',?'hebei',? ??72?? ? ? ??7?? ??348692.0 ?49813.1 ? ? ?1.1 ? ? ? ? ? ? ? ? ? ? ? ? ? ?linewidth=1.5,?color='blue',?ax=ax)? ??73?? ? ? ??7?? ? ?55085.0 ??7869.3 ? ? ?0.2 ? ? x, y?=?m(lon, lat)? ??74? ??75?? ? ? ??7?? ? ? ?107.0 ? ??15.3 ? ? ?0.0 ? ? con?=?m.contourf(x, y, aqid, np.arange(rangs[0], rangs[-1]+1,?1),? ??76?? ? ? ??7?? ? ? ??16.0 ? ? ?2.3 ? ? ?0.0 ? ? ? ? ? ? ? ? ? ? ??vmin=rangs[0],?vmax=rangs[-1],?norm=aqi_norm,? ??77?? ? ? ??7?? ?2528715.0?361245.0 ? ? ?8.3 ? ? ? ? ? ? ? ? ? ? ??cmap=aqi_cmap,?extend=extend,?ax=ax)? ??78? ??79?? ? ? ??7?? ? ? ??29.0 ? ? ?4.1 ? ? ?0.0 ? ? m.drawparallels(yticks,?labels=[1,0,0,0],?linewidth=0.5,? ??80?? ? ? ??7?? ??464004.0 ?66286.3 ? ? ?1.5 ? ? ? ? ? ? ? ? ? ? ?ax=ax,?fmt=lat2str,?fontdict=dict(fontsize=FT))? ??81?? ? ? ??7?? ? ? ??25.0 ? ? ?3.6 ? ? ?0.0 ? ? m.drawmeridians(xticks,?labels=[0,0,0,1],?linewidth=0.5,? ??82?? ? ? ??7?? ??317093.0 ?45299.0 ? ? ?1.0 ? ? ? ? ? ? ? ? ? ? ?ax=ax,?fmt=lon2str,?fontdict=dict(fontsize=FT))? ??83?? ? ? ??7?? ? ?23429.0 ??3347.0 ? ? ?0.1 ? ? m.drawcoastlines()通過性能分析結果可以看出:創建 map 占據了超過一半的時間,占比52.2%,而添加地圖邊界占比11.9%,添加軸標注占比2.5%。而這些都屬于背景圖的信息,只需要創建一次即可。將背景圖信息的部分單獨拿出來,只創建一次,每次在背景圖上添加新圖層,新的圖存儲后將添加的圖層刪除,然后重復利用。以下是優化后代碼的執行結果:time kernprof?-l?plot_eff.pyreal0m14.141suser0m21.010ssys0m0.670s相比于之前運行的31s,優化后的代碼運行時間只有14s,速度提升了超過50%。多核對比
多核并行運行采用deco工具,使用3個核進行測試。time python plot.pyreal0m11.224suser0m55.686ssys0m1.610s猜測可能是只創建了一個figure對象,導致在使用多進程傳遞對象時出現了混亂,從而導致出現問題。而后對代碼進行了改進,僅將創建map的代碼放到了循環之外,只創建一次地圖。畢竟創建地圖的代碼的時間占比就超過了50%,其余部分占比較低,改動此項仍能大幅節省畫圖時間。測試單背景圖的多核時出現了問題,figure.canvas 為 NoneType,導致出錯:AttributeError: 'NoneType' object has no attribute 'print_figure'以下是改進后的3個核的運行效率,相比于原始腳本而言,仍然提升了35%。time python plot_eff.pyreal0m7.274suser0m20.875ssys0m0.857s注意事項
通過圖形渲染流程來優化繪圖時需要注意:matplotlib在繪圖的時候如果使用subplots創建Figure對象,添加colorbar的時候,圖形對象會進行自適應,刪除colorbar之后axes的位置并不會自動適應到原始位置,此時如果添加新的圖層和colorbar,會導致新的Figure對象中的axes的位置再次縮小。每重復一次刪除/更新操作,axes的位置會縮小一些,重復越多,axes越小。解決方法如下:可通過如下方式創建Figure圖像,固定contourf的axes和colorbar的axes,這樣每次刪除/更新新圖層時就不會出現上述問題。fig?=?plt.Figure(figsize=(12,?9))ax?=?fig.add_axes([0.12,?0.11,?0.64,?0.77])cax?=?fig.add_axes([0.78,?0.2,?0.022,?0.6])當然,subplots應該也有自適應的方式,但是嘗試了很多方法都沒有實現,暫時先放下了。嘗試了更新axes的位置,然后更新圖形:gp?=?ax.get_position()ax.set_position(gp)ax.autoscale()ax.relim()fig.canvas.draw()參考鏈接
- https://stackoverflow.com/questions/27345157/matplotlib-how-to-remove-just-one-contour-element-from-axis-with-other-plotted
- https://stackoverflow.com/questions/4981815/how-to-remove-lines-in-a-matplotlib-plot
- https://stackoverflow.com/questions/21565445/matplotlib-says-fig-canvas-is-none-so-i-cant-use-fig-canvas-draw
往期回顧:
氣象招聘 | 深圳防雷協會代招聘兩則
定了!新聞聯播已播出!碩士研究生招生規模要擴大!!
專題報道 | 廣東海洋大學海洋與氣象學院人才引進需求和政策簡介
- 新云天氣象公眾號聯系人微信/QQ:130188121
- 2020屆氣象本科生考研復試QQ群:930107262
- 2020大氣與海洋春季招聘會QQ群:346577427
- 2021屆氣象本科考研與就業QQ群:639522239
- 2021屆氣象研究生畢業就業QQ群:696948743
總結
以上是生活随笔為你收集整理的element ui 批量删除之后动态更新列表_气象编程 | Python高效批量绘图方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 反应能力测试题_微笑抑郁的表现症状有哪些
- 下一篇: python实现将文件内容按照某一列内容