تجزیه و تحلیل باران های منطقه ای با پایتون :: بیسین - سایت تخصصی مهندسی آب

تجزیه و تحلیل باران های منطقه ای با پایتون


مقدمه

ما می خواهیم میانگین سالانه بارش را در مقیاس منطقه ای برای شمال پرو تحلیل کنیم. این مجموعه دارای 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[]:






نظرات (۰)

فرم ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی


درباره بهترين هاي بيسيـــن بدانيد...

Bird

يکي از مهمترين اهداف اين سايت تهيه آموزش هاي روان از ابزارهاي کاربردي علوم آب است.

اهميت مطالعات محيطي با ابزارهاي نوين در چيست؟

امروز با فارغ التحصيلي جمع کثير دانشجويان سالهاي گذشته و حال، با گذر از کمي گرايي ديگر صرف وجود مدارک دانشگاهي حرف اول را در بازار کار نمي زند؛ بلکه سنجش ديگري ملاک؛ و شايسته سالاري به ناچار! باب خواهد شد. يکي از مهم ترين لوازم توسعه علمي در هر کشور و ارائه موضوعات ابتکاري، بهره گيري از ابزار نوين است، بيسين با همکاري مخاطبان مي تواند در حيطه علوم آب به معرفي اين مهم بپردازد.

جستجو در بيسين


بیسین - سایت تخصصی مهندسی آب

سایت مهندسی آب بیسین با معرفی مهم ترین و کاربردی ترین نرم افزارها و مدل های شبیه سازی در حیطه مهندسی آب، تلاش به تهیه خدمات یکپارچه و محلی از محاسبات هیدرولوژیکی و هیدرولیکی می کند

W3Schools


اطلاعات سايت

  • behzadsarhadi@gmail.com
  • بهزاد سرهادي
  • شناسه تلگرام: SubBasin
  • شماره واتساپ: 09190622992-098
  • شماره تماس: 09190622992-098

W3Schools