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!





12-Python : Plotting Multiple Bar Chart

 Assalam wbt. Jumpa lagi.

Post ke-11 yang lalu kita telah belajar bagaimana untuk setting banyak plot dalam satu frame. Post kali ini kita akan cuba untuk plot beberapa carta bar seperti yang dibincangkan di post ke-10 menggunakan data2.dat.

### copy script from here #######

import matplotlib.pyplot as plt
import numpy as np

fname='data2.dat'
data1=np.loadtxt(fname,skiprows=1)
data1[data1<0.0]=0.0
data1[data1==0.01]=0.0
data1[np.isnan(data1)]=0.0

station1=data1[:,0]
station1=station1.astype(int) 

lat1=data1[:,1]
lon1=data1[:,2]
rain1=data1[:,3]
rain2=data1[:,4]
rain3=data1[:,5]

N = 17  ## total bar
ind = np.arange(N)  
width = 0.95       # the width of the bars

color1='red' 
color2='blue'
color3='green'

## SETTING PLOT AREA 3 IMAGES IN (1x3) ###

fig = plt.figure(figsize=(11,5)) 

plt.subplot(1,3,1)
plt.bar(ind, rain1, width, color=color1, tick_label = station1,
        edgecolor="black",linewidth=0.5)
plt.xticks(rotation=90)
plt.xlabel('Meteorological Stations')
plt.ylabel('Hourly Rainfall (mm)')
plt.title('Rain 1')

plt.subplot(1,3,2)
plt.bar(ind, rain2, width, color=color2, tick_label = station1,
        edgecolor="black",linewidth=0.5)
plt.xticks(rotation=90)
plt.xlabel('Meteorological Stations')
plt.ylabel('Hourly Rainfall (mm)')
plt.title('Rain 2')

plt.subplot(1,3,3)
plt.bar(ind, rain3, width, color=color3, tick_label = station1,
        edgecolor="black",linewidth=0.5)
plt.xticks(rotation=90)
plt.xlabel('Meteorological Stations')
plt.ylabel('Hourly Rainfall(mm)')
plt.title('Rain 3')

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

### end copy script here ##

Paparan Imej:

Selamat mencuba!


11-Python: Setting Plotting Frame

 Assalam wbt. Jumpa lagi.

Post lepas kita telah mempelajari bagaimana untuk membuat satu plot carta bar di dalam satu frame. Kali ini kita cuba untuk membuat setting jika ingin membuat banyak plot di dalam satu frame. Mungkin 2 plot, 3 plot, 4 plot atau lebih daripada itu. Untuk post kali ini kita akan melihat terlebih dahulu basic command jika ingin membuat banyak plot di dalam satu frame menggunakan library numpy and matplotlib.

Seperti biasa sila copy skrip berikut dan simpan ke dalam folder kerja korang menggunakan nama fail masing-masing dengan extension *.py.

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

plt.rcParams.update({'font.size':12,'font.family':'arial'}) 
plt.rcParams['xtick.labelsize']=10
plt.rcParams['ytick.labelsize']=10


## SETTING PLOT AREA 4 IMAGES IN (2 X 2)#
## setting frame size

fig = plt.figure(figsize=(10,10)) 

plt.subplot(2,2,1)
plt.text(0.3, 0.5, "(2,2,1)", fontsize=30)

plt.subplot(2,2,2)
plt.text(0.3, 0.5, "(2,2,2)", fontsize=30)

plt.subplot(2,2,3)
plt.text(0.3, 0.5, "(2,2,3)", fontsize=30)

plt.subplot(2,2,4)
plt.text(0.3, 0.5, "(2,2,4)", fontsize=30)

#### 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 your copy here ##

Paparan Imej output:



Catatan:
a) (2,2,1) merujuk kepada imej adalah terdiri daripada 2 x 2 (2 baris dan 2 lajur) di mana 1 adalah merujuk kepada imej PERTAMA dan seterusnya. 
b) Jika mahu plot sejumlah imej lain, sila gunakan panduan skrip di bawah

## SETTING PLOT AREA 3 IMAGES IN (1x3) ###

fig = plt.figure(figsize=(10,6)) 

plt.subplot(1,3,1)
plt.text(0.3, 0.5, "(1,3,1)", fontsize=30)

plt.subplot(1,3,2)
plt.text(0.3, 0.5, "(1,3,2)", fontsize=30)

plt.subplot(1,3,3)
plt.text(0.3, 0.5, "(1,3,3)", fontsize=30)

Paparan Imej output:


## SETTING PLOT AREA 2 IMAGES IN (1x2) ###
fig = plt.figure(figsize=(10,8)) 

plt.subplot(1,2,1)
plt.text(0.3, 0.5, "(1,2,1)", fontsize=30)

plt.subplot(1,2,2)
plt.text(0.3, 0.5, "(1,2,2)", fontsize=30)

Paparan Imej output:


## SETTING PLOT AREA 2 IMAGES IN (2 x 1) ###

fig = plt.figure(figsize=(6,10)) 

plt.subplot(2,1,1)
plt.text(0.3, 0.5, "(2,1,1)", fontsize=30)

plt.subplot(2,1,2)
plt.text(0.3, 0.5, "(2,1,2)", fontsize=30)

Paparan Imej output:

Catatan:
a) fig = plt.figure(figsize=(6,10)) harus diubah suai mengikut kesesuaian saiz plot.
b) plt.text(0.3, 0.5, "(2,1,2)", fontsize=30) merujuk kepada menambah teks "(2,1,2)" atau sebarang teks ke dalam area plot. 0.3 merujuk kepada point paksi x dan 0.5 point di paksi y.


Selamat mencuba!



10-Python: Plotting Simple Bar Chart

 Assalam wbt. Jumpa lagi.

Post yang lalu anda telah lihat bagaimana untuk membuat pembetulan kepada mana-mana elemen yang tidak diingini di dalam operasi korang. Kali ini dengan menggunakan dataset yang sama daripada data2.dat kita akan cuba untuk membuat carta bar menggunakan library matplotlib. 

############# start copy script from here ###############################

import matplotlib.pyplot as plt
import numpy as np

fname='data2.dat'
data1=np.loadtxt(fname,skiprows=1)
data1[data1<0.0]=0.0
data1[data1==0.01]=0.0
data1[np.isnan(data1)]=0.0

## convert float to integer sebagai label carta
station1=data1[:,0]
station1=station1.astype(int) 

lat1=data1[:,1]
lon1=data1[:,2]
rain1=data1[:,3]
rain2=data1[:,4]
rain3=data1[:,5]


N = 17  ## total bar
ind = np.arange(N)  # set total bar in array
width = 0.95       # the width of the bars

### single color bar
colors='red' 

### set layout map and size
fig = plt.figure(figsize=(5,4))

## main command plot bar chart
plt.bar(ind, rain1, width, color=colors, tick_label = station1,
        edgecolor="black",linewidth=0.5)

##set x-axis label as vertical
plt.xticks(rotation=90)

## naming the x-axis
plt.xlabel('Meteorological Stations')

## naming the y-axis
plt.ylabel('Hourly Rainfall')

## plot title
plt.title('Rainfall Bar Chart')
 

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

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

Output image
Catatan:
a) fname di dalam data1=np.loadtxt(fname,skiprows=1)merujuk kepada kaedah lain untuk memanggil nama fail data namun harus di declare terdahulu sebelum statement sebagai fname='data2.dat'.

b)fig = plt.figure(figsize=(5,4)) adalah format setting plotting area berkeluasan 5 x 4 inci di mana paksi x adalah 5 inci dan paksi y adalah 4 inci.

c) station1=station1.astype(int) adalah bagi menukar float value kepada integer. Nilai asal station adalah berbentuk code mewakili nama station, seharusnya bagi tujuan label pada paksi x nama station haruslah integer.

d) Auto file naming merujuk kepada kaedah menyimpan fail output sama seperti fail skrip yang ditetapkan. Sebagai contoh jika anda tetapkan latihan ini sebagai Python1.py makanya imej output korang juga akan mengikut nama yang sama iaitu Python1.png (*.png). Anda boleh simpan output imej sebagai *.jpg atau *.tiff.

Selamat mencuba!





Friday, September 17, 2021

9-Python: Data Correction Base On Condition

 Assalam wbt. Jumpa lagi.

Post yang lepas kita telah mempelajari bagaimana kita boleh import data *.dat atau *.csv lalu melihat isi kandungan data serta membuat filter terhadap mana-mana data yang ada di dalamnya serta menyimpan ke dalam fail output berasingan. Post kali ini kita akan bergerak ke hadapan lagi untuk membuat correction terhadap mana-mana elemen dalam data berdasarkan condition yang ditetapkan. Ada sesetengah data mungkin didapati rosak, hilang atau tidak memenuhi kehendak pengguna bagi melaksanakan sebarang tugas terhadapnya. Data-data tersebut seharusnya diproses terlebih dahulu bagi mengurangkan error semasa running process di dalam python.

Post kali ini saya menggunakan data hampir sama seperti data1.dat tetapi sedikit perubahan dilakukan terhadap dataset untuk tujuan post kali ini. Copy data ini dan save sebagai data2.dat dan simpan ke dalam folder tugas korang. Data ini mengandungi some elemen yang tidak diperlukan di dalam proses pengiraan seperti -9999, Nan dan 0.01. Elemen ini pada hakikatnya mempunyai maksud tertentu di dalam bidang meteorologi namun kali ini kita andaikan ianya tidak diperlukan dan di assigned  dengan sesuatu nilai iaitu 0.0. Data yang telah dibuat pembetulan akan disimpan ke dalam fail berasingan iaitu output-data2.dat.

data2.dat
station lat lon rain1 rain2 rain3
48604 6.483 100.267 0.2 -9999 1.6
48600 6.333 99.733 1.6 NaN 16.6
48603 6.2 100.4 0.4 -9999 1.2
48602 5.457 100.388 4.6 NaN 20.2
41529 5.35 100.4 5.6 -9999 28.8
48601 5.297 100.272 2.4 0.01 7.6
48620 4.221 100.701 0.2 0.01 -9999
48625 4.567 101.1 3.4 -9999 21.4
48632 4.467 101.367 19.6 -9999 0.6
48642 3.967 102.35 0.6 -9999 -9999
48648 3.102 101.645 51.4 7.2 2.8
48647 3.131 101.553 10.4 1 27.8
48665 2.267 102.25 84 0.2 -9999
48615 6.164 102.301 1.8 1.6 6.4
48616 5.533 102.2 2 NaN 10.2
48618 5.383 103.1 2.6 -9999 7.2
48619 5.333 103.133 0.3 7.6 11.1

################## copy skrip di sini ######################
import numpy as np

data2=np.loadtxt('data2.dat',skiprows=1)
data2[data2<0.0]=0.0
data2[data2==0.01]=0.0
data2[np.isnan(data2)]=0.0

station=data2[:,0]
lat1=data2[:,1]
lon1=data2[:,2]
rain1=data2[:,3]
rain2=data2[:,4]
rain3=data2[:,5]

np.savetxt('output-data2.dat',data2,fmt='%9.3f')
################ end copy here ##############################

Catatan:
a) data2[data2<0.0]=0.0 merujuk kepada syarat yang dikenakan kepada kesemua data2 yang bernilai <0.0 atau negatif harus ditukar kepada nilai baharu iaitu 0.0

b) data2[data2==0.01] merujuk kepada syarat yang dikenakan kepada kesemua data2 yang bernilai tepat 0.01 arus ditukar kepada nilai baharu iaitu 0.0

c) data2[np.isnan(data2)]=0.0 merujuk kepada syarat yang dikenakan kepada kesemua data2 yang bernilai NaN (Not A Number) kepada nilai baharu iaitu 0.0.

d) Korang boleh meletakkan sebarang nilai seperti yang diinginkan menggunakan kaedah yang sama namun harus berhati hati agar tidak merubah nilai yang penting.

e) Declaration bagi setiap column data adalah terpakai seperti kes-kes yang telah dibincangkan sebelum ini. Seterusnya korang boleh meneruskan operasi program seperti biasa.

f) Akhir sekali kesemua data yang telah diproses disimpan ke dalam fail berasingan baharu iaitu output-data2.dat. Sila rujuk fail output tersebut bagi melihat perubahan terhadap data.

output-data2.dat
48604.000     6.483   100.267     0.200     0.000     1.600
48600.000     6.333    99.733     1.600     0.000    16.600
48603.000     6.200   100.400     0.400     0.000     1.200
48602.000     5.457   100.388     4.600     0.000    20.200
41529.000     5.350   100.400     5.600     0.000    28.800
48601.000     5.297   100.272     2.400     0.000     7.600
48620.000     4.221   100.701     0.200     0.000     0.000
48625.000     4.567   101.100     3.400     0.000    21.400
48632.000     4.467   101.367    19.600     0.000     0.600
48642.000     3.967   102.350     0.600     0.000     0.000
48648.000     3.102   101.645    51.400     7.200     2.800
48647.000     3.131   101.553    10.400     1.000    27.800
48665.000     2.267   102.250    84.000     0.200     0.000
48615.000     6.164   102.301     1.800     1.600     6.400
48616.000     5.533   102.200     2.000     0.000    10.200
48618.000     5.383   103.100     2.600     0.000     7.200
48619.000     5.333   103.133     0.300     7.600    11.100

Selamat mencuba!

8-Python : Filter dan Save Output Menggunakan Library Pandas

 Assalam wbt. Jumpa lagi.

Dalam post yang lepas* korang telah diajar bagaimana untuk import data *.dat dan membuka data tersebut menggunakan library numpy (np.loadtxt) namun kali ini kita akan melihat bagai mana filtering terhadap data boleh dilakukan menggunakan library Pandas serta menyimpan hasil filtering ke dalam fail output berasingan menggunakan library numpy (np.savetxt)

Sila rujuk post 7-Python : Import data (*.dat) format and running script in Notepad or any Editpad editor bagi mendapatkan data1.dat.

################# mula copy dari sini ######################

import numpy as np

data1=np.loadtxt('data1.dat',skiprows=1)

station=data1[:,0]
lat1=data1[:,1]
lon1=data1[:,2]
rain1=data1[:,3]
rain2=data1[:,4]
rain3=data1[:,5]

## METHOD FILTERING USING LIBRARY PANDAS

import pandas as pd

df = pd.DataFrame({"Station": station, "Latitude": lat1,
"Longitude": lon1,"Rain at 4 pm": rain1,"Rain at 5 pm":rain2,
"Rain at 6 pm":rain3})

df1 = df.loc[(df["Rain at 4 pm"] > 10)]
print(df1)

### METHOD SAVING DESIRED OUTPUT

np.savetxt('Output.dat',df1,fmt='%9.3f')

################## program end ###########################

Contoh paparan output.dat

48632.000     4.467   101.367    19.600     0.000     0.600
48648.000     3.102   101.645    51.400     7.200     2.800
48647.000     3.131   101.553    10.400     1.000    27.800
48665.000     2.267   102.250    84.000     0.200     0.000

Catatan:
a) Filtering rain at 4 pm atau column rain 1 bagi jumlah hujan melebihi 10 mm dilakukan.

b) df = pd.DataFrame({}) merujuk kepada format standard untuk declare kesemua list di dalam data ke dalam format baharu dataframe pandas.

c) df1 = df.loc[ ] merujuk kepada format standard kaedah filter jumlah hujan melebihi 10 mm di column rain1. Filter boleh dikembangkan kepada column lain seperti rain2 atau rain3 atau gabungan seperti df1 = df.loc[(df["Rain at 4 pm"] > 10) & (df["Rain at 6 pm"] > 2)] dipisahkan dengan simbol &

d) np.savetxt('Output.dat',df1,fmt='%9.3f') merujuk kepada standard command save text kepada data yang telah difilter iaitu df1 ke dalam fail berasingan iaitu "output.dat" pada format data fmt='%9.3f' yang terdiri daripada 3 titil perpuluhan. Korang boleh lihat file output tersebut ke dalam folder kerja korang.

Selamat mencuba!.


7-Python : Import data (*.dat) format and running script in Notepad or any Editpad editor

 Assalam wbt. Jumpa lagi.

Kali ini kita akan melakukan kerja simple programming menggunakan notepad atau editpad editor yang korang ada. Panduan sebelum ini kita menggunakan editor di spyder console namun kita menghadapi masalah jika ingin mengulangi semula atau membuat pembetulan terhadap mana-mana skrip jika kajian kes kita adalah tersangat panjang. Kali ini kita akan cuba untuk save semua kerja kita ke dalam notepad atau editpad yang ada dalam komputer korang. Saya sangat gemar menggunakan editor EditPad Lite 7 yang mana korang boleh download dan install secara percuma daripada online.

Kali ini kita maju sedikit dengan import data luar format *.dat atau *.csv bagi melihat dan membuat sedikit manipulasi terhadap data-data tersebut. namun matlamat utama adalah untuk menyediakan syntax atau skrip ke dalam editpad agar mudah untuk kita meyimpan dan mengulangi pada masa akan datang.

Contoh data : 
Data1.dat adalah set data jumlah hujan pada jam 4 petang (rain1), 5 petang (rain2) dan 6 petang (rain3) bagi 17 lokasi di Malaysia.

data1.dat

Berikut adalah kaedah mudah bagaimana untuk membaca data1.dat menggunakan python.

####### mula copy dari sini ###################################

import numpy as np

data1=np.loadtxt('data1.dat',skiprows=1)

station=data1[:,0]
lat1=data1[:,1]
lon1=data1[:,2]
rain1=data1[:,3]
rain2=data1[:,4]
rain3=data1[:,5]

### bagi melihat kandungan data
print(station)
print(rain1)
print(rain3)
#print(lat1)
#print(lon1)

##data manipulation
rain4=rain2+rain3
rain5=3*rain2

print(rain4)
print(rain5)

### setting condition
rain6=rain1[rain1>5]
print(rain6)
####################### tamat dan save skrip #################

Catatan:
a) Berikan nama kepada fail skrip anda dan save menggunakan file extension .py ke mana-mana folder kerja korang.

b) simbol ### merujuk kepada "comment out" statement standard dalam Python yang tidak akan di baca dalam skrip. Anda boleh tulis apa apa sahaja namun pastikan setiap line ayat hendaklah dimulakan dengan #.

c) Panduan, jika ingin membaca output satu demi satu, sila comment out (#)  mana-mana print ( ) statement yang tidak diperlukan.

d) data1[:,0] merujuk kepada list column pertama dalam set data (station), data1[:,1] list column kedua (lat), data1[:,2] list column ketiga (lon), data1[:,3] list column keempat (rain1) dsb.

e) station=data1[:,0] merujuk kepada "declaration station" kepada list dalam column 1 dan seterusnyaKorang boleh declare apa apa nama yang sesuai mengikuti definisi sendiri kerana ianya tiada batasan.

f) Declaration rain6 merujuk kepada jumlah hujan dari rain1 yang melebihi 5 mm.

g) skiprows=1 di dalam np.loadtxt('data1.dat',skiprows=1)merujuk kepada row pertama yang diabaikan di dalam data kerana ianya bukan primer data yang dikehendaki cuma sekadar labeling sahaja.
 
Disediakan data1.dat untuk korang. Copy dan save ke dalam editpad korang.

station lat lon     rain1    rain2    rain3
48604 6.483 100.267     0.2      0         1.6
48600 6.333 99.733     1.6      0         16.6
48603 6.2 100.4     0.4      0         1.2
48602 5.457 100.388     4.6      0         20.2
41529 5.35 100.4     5.6      0         28.8
48601 5.297 100.272     2.4      0.01       7.6
48620 4.221 100.701     0.2      0.01       0
48625 4.567 101.1     3.4      0         21.4
48632 4.467 101.367     19.6     0         0.6
48642 3.967 102.35     0.6      0         0
48648 3.102 101.645     51.4     7.2 2.8
48647 3.131 101.553     10.4     1         27.8
48665 2.267 102.25     84      0.2 0
48615 6.164 102.301     1.8      1.6 6.4
48616 5.533 102.2     2      0         10.2
48618 5.383 103.1     2.6      0         7.2
48619 5.333 103.133     0.3      7.6 11.1

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