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!




Monday, September 20, 2021

17-Python Basemap : Plot Points and Names The Location on Map

 Assalam wbt. Jumpa lagi.

Post sebelum kita telah mempelajari bagaimana untuk menyediakan peta melalui library Basemap yang disediakan oleh Python samada imej resolusi rendah dan tinggi. Post kali ini saya akan berkongsi bagaimana untuk membuat plot beberapa lokasi Lapangan Terbang di Semenanjung Malaysia serta menambah teks di atas peta atau map tersebut.

Sebagai permulaan kita akan membuat plot untuk 4 lokasi lapangan terbang di Semenanjung Malaysia sahaja namun korang boleh menggunakan konsep yang sama jika mempunyai lokasi (latitude dan longitude) yang banyak dengan hanya menyenaraikan ke dalam fail location.dat. Sila copy lokasi lapangan terbang di Penang, KLIA, Kota Bharu dan Kuantan yang terdiri daripada Latitude dan Longitude seperti berikut dan simpan sebagai "location.dat".

Location   Lat  Lon
Penang    5.30 100.30
KBharu    6.20 102.30
KLIA    2.70 101.70
Kuantan    3.80 103.20

Data location.dat yang dibekalkan agak sedikit berlainan daripada contoh yang dikongsi sebelum ini kerana mangandungi data location di column pertama yang bukan float atau integer malah bukan dikategorikan sebagai string. Bagi kes begini kita akan mengandaikan data location.dat adalah berjenis "objek" yang harus dinyatakan sebagai dtype="object" di dalam np.loadtxt()tetapi nilai Lats dan Lons harus ditukar kembali menjadi float menggunakan command baharu yang akan diperkenalkan.

## copy script from here ##
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams.update({'font.size':12,'font.family':'arial'})
fig = plt.figure(figsize=(5,5)) 
ax=fig.gca()
ax.grid(alpha=0.05)

## open dataset
data=np.loadtxt('location.dat',skiprows=1,dtype='object')

## declaring dataset by column
locations=data[:,0]

lats = data[:,1]
## convert object to float
lats1=np.array(lats, dtype=np.float)

lons = data[:,2]
## convert object to float
lons1=np.array(lons, dtype=np.float)

## plotting basemap semenanjung pada intermediate (i) resolution
map = Basemap(projection='merc', resolution = 'i',
              llcrnrlon=99.0, llcrnrlat=0.0,
              urcrnrlon=106.0, urcrnrlat=9.0)

map.drawcoastlines(linewidth=0.5)
map.drawcountries(linewidth=0.5)
map.fillcontinents(color = 'white')
map.drawmapboundary()

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

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

## plotting coordinate to x,y plane
x,y = map(lons1, lats1)

## plotting each points at marker * (star)
map.plot(x, y, '*b', markersize=8, label='Local Airport In Peninsula') 

## plot legend
plt.legend(loc='upper center',fontsize=10,ncol=1,
           fancybox=True, shadow=True) 
      
### plot naming of the airports
labels = ['Penang','Kota Bharu','Kuala Lumpur','Kuantan']
for label, xpt, ypt in zip(labels, x, y):
    plt.text(xpt, ypt,label,color='r')
    
### AUTO FILE NAMING# 
import inspect
frame = inspect.currentframe()
path = inspect.getfile(frame)
fname = path.split('.')[0]
plt.savefig(fname + ".png",dpi=280, bbox_inches='tight')

### end copy script here ##

Paparan Imej:
Selamat mencuba!




Sunday, September 19, 2021

16-Python : Basemap Plotting With Etopo

 Assalam wbt. Jumpa lagi.

Post lalu kita telah melihat asas plotting basemap. Post kali ini saya akan berkongsi sedikit tambahan daripada post ke 15 yang lalu dengan mempelbagaikan map bagi tujuan tertentu. Kali ini saya akan menggunakan peta Etopo bagi menghasilkan peta yang cantik dan jelas kelihatan topografi mukabumi di sesebuah kawasan atau negara.

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

## copy script from here##
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap, cm

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

## setting frame size
fig = plt.figure(figsize=(10,8))

## setting area if interest
lat_min = -5
lat_max = 15.1
lon_min = 95
lon_max = 130

## main command plotting basemap
map = Basemap(projection = 'merc', llcrnrlat=lat_min, urcrnrlat=lat_max,llcrnrlon=lon_min, urcrnrlon=lon_max, resolution='h')

## draw coastlines
map.drawcoastlines(linewidth=0.5)

## draw countries boundary
map.drawcountries(linewidth=0.5)

## plot ETOPO
map.etopo()

## draw parallel lines
map.drawparallels(np.arange(-90,91,5),fontsize=10,
   labels=[1,0,0,0],color='black',linewidth=0.25)

## draw meridian lines
map.drawmeridians(np.arange(-180,180,5),fontsize=10,
labels=[0,0,0,1],color='black',linewidth=0.25)

## plot title
plt.title('Malaysia', 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##

Paparan imej:
Catatan:
a) Hanya command map.etopo()ini yang berbeza berbanding skrip terhadulu.

Selamat mencuba!.





15-Python : Basemap Plotting

 Assalam wbt. Jumpa lagi.

Post kali ini saya akan membincangkan bagaimana menggunakan library Basemap untuk membuat plot sesebuah kawasan atau area of interest bagi tujuan tertentu. Kelebihan plot menggunakan library Basemap adalah ia datang dalam  resolusi crude (c), low (l), intermediate (i), high (h) atau full (f). Semakin tinggi resolution digunakan semakin jelas ketampakan imej korang. Namun sebelum menggunakan basemap resolusi tinggi seperti high(h) dan full (f) anda harus install library tambahan iaitu hires. Sila gunakan anaconda command prompt di laptop/pc anda dengan command seperti berikut : conda install basemap-data-hires.

Kali ini kita akan cuba plot negara Malaysia termasuk beberapa negara kejiranan melalui penetapan kedudukan koordinat latitude dan longitude tertentu. Berikut adalah asas terhadap plotting area menggunakan basemap. Walau bagaimanapun, korang boleh melihat contoh-contoh yang tersedia di dalam python community yang banyak membincangkan teknik -teknik menarik menggunakan basemap. Untuk permulaan saya akan berkongsi teknik asas dahulu melalui penerangan mudah di ruangan catatan di bawah.

## copy script from here##
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap, cm

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

## setting frame size
fig = plt.figure(figsize=(10,8))

## setting area if interest
lat_min = -5
lat_max = 15
lon_min = 95
lon_max = 130

## main command plotting basemap
map = Basemap(projection = 'merc', llcrnrlat=lat_min, urcrnrlat=lat_max,llcrnrlon=lon_min, urcrnrlon=lon_max, resolution='h')

## draw coastlines
map.drawcoastlines(linewidth=0.5)

## draw countries boundary
map.drawcountries(linewidth=0.5)

## draw parallel lines
map.drawparallels(np.arange(-90,91,5),fontsize=10,
   labels=[1,0,0,0],color='black',linewidth=0.25)

## draw meridian lines
map.drawmeridians(np.arange(-180,180,5),fontsize=10,
labels=[0,0,0,1],color='black',linewidth=0.25)

## plot title
plt.title('Malaysia', 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##

Paparan Imej:

Catatan:
a) setting area of interest adalah tertakluk kepada pilihan korang. lat_min = latitude minimum, lat_max = latitude maximum, lon_min = longitude minimum dan lon_max = longitude maximum.

b) map = Basemap( ) merujuk kepada standard command bagi plotting area dengan beberapa ciri tambahan seperti jenis projection yang digunakan "merc" atau mercator serta resolution h (high). Korang boleh guna resolution yang bawah dahulu seperti low (l) atau intermediate (i) namun banyak pulau-pulau kecil tidak akan kelihatan. Plotting menggunakan resolution tinggi high atau full akan menyebabkan system running perlahan tetapi hampir keseluruhan pulau-pulau atau kawasan kecil boleh dilihat agak jelas.

c) map.drawcoastlines( ) merujuk kepada plotting coastal line dengan ciri tambahan seperti line thickness pada 0.5.

d) map.drawcountries( ) merujuk kepada plotting sempadan negara dengan ciri tambahan seperti line thickness pada 0.5.

e) map.drawparallels( ) merujuk kepada draw parallel line atau line latitide menegak dengan ciri tambahan seperti warna line, thickness,fontsize dan kedudukan label latitude.

f) map.drawmeridians( )merujuk kepada draw meridiean line atau line longitude melintang dengan ciri tambahan seperti warna line, thickness,fontsize dan kedudukan label longitude.

Selamat mencuba!.

Saturday, September 18, 2021

14-Python: Plot Simple Lines

 Assalam wbt. Jumpa lagi.

Post lepas kita telah belajar tentang plot carta bar berkembar daripada data hujan.dat. Kali ini kita akan terus mara ke hadapan untuk membuat plot lines menggunakan data yang sama iaitu hujan.dat. Pada masa yang sama ada beberapa features lain yang akan dipelajar di dalam skrip ini dan akan diterangkan di bahagian catatan di bawah.

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

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

data1=np.loadtxt('hujan.dat')

day=data1[:,0]
semenanjung=data1[:,1]
sabah=data1[:,2]

N=13
ind = np.arange(N)

fig = plt.figure(figsize=(8,4)) 
plt.subplot(111)
ax=fig.gca()
ax.grid(alpha=0.2)

# plot hujan di Semenanjung
plt.plot(semenanjung,'*-b', label='Semenanjung', linewidth=1.1, markersize=8)

# plot hujan di Sabah-Sarawak
plt.plot(sabah,'^-r',label='Sabah-Sarawak', linewidth=1.1, markersize=8) 

# Label paksi x
ax.set_xticks(ind)
name_label=['13','14','15','16','17','18','19','20','21','22','23','24','25']

ax.set_xticklabels(name_label) 

# Tetapkan had nilai paksi y
plt.ylim(0,1200)
plt.xlabel('Rainfall Date')
plt.ylabel('Total Daily Rainfall (mm)')

# Setting kotak legend
plt.legend(loc='upper center', fontsize=11,ncol=2, fancybox=True,
                  facecolor='pink',framealpha=0.2) 

plt.title('Total Daily Rainfall from 13-25 December')

#### save output ##
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 here ##

Paparan imej:
Catatan:
a) plt.subplot(111) sama maksud dengan plt.subplot(1,1,1).

b) ax.grid(alpha=0.2)merujuk kepada  plot grid lines dalam frame dengan ketebalan line 0.2.

c) plt.plot( ) adalah command standard bagi plot line dengan beberapa ciri tambahan seperti jenis marker, saiz marker dan ketebalan line.

d) ax.set_xticks(ind) setting paksi x mengikut bilangan data sebenar iaitu N=13 (13 hari).

e) plt.legend( ) dengan beberapa ciri tambahan seperti penggunaan warna pink transparensi di dalam kotak legend pada nilai transparensi 0.2.

Selamat mencuba!





13-Python : Split Two Bar Chart

 Assalam wbt. Jumpa lagi.

Post yang lalu kita telah lihat bagaimana untuk plot multiple carta bar di dalam satu frame. Kali ini kita akan lihat bagaimana untuk plot carta bar terpisah (splitting) atau bar berkembar di dalam satu frame plot yang sama. Data yang digunakan adalah data hujan.dat iaitu contoh sejumlah data hujan harian yang dicerap pada 13 - 25 Disember di beberapa stesen di Semenanjung dan Sabah-Sarawak. Sila copy dan save data sebagai hujan.dat di dalam folder kerja korang.

13 87.8 40.4
14 368.7 53.2
15 696.3 82.4
16 567.8 105.4
17 937.8 271
18 339.1 280
19 447.9 127.6
20 392.1 140.4
21 515 428.2
22 1071.8 202.8
23 936.5 282.4
24 681.8 100.2
25 315.9 59

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

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

fig = plt.figure(figsize=(6,5)) 
ax=plt.gca()

data1=np.loadtxt('hujan.dat')

day=data1[:,0]
semenanjung=data1[:,1]
sabah=data1[:,2]

N=13
ind = np.arange(N)
width=0.4

# plot bar Semenanjung
barA=ax.bar(ind, semenanjung,color = 'blue', width=width, align='center', label='Semenanjung')

# plot bar Sabah-Sarawak
barB=ax.bar(ind+width, sabah,color = 'red', width=width, align='center', label='Sabah-Sarawak')

# namakan paksi x
name_label=['13','14','15','16','17','18','19','20','21','22',
'23','24','25']

# lokasi label paksi x
ax.set_xticks(ind + width / 2)
ax.set_xticklabels(name_label)

# limit paksi y
plt.ylim(0,1200)

# plot legend
plt.legend(loc='upper center', fontsize=10,
          ncol=2, fancybox=True, shadow=True,facecolor='white')

plt.xlabel('Rainfall Date')
plt.ylabel('Total Daily Rainfall (mm)')
plt.title('Total Daily Rainfall from 13-25 December')

## save output image ##
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 here ##

Paparan Imej:

Catatan:
a) Command plt.rcParams.update({'font.size':12,'font.family':'arial'}) merujuk kepada default setting saiz font dan jenis font yang digunakan untuk keseluruhan plot.

b) command ax=plt.gca() merujuk kepada sebarang tambahan plot di dalam frame.

c) command align='center' merujuk kepada setting bar di tengah.

d) command label='Sabah-Sarawak' merujuk kepada label yang diberikan kepada bar.

e) command name_label= ['13','14','15','16','17','18','19','20','21',
'22','23','24','25'] adalah label yang diberikan di paksi x. Pastikan ianya adalah data string.

f) command ax.set_xticks(ind + width / 2) adalah setting agar label di paksi x berada betul-betul ditengah antara 2 bar.

g) command plt.ylim(0,1200) adalah nilai had maksimum yang ditetapkan di paksi y.

h)command plt.legend(loc='upper center', fontsize=10,ncol=2, fancybox=True, shadow=True,facecolor='white') merujuk kepada setting legend yang terletak di atas tengah dengan ciri-ciri tambahan seperti ada shadow box,background putih, font 10 serta bilangan column adalah 2. Semua ciri tambahan boleh diubahsuai ikut keselesaan korang.

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