تجزیه و تحلیل باران های منطقه ای با پایتون
مقدمه
ما می خواهیم میانگین سالانه بارش را در مقیاس منطقه ای برای شمال پرو تحلیل کنیم. این مجموعه دارای 20 ایستگاه از ساحل بیابانی پرو، آند و جنگل های بارانی با تفاوت های ارتفاع و میزان بارش است.
هدف اصلی این است که الگوها و روندهای بارش را تجزیه و تحلیل کرده و آنها را با استفاده از پایتون و با استفاده از روش های مختلف ترسیم کنیم.
برای این کار ما از نرم افزار IPython که شما می توانید بر روی رایانه خود نصب کنید یا از wakari.io آن را در ابر مجازی اجرا کنید استفاده نمایید. شما می توانید اطلاعات ایستگاه برای این تمرین را در اینجا دانلود کنید.
وارد کردن فایل
اول، ما فایل ها را در نوت بوک IPython که در مرورگر مورد علاقه شما اجرا می شود وارد می کنیم. متغیرها به زبان دیگری نوشته شده اند تا آنها را از بقیه دستورات پایتون متمایز کند.
In[]:%pylab inline %cd C:\Users\Saul\Dropbox\Curso_19_Python_en_Hidrologia_v2\1_Doc\AuxData import numpy as np import matplotlib.pyplot as plt datos = np.genfromtxt('DatosEstaciones.csv', delimiter=",") datos Out[]: array([[ nan,nan,nan,nan,nan], [-76.25, -10.68,4334.,nan,1052.04], [-75.75,-9.9 ,1860.,nan, 378.], [-76.78,-9.55,3430.,nan, 702.], [-77.36, -10.06,3950.,nan, 755.04], [-75.53, -10.03, 680.,nan,2424.96], [-75.9 , -11.48,3632.,nan, 735.96], [-77.43,-9.73,3561.,nan, 744.96], [-76.21, -11.63,4193.,nan, 741.], [-75.93, -11.55,3750.,nan, 567.], [-75.13, -10.61,1050.,nan,3096.96], [-75.3 , -11.13, 800.,nan,2007.96], [-77.83, -10.68,46.,nan, 9.96], [-76.38, -11.83,2379.,nan, 237.96], [-75.95,-9.13, 669.,nan,3203.04], [-77.51,-9.5 ,3050.,nan, 579.], [-74.9 , -10.3 , 301.,nan,3309.], [-77.6 ,-9.35,2760.,nan, 737.04], [-78.05, -10.28, 100.,nan, 6.], [-74.93,-9.86, 250.,nan,1701.96], [-75.46, -11.78,3322.,nan, 714.]])
ردیف اول نام ستونی است که با آرایه numpy نمی تواند وارد شود. نام ستون ها عبارتند از: طول، عرض، ارتفاع، نام، بارش سالانه.
نیاز به تعمیر آرایه برای پاک کردن یک غیر عدد "n-a-number" یا nan وجود ندارد، زیرا ما کار را بر روی اسکریپت و بر روی آرایه انجام خواهیم داد.
تقسیم ارزش ها به صورت جداگانه
ما دو قطعه را برای دیدن توزیع فضایی بارش ایستگاه و ارتفاع ایستگاه انجام خواهیم داد.
توزیع بارش
اولین طرح نشان می دهد که ایستگاه ها به عنوان دایره های مقیاس شده با میانگین بارش سالانه خود قرار گرفته اند. رنگ برای همه ایستگاه ها یکنواخت است. اسکریپت همچنین طرح نتیجه را به عنوان یک فایل png ذخیره می کند.
In[]:plt.scatter(datos[:,0],datos[:,1], marker="o", s=datos[:,4]) plt.savefig('puntosconmagnitud.png') Out[]:
بارش به سمت شرق پرو، جایی که حلقه های بزرگ در آن قرار دارد، افزایش می یابد. در Andes ایستگاه های دایره ای مشابهی دارند، در حالی که در ساحل پرو، بارش بسیار کم است (دو نقطه کوچک در سمت راست).
توزیع ارتفاع
ما یک طرح مشابه داریم، اما این بار با ارتفاع ایستگاه به عنوان شش ضلعی با رنگ و اندازه کوچک به ارتفاع ارتقا داده می شود.
ما می توانیم شماتیک های بزرگتر و شفاف تر از قرمز های مربوط به ایستگاه های بالا در آند ها را ببینیم. در هر دو طرف آند (ساحل بیابان و جنگل بارانی) ارتفاع پایین تر است.
ترسیم 3D برای نشان دادن بارندگی و ارتفاع
ما ارتفاع و بارش را به طور جداگانه تحلیل کردیم. ما به برخی از ابزارهای گرافیکی نیاز داریم تا آنها را در همان گرافیک قرار دهیم. در این بخش، ما در میان برخی از گزینه های طرح گشت و گذار برای تجزیه و تحلیل هر دو بارندگی و ارتفاع در یک صورت گرافیک مشابه داریم.
ارتفاع و بارش به عنوان نقطه
قطعه بعدی ارتفاع را به عنوان نقاط قرمز و بارش به عنوان نقاط آبی نشان می دهد. در پایین جعبه ما می توانیم موقعیت ایستگاه را به عنوان نقاط خاکستری مشاهده کنیم.
In[]:from mpl_toolkits.mplot3d import Axes3D import numpy as np import matplotlib.pyplot as plt fig = plt.figure() fig.set_size_inches(10,10) ax = fig.gca(projection='3d') este = datos[:,0] norte = datos[:,1] elev = datos[:,2] precip = datos[:,4] ax.scatter(este, norte, elev, marker='o', c='r',s=(datos[:,4]/20)) ax.scatter(este, norte, precip, marker='o', c='b',s=(datos[:,4]/20)) ax.scatter(este, norte, 0, marker='o', c='#4b4b4b',s=(datos[:,4]/20)) ax.set_zlim3d(0, 5000) plt.show() Out[]:
نمایندگی ارتفاع و بارش در این طرح 3D امکان پذیر است. در یک رویکرد "کاربر گرا" ما نیاز به یک طرح "دوستانه" و با حالت "تعاملی" داریم.
ما طرح مشابهی را انجام خواهیم داد، اما این بار به جای نقاط از ستون ها استفاده خواهیم کرد. دو ستون در کنار یکدیگر داریم، یک قرمز برای ارتفاع و یک آبی برای بارندگی.
In[]:from mpl_toolkits.mplot3d import Axes3D import numpy as np import matplotlib.pyplot as plt fig = plt.figure() fig.set_size_inches(10,10) ax = fig.gca(projection='3d') este = datos[:,0] norte = datos[:,1] datum = np.zeros(este.size) elev = datos[:,2] precip = datos[:,4] ax.bar3d(datos[:,0]-0.1,datos[:,1]-0.1,datum, .1, .1, datos[:,2], color='r', alpha=0.5) ax.bar3d(datos[:,0],datos[:,1],datum, .1, .1, datos[:,4], color='b',alpha=0.5) ax.set_xlabel('Este') ax.set_ylabel('Norte') ax.set_zlabel('Elevacion / Precipitacion') ax.set_zlim3d(0, 5000) plt.show()
Out[]:
تعبیه و طراحی سه بعدی شبکه
به جای استفاده از مقادیر گسسته، بارش را به گونه ای تعریف می کنیم که باران توزیع شود. Scipy دارای ماژول interpolate.griddata است که برای این تمرین مناسب است. در انتهای این اسکریپت، شبکه ای که در آن قرار دارد را نشان می دهد.
In[]: from scipy import interpolate %pylab inline #generamos parametros para la grilla delta=0.25 este_r = np.arange(-78.5,-74.5,delta) norte_r = np.arange(-12.0,-9.0,delta) este_g,norte_r = np.meshgrid(este_r,norte_r) #generamos la grilla regular X,Y =np.meshgrid(np.linspace(-78.5,-74.5,100), np.linspace(-12,-8,100)) #realizamos la interpolación grid_datos = interpolate.griddata((datos[1:,0],datos[1:,1]), datos[1:,4],(X,Y) ,method='cubic') clf() contourf(X,Y,grid_datos,8,cmap='Blues') colorbar() scatter(datos[:,0],datos[:,1]) xlim(np.min(datos[1:,0]),np.max(datos[1:,0])) ylim(np.min(datos[1:,1]),np.max(datos[1:,1])) Out[]:
ما می توانیم بارش های درون یابی را به صورت خطوط با برچسب نشان دهیم.
In[]:clabel(contour(X,Y,grid_datos,8,cmap='Blues'),fmt='%r') scatter(datos[:,0],datos[:,1]) xlim(np.min(datos[1:,0]),np.max(datos[1:,0])) ylim(np.min(datos[1:,1]),np.max(datos[1:,1])) Out[]:
در نهایت می توانیم شبکه سه بعدی را به صورت سه بعدی ترسیم کنیم و در هر محور، یک طرح خیالی داشته باشیم.
In[]:from mpl_toolkits.mplot3d import Axes3D %pylab inline fig = figure() ax = Axes3D(fig) cset = ax.contourf(X, Y, grid_datos, zdir='z', offset=-500, cmap=cm.coolwarm) cset = ax.contourf(X, Y, grid_datos, zdir='x', offset=-78.5, cmap=cm.coolwarm) ax.plot_surface(X,Y,grid_datos,rstride=8, cstride=8,alpha=0.3, linewidth=0.1, antialiased=True) Out[]:
شناسه تلگرام مدیر سایت: SubBasin@
نشانی ایمیل: behzadsarhadi@gmail.com
(سوالات تخصصی را در گروه تلگرام ارسال کنید)
_______________________________________________________
پروژه تخصصی در لینکدین
نظرات (۰)