element ui 批量删除之后动态更新列表_气象编程 | Python高效批量绘图方法
生活随笔
收集整理的這篇文章主要介紹了
element ui 批量删除之后动态更新列表_气象编程 | Python高效批量绘图方法
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
添加新云天氣象主編微信或QQ:130188121,及時(shí)獲取或發(fā)布?xì)庀笊龑W(xué)、就業(yè)、會(huì)議、征稿及學(xué)術(shù)動(dòng)態(tài)等信息!在數(shù)值預(yù)報(bào)后處理中經(jīng)常需要批量出圖,而基于matplotlib的圖形渲染速度較慢,而提高出圖的速度通??赏ㄟ^兩個(gè)方面來解決:
- 多進(jìn)程進(jìn)行繪圖
- 圖形渲染調(diào)整
多進(jìn)程
在python中使用多進(jìn)程方法加速批量出圖是非常方便的。但這需要電腦有多個(gè)核,當(dāng)然對(duì)于現(xiàn)代電腦和服務(wù)器而言已經(jīng)不再是問題??蛇x擇deco和multiprocessing工具解決此問題。deco是對(duì)multiprocessing的封裝,使用更加簡(jiǎn)單方便。示例: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第一個(gè)裝飾器中給定了一個(gè)參數(shù)processes:表示進(jìn)程數(shù),如果沒有給定,則使用所有的cpu。第一個(gè)函數(shù)使用裝飾器@concurrent,第二個(gè)函數(shù)使用了裝飾器@synchronized,第二個(gè)函數(shù)中調(diào)用了第一個(gè)函數(shù)。第二個(gè)函數(shù)的裝飾器是可選的,但最好使用裝飾器進(jìn)行封裝。圖形渲染
以數(shù)值預(yù)報(bào)模式的批量出圖過程中的氣象要素空間分布為例。氣象要素的空間分布必然涉及到地理信息的處理,比如添加海岸線、省市邊界線、江流河海等。對(duì)于空間分布圖而言,上述的地理信息是不變的。因此在批量出圖時(shí),相同地理范圍的圖可以使用相同的背景圖。以溫度的空間分布為例,這里所說的背景圖是除了溫度的空間分布外的海岸線、省市邊界線、軸的標(biāo)注等信息。在繪圖的時(shí)候都是按照?qǐng)D層進(jìn)行先后疊加的,而疊加后的圖層是可以刪除的。批量出圖時(shí)只需要將會(huì)變的信息清空,然后在背景圖上疊加新的信息即可。這樣,就能節(jié)省繪制地圖的時(shí)間,每次只需要繪制一次地圖即可。想想如果需要批量生成的圖數(shù)量很多的話,這樣就能節(jié)省很多時(shí)間。刪除圖層操作
對(duì)于matplotlib.contour類函數(shù)而言,刪除操作如下:con?=?ax.contourf(lon,?lat,?temp)for?coll?in?con.collections:? ?coll.remove()線或者文本操作
lines?=?ax.plot(a,?y)l?=?lines.pop(0)l.remove()對(duì)于文本操作而言,以設(shè)置標(biāo)題為例:at?=?ax.set_title('Test')at.remove()會(huì)出現(xiàn)以下錯(cuò)誤信息:NotImplementedError:?cannot?remove?artist搜索了很久沒找到解決辦法,也就沒有嘗試。但可以通過更新文本的方式覆蓋原先的文本信息,比如:ax.set_title(None)這樣就能解決上述問題了。當(dāng)然也可以使用如下方式:ax.set_visible(False)測(cè)試對(duì)比
整個(gè)循環(huán)批量出圖需要對(duì)9個(gè)變量,輸出4725張圖。以下性能測(cè)試分析僅選取一個(gè)變量,繪制7張圖。單核對(duì)比
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()通過性能分析結(jié)果可以看出:創(chuàng)建 map 占據(jù)了超過一半的時(shí)間,占比52.2%,而添加地圖邊界占比11.9%,添加軸標(biāo)注占比2.5%。而這些都屬于背景圖的信息,只需要?jiǎng)?chuàng)建一次即可。將背景圖信息的部分單獨(dú)拿出來,只創(chuàng)建一次,每次在背景圖上添加新圖層,新的圖存儲(chǔ)后將添加的圖層刪除,然后重復(fù)利用。以下是優(yōu)化后代碼的執(zhí)行結(jié)果:time kernprof?-l?plot_eff.pyreal0m14.141suser0m21.010ssys0m0.670s相比于之前運(yùn)行的31s,優(yōu)化后的代碼運(yùn)行時(shí)間只有14s,速度提升了超過50%。多核對(duì)比
多核并行運(yùn)行采用deco工具,使用3個(gè)核進(jìn)行測(cè)試。time python plot.pyreal0m11.224suser0m55.686ssys0m1.610s猜測(cè)可能是只創(chuàng)建了一個(gè)figure對(duì)象,導(dǎo)致在使用多進(jìn)程傳遞對(duì)象時(shí)出現(xiàn)了混亂,從而導(dǎo)致出現(xiàn)問題。而后對(duì)代碼進(jìn)行了改進(jìn),僅將創(chuàng)建map的代碼放到了循環(huán)之外,只創(chuàng)建一次地圖。畢竟創(chuàng)建地圖的代碼的時(shí)間占比就超過了50%,其余部分占比較低,改動(dòng)此項(xiàng)仍能大幅節(jié)省畫圖時(shí)間。測(cè)試單背景圖的多核時(shí)出現(xiàn)了問題,figure.canvas 為 NoneType,導(dǎo)致出錯(cuò):AttributeError: 'NoneType' object has no attribute 'print_figure'以下是改進(jìn)后的3個(gè)核的運(yùn)行效率,相比于原始腳本而言,仍然提升了35%。time python plot_eff.pyreal0m7.274suser0m20.875ssys0m0.857s注意事項(xiàng)
通過圖形渲染流程來優(yōu)化繪圖時(shí)需要注意:matplotlib在繪圖的時(shí)候如果使用subplots創(chuàng)建Figure對(duì)象,添加colorbar的時(shí)候,圖形對(duì)象會(huì)進(jìn)行自適應(yīng),刪除colorbar之后axes的位置并不會(huì)自動(dòng)適應(yīng)到原始位置,此時(shí)如果添加新的圖層和colorbar,會(huì)導(dǎo)致新的Figure對(duì)象中的axes的位置再次縮小。每重復(fù)一次刪除/更新操作,axes的位置會(huì)縮小一些,重復(fù)越多,axes越小。解決方法如下:可通過如下方式創(chuàng)建Figure圖像,固定contourf的axes和colorbar的axes,這樣每次刪除/更新新圖層時(shí)就不會(huì)出現(xiàn)上述問題。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])當(dāng)然,subplots應(yīng)該也有自適應(yīng)的方式,但是嘗試了很多方法都沒有實(shí)現(xiàn),暫時(shí)先放下了。嘗試了更新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
往期回顧:
氣象招聘 | 深圳防雷協(xié)會(huì)代招聘兩則
定了!新聞聯(lián)播已播出!碩士研究生招生規(guī)模要擴(kuò)大!!
專題報(bào)道 | 廣東海洋大學(xué)海洋與氣象學(xué)院人才引進(jìn)需求和政策簡(jiǎn)介
- 新云天氣象公眾號(hào)聯(lián)系人微信/QQ:130188121
- 2020屆氣象本科生考研復(fù)試QQ群:930107262
- 2020大氣與海洋春季招聘會(huì)QQ群:346577427
- 2021屆氣象本科考研與就業(yè)QQ群:639522239
- 2021屆氣象研究生畢業(yè)就業(yè)QQ群:696948743
總結(jié)
以上是生活随笔為你收集整理的element ui 批量删除之后动态更新列表_气象编程 | Python高效批量绘图方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 反应能力测试题_微笑抑郁的表现症状有哪些
- 下一篇: mysql有那么多存储引擎_MySQL的