Sunday, January 16, 2022

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 dibelakkan di dalam post ke 21 yang lalu. Selain itu kita akan cuba untuk aplikasi pengetahuan yang telah dipelajari sebelumnya iaitu, menggunakan library glob, library os, setting path dan open folders serta truncation bagi menetapkan nama baharu sesebuah fail atau plot yang di lakukan.

### copy script here ###
import numpy as np
import matplotlib.pyplot as plt
import os
import glob


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-Histogram/'
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 = (8, 6))
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)
    
    ## setting temperature range domain here we set from 20 to 28
    range = (20, 28) ## temperature range

    ## setting how many bars that we want to be plotted
    bins = 40

    ## plotting command for a histogram with its parameters
    plt.hist(temp, bins, range, color = 'red', 
    histtype = 'bar', rwidth = 0.8)
    

    ##set x-axis label as vertical
    plt.xticks(rotation=90)
    
    ## naming the x-axis
    plt.xlabel('Temperature (Degree Celcius)')
    
    ## naming the y-axis
    plt.ylabel('Frequency')
    
    ### applying map title
    plt.title('Temperature Histogram in '+output_name)
 
    ## save plot or image onto file created above under path 2  
    plt.savefig(path2+output_name+ ".png",dpi=280,
        bbox_inches='tight')
    
    plt.clf()

Contoh plot:




Selamat mencuba!










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!

21-Python: Menetapkan Nama Output File Menggunakan Teknik Pangkasan Daripada Data Asal

 Assalamualaikum wbt dan jumpa lagi.

Post kali ini kita akan membincangkan bagaimana untuk menetapkan nama output file menggunakan teknik pangkasan daripada sumber data luar yang dibekalkan. Tujuan teknik ini digunakan adalah bagi memudahkan pengguna menetapkan nama baharu terhadap hasil operasi yang dilakukan samada untuk menyimpan sebagai data output atau imej. Bagi tujuan ini, saya ada membekalkan beberapa set data geographic coordinate bagi data suhu di setiap latitud dan longitud. Data yang dibekalkan adalah data purata suhu bulanan pada bulan Januari, Februari, Mac dan April untuk region daripada latitud 10.0 ke -10.0 dan longitud 95.0 ke 125.0 pada tahun 1981.

Post kali ini juga anda akan belajar untuk memanggil dan membuka kesemua data secara serentak menggunakan library glob dan seterusnya melakukan proses kerja yang diingini. Kelebihan teknik ini kesemua data bersaiz besar pada kuantiti data yang banyak dapat dilakukan dengan pantas.

Sila download kesemua data luar yang dikongsikan menggunakan platform google drive dan simpan kesemua empat data ke dalam folder "Data" di dalam folder tugasan masing-masing. Link adalah seperti berikut :

https://drive.google.com/drive/folders/13le-PqafDNpRyRYNLmaJQXEL5yDyso-C?usp=sharing

Sila wujudkan nama folder tugasan masing-masing mengikut citarasa anda. Contoh: Teknik-Pangkasan, Tugasan, Projek etc. 

Peringatan : Nama folder TIDAK BOLEH dipisahkan dengan space bar.


#### copy starts here ##########
import os
import glob


## searching current folder
folder = os.getcwd()

path1=folder+'/Data/'
os.makedirs(os.path.dirname(path1), exist_ok=True)

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

## Process the data one by one using LOOP
for x in files:
    print(x)
    output_name=x[-15:-9]
    print(output_name)

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

Catatan:
a) Glob berfungsi memanggil kesemua file dalam folder "Data" di dalam path1 menggunakan singkatan *.dat yang merujuk kepada kesemua data yang berakhiran dengan .dat. Data lain daripada format .dat tidak akan dipanggil.

b) x in files merujuk kepada setiap file data yang telah dibuka dan bersedia untuk diproses. 

c) Teknik pangkasan berlaku pada x[-15:-9] yang merujuk kepada aksara yang dipangkas daripada string paling hujung (kanan ke kiri). Contoh:
print(x) : D:\PROJEK-BLOG\Suhu/Data\198101-data.dat. Nama output file yang diingini adalah 198101.

Anda boleh cuba untuk mengubah nilai pangkasan dan lihat sendiri perbezaan hasil nama output file yang baharu tersebut.

Selamat mencuba!


Saturday, January 15, 2022

20-Python :Create Folder

 Assalamualaikum wbt dan jumpa lagi.

Hari ini saya akan berkongsi dengan anda bagaimana untuk menguruskan fail tugasan di dalam folder-folder tugasan yang dicipta. Disarankan setiap fail tugasan python yang berhujung ".py" disimpan di dalam folder tugasan yang dicipta agar tidak keliru pada masa hadapan. Semua folder data dan folder output termasuk plot imej harus disimpan bersama ke dalam folder tugasan. Berikut saya kongsikan bagaimana untuk anda membuka folder output secara automatik menggunakan library os ke dalam folder tugasan.

### start copy script here #############
import os

# searching files path and folders
folder = os.getcwd()

path1=folder+'/Data/'
os.makedirs(os.path.dirname(path1), exist_ok=True)

path2=folder+'/Output-Data/'
os.makedirs(os.path.dirname(path2), exist_ok=True)

path3=folder+'/Output-Plot/'
os.makedirs(os.path.dirname(path3), exist_ok=True)

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

Catatan:
a) Folder Data kebiasaanya adalah lokasi di mana kesemua data-data sumber luar yang disimpan untuk menjalankan program.

b) Folder Output-Data adalah lokasi di mana kesemua data hasil daripada program akan disimpan untuk rujukan masa hadapan.

c) Folder Output-Plot adalah lakasi di mana kesemua hasil plot imej akan disimpan untuk rujukan masa hadapan.

d) Nama folder yang dicipta boleh mengikut keselesaan sendiri.

e) Tidak perlu risau jika nama fail sudah tersedia ada di dalam folder tugasan kerana ianya tidak mengganggu fail dan kandungan fail sedia ada melalui statement exist_ok=True.

f) Kaedah ini sesuai digunakkan jika anda mempunyai fail data sumber luar dalam kuantiti yang banyak untuk digunakan di dalam program anda. Kita akan melihat bagai mana folder-folder ini akan memainkan peranan yang berkesan di dalam post akan datang.

Selamat mencuba!

Thursday, January 6, 2022

19-Python Basemap: Plot Peta Negeri-Negeri Di Malaysia Menggunakan Arcgis Image

 Assalamualaikum wbt dan jumpa lagi.

Post kali ini kita akan melihat lanjutan daripada post ke-18 tetapi menggunakan World Physical Map Service menggunakan EPSG Geodetic Parameter Dataset atau Coordinate System Worldwide. No EPSG untuk Malaysia adalah 4326. Untuk contoh ini saya akan menggunakan pilihan service World_Physical_Map


## start copy from here
import numpy as np
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from matplotlib.collections import PatchCollection
from matplotlib.patches import PathPatch
from matplotlib.patches import Polygon

plt.figure(figsize = (9, 8))

## CREATE AREA MAP
minlon = 99.0
maxlon = 120.0
minlat = 0.0
maxlat = 9.0

map = Basemap(projection='mill',llcrnrlon=minlon ,llcrnrlat=minlat,
    urcrnrlon=maxlon ,urcrnrlat=maxlat, resolution = 'i', 
    epsg = 4326)

map.drawcoastlines(linewidth=0.1)
map.drawcountries(linewidth=0.1)

map.drawparallels(np.arange(-90,90,2),fontsize=10,
   labels=[1,0,0,0],color='black',linewidth=0.05)

map.drawmeridians(np.arange(-180,180,2),fontsize=10,
labels=[0,0,0,1],color='black',linewidth=0.05)

## SILA TUKARKAN SERVICE PILIHAN ANDA

map.arcgisimage(service='World_Physical_Map', epsg = 4326, xpixels = 5000, verbose= False)

## SETTING SHAPEFILE ANDA
path='D:/PROJEK-SHAPEFILE/Data-GADM/'

map.readshapefile(path+'gadm36_MYS_shp/gadm36_MYS_1', name='NAME_1', drawbounds=True)

###### PLOT AND COLOR STATES
ax = plt.subplot()
patches   = []
#
for info, shape in zip(map.NAME_1_info, map.NAME_1):
    if info['NAME_1'] == 'Sarawak':
        patches.append( Polygon(np.array(shape), True) )
#
ax.add_collection(PatchCollection(patches, facecolor='m', edgecolor='k', linewidths=0.5, zorder=2))

### PLOT TEKS NAMA NEGERI
labels = ['Sarawak']

lons = [110.0]
lats = [4.0]
x,y = map(lons, lats)
for label, xpt, ypt in zip(labels, x, y):
    plt.text(xpt, ypt, label,fontsize=12)

## PLOT TITLE IMEJ
fname="Peta Malaysia"
plt.title(fname, fontsize=18)

#################AUTO FILE NAMING######################
import inspect
frame = inspect.currentframe()
path = inspect.getfile(frame)
fname = path.split('.')[0]
plt.savefig(fname + ".png",dpi=500, bbox_inches='tight')
#######################################################
plt.show()

##end copy script here #####

Paparan Imej:

Catatan:
a) Anda mempunyai pilihan service seperti berikut :
  1. World_Physical_Map
  2. World_Shaded_Relief
  3. World_Topo_Map
  4. NatGeo_World_Map
  5. ESRI_Imagery_World_2D
  6. World_Street_Map
  7. World_Imagery
  8. ESRI_StreetMap_World_2D
  9. Ocean_Basemap
Sila tetapkan nama pilihan service di barisan :
map.arcgisimage(service='World_Physical_Map', epsg = 4326, xpixels = 5000, verbose= False)

Anda juga boleh meningkatkan ketajaman pixel pada xpixels mengikut kesesuaian.

Anda boleh mencuba untuk mendapatkan peta yang menarik menggunakan pilihan service-service tersebut. Bacaan lanjut boleh diperolehi di laman web berikut:
http://qingkaikong.blogspot.com/2016/06/nice-python-basemap-background.html

Selamat mencuba!


18-Python Basemap : Plot Peta Negeri-Negeri di Malaysia dan Menetapkan Warna

 Assalam wbt. Jumpa lagi.

Post yang sebelum ini kita telah melihat bagaimana untuk plot peta Malaysia yang plain dan agak sedikit kasar, namun post kali ini kita akan mempelajari bagaimana untuk membuat plot peta Malaysia menggunakan shapefile (peta digital luar) yang diambil daripada website https://gadm.org/download_country.html. Anda perlu muat turun file shapefile daripada website tersebut dengan memilih option "shapefile" selepas memilih pilihan negara. Kelebihan website ini anda mampu untuk muat turun shapefile daripada mana-mana negara di dunia.

Anda akan diperkenalkan dengan aplikasi tambahan basemap iaitu readshapefile serta menambahkan warna mengikut keselesaan masing-masing. Sebenarnya anda mempunyai pilihan untuk auto-setting warna negeri-negeri mengikut color scheme yang disediakan namun saya sarankan biarlah ianya dilakukan secara manual agar kita bebas memilih warna mengikut citarasa sendiri. 

Seperti biasa copy skrip berikut dan save kepada nama yang korang tentukan sendiri serta simpan di folder kerja semasa.

## start copy from here ##
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
from matplotlib.patches import Polygon
import geopandas as gpd
from matplotlib.collections import PatchCollection
from matplotlib.patches import PathPatch
import numpy as np
import matplotlib as mpl
#mpl.rcParams['font.size'] = 12.
mpl.rcParams['font.family'] = 'Arial' ## Arial, Comic Sans MS

##LOKASI SIMPAN FILE SHAPEFILE ANDA
path='D:/PROJEK-SHAPEFILE/Data-GADM/'

## CREATE AREA MAP
minlon = 99.0
maxlon = 120.0
minlat = 0.0
maxlat = 9.0

map = Basemap(llcrnrlon=minlon,llcrnrlat=minlat,
urcrnrlon=maxlon,urcrnrlat=maxlatprojection='merc',
resolution = 'i')

map.drawparallels(np.arange(-90,91,2),fontsize=10,
   labels=[1,0,0,0],color='0.25',linewidth=0.04)

map.drawmeridians(np.arange(-180,180,2),fontsize=10,
labels=[0,0,0,1],color='0.25',linewidth=0.04)

map.drawcoastlines(linewidth=0.3)
map.drawcountries(linewidth=0.3)
    
# load the shapefile, use the name 'NAME_1'
map.readshapefile(path+'gadm36_MYS_shp/gadm36_MYS_1', 
name='NAME_1', drawbounds=True)

##### PLOT AND COLOR STATES
ax = plt.subplot()
patches   = []
for info, shape in zip(map.NAME_1_info, map.NAME_1):
    if info['NAME_1'] == 'Sarawak':
        patches.append( Polygon(np.array(shape), True) )
ax.add_collection(PatchCollection(patches, facecolor='y', edgecolor='k', linewidths=0.5, zorder=2))

##### PLOT TEXT FOR STATES
lons = [110.0,]
lats = [4.0,]
x,y = map(lons, lats)
 
labels = ['Sarawak',]
for label, xpt, ypt in zip(labels, x, y):
    plt.text(xpt, ypt, label,fontsize=12)

## PLOT TITLE IMEJ
fname="Peta Malaysia"
plt.title(fname, fontsize=18)

#### METHOD SAVING IMAGE USING CURRENT FILE NAME
import inspect
frame = inspect.currentframe()
path = inspect.getfile(frame)
fname = path.split('.')[0]
plt.savefig(fname + ".png",dpi=280, bbox_inches='tight')
plt.show()

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

Paparan Imej
Catatan:
a) Anda boleh menukar warna negeri ikut kesesuaian masing-masing pada facecolor="yellow"

Selamat mencuba!




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...