Sunday, January 16, 2022

22-Python: Plotting Temperature Map

 Assalamualaikum wbt dan jumpa lagi.

Post kali ini kita akan cuba untuk membuat plot suhu ke atas peta Malaysia dan rantau sekitar menggunakan data suhu yang telah dikongsi di dalam post ke 21 yang lalu. Menggunakan data suhu yang sama pada data resolusi 2.5 degree yang membawa maksud setiap nilai suhu merupakan perwakilan bagi data setiap pixel atau keluasan sesebuah kawasan. Untuk data suhu yang dibekalkan, nilai setiap pixel persegi adalah bersamaan dengan (2.5 degree x 2.5 degree) atau (277.5 km x 277.5 km) pada anggaran 1 degree adalah bersamaan 111 km. Bagi mendapatkan bacaan suhu yang lebih baik, kita perlu mendapatkan sumber data pada resolusi yang lebih tinggi (degree yang lebih rendah) samada 0.1 atau 0.05 degree jika ada.

Untuk perkongsian kali ini saya akan menggunakan data suhu pada resolusi 2.5 degree sebagai permulaan serta mengurangkan bebanan storage komputer anda. Saya juga akan berkongsi bagaimana untuk mendapatkan sumber data ini pada post-post akan datang.

#### copy starts here ###

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import os
import glob
from scipy.interpolate import griddata


plt.rcParams.update({'font.size':12,'font.family': 'serif'})

### searching current working folder
folder = os.getcwd()
path1=folder+'/Data/'
os.makedirs(os.path.dirname(path1), exist_ok=True)

### open new folder for saving plot
path2=folder+'/Output-Plot/'
os.makedirs(os.path.dirname(path2), exist_ok=True)

### calling to open data using library glob
files=glob.glob(path1+'*.dat')

### setting plotting frame size
plt.figure(figsize = (9, 8))
ax = plt.subplot()

### using python LOOP to process all data
### applying truncation for deciding new names as discussed in post 21
for x in files:
    print(x)
    output_name=x[-15:-9]
    print(output_name)
   
    data2=np.loadtxt(x)
    lats=data2[:,0]
    lons=data2[:,1]
    temp=data2[:,2]
    min_temp=min(temp)
    max_temp=max(temp)
    
### Processing data gridding for an array data using meshgrid  
### applying method gridding either nearest, linear or cubic
    lon,lat=np.meshgrid(lons,lats)
    zz=griddata((lons,lats),temp,(lon,lat),method='nearest') 

### setting interest plotting region    
    lat_min = -10.0
    lat_max = 10.0
    lon_min = 95.0
    lon_max = 125.0

### applying basemap with its properties for proper plotting   
    m = Basemap(projection = 'mill',llcrnrlat = lat_min,
    llcrnrlon = lon_min,urcrnrlat = lat_max, urcrnrlon = lon_max,
    resolution='i')
    m.drawparallels(np.arange(-90, 91,5),labels =[1,0,0,0],
     color = '0.25', linewidth = 0.5)
    m.drawmeridians(np.arange(-180,180,5),labels =[0,0,0,1],
     color = '0.25', linewidth = 0.5)
    m.bluemarble(scale=0.5)
    m.drawcountries()
    m.drawstates()
    m.drawcoastlines()

### plotting using pcolor mesh
    im=m.pcolormesh(lon,lat,zz,latlon = True, cmap= 'jet',
    vmin = 20.0, vmax = 28.0)

### setting color bar below the map
    cbar = m.colorbar(im,location='bottom',pad="10%")
    cbar.set_label('Degree Celcius',fontsize=10)
    
### applying map title
    plt.title('Monthly Average Temperature (Degree Celcuis) in '+output_name)

### saving map or image onto file created above under path 2   
    plt.savefig(path2+output_name+ ".png",dpi=280,
    bbox_inches='tight')
    
    plt.clf()

#### end copy here #####

Contoh output



Catatan:
a) Anda boleh membuat plotting menggunakan variation color lain selain color cmap= 'jet'. Boleh buat rujukan bacaan lanjut melalui goggle untuk pilihan warna yang ada.

b) Anda juga boleh membuat plot menggunakan contour selain menggunakan kaedah pcolormesh.

c) pastikan line statement selepas for x in files: mestilah pada kedudukan indent

Selamat mencuba!

No comments:

Post a Comment

23-Python : Plotting Temperature Histogram

  Assalamualaikum wbt dan jumpa lagi. Post kali ini kita akan cuba untuk membuat analisa taburan suhu purata setiap data yang telah dibelakk...