Anda di halaman 1dari 35

DATA SCIENCE

MATPLOTLIB
DATA VISUALIZATION – DATA SCIENCE [12]
• Matplotlib adalah sebuah library di Python yang sering digunakan
untuk visualisasi data. Matplotlib dilengkapi dengan scripting
interface yang direpresentasikan dengan pyplot untuk memudahkan
kita membuat grafik.
• Arsitektur matplotlib terdiri dari tiga layer utama, yaitu backend layer,
artist layer, dan scripting layer.
• Matplotlib dapat digunakan di banyak tools, salah satunya Jupyter
Notebook, yang sedang kita gunakan saat ini. Seperti library yang
lainnya, matplotlib harus di-install terlebih dahulu.
Figure dan Axes di Matplotlib
• Figure adalah objek Matplotlib
yang mengandung semua
elemen dari sebuah grafik,
sedangkan Axes merupakan
tempat dimana method untuk
plotting didefinisikan,
termasuk method untuk
membuat dan memanipulasi
garis axis, grid, label tick,
ataupun background.
Jika kita asumsikan seperti melukis,

Figure adalah kertasnya atau kanvasnya, sedangkan Axes adalah


gambarnya.

Figure setidaknya mengandung satu Axes.

Satu plot (gambar) adalah satu Axes, jadi misalnya kita akan
membuat sebuah Figure terdiri dari beberapa plot, katakanlah 4
plot, berarti Figure tersebut harus memiliki 4 Axes.
Membuat plot sederhana
Untuk membuat sebuat plot, kita harus mengimpor matplotlib.pyplot terlebih dahulu.

plt disini adalah sebagai singkatan agar saat dipanggil kita tidak perlu repot menuliskan
matplotlib.pyplot tetapi cukup dengan plt. Sama halnya kita menyingkat Pandas dengan pd
dan Numpy dengan np.

Ada dua cara yang dapat kita gunakan yaitu cara Explicit dan Implicit.
Explicit
Disini kita akan membuat grafik sederhana dari dua buah kumpulan bilangan yang
didefinisikan di dalam dua buah list, yaitu x dan y

Jika menggunakan cara explicit, kita


diharuskan membuat objek figure dan axes
terlebih dahulu.

Cara ini terbilang sedikit rumit, namun


direkomendasikan jika kita ingin membuat
visualisasi data yang lebih kompleks.

Dengan cara ini, kita dapat mengontrol


berbagai macam komponen yang terdapat
di dalam objek figure dan axes.

Untuk menampilkan visualisasi data kita


dapat memanggil method show() di akhir
blok kode, baik dengan cara explicit
maupun implicit.
Implicit
Dengan menggunakan data yang sama, mari kita coba praktekkan penggunaan cara implicit
untuk visualisasi data.

Kode yang digunakan untuk


membuat plot yang sama
dengan sebelumnya terlihat
lebih sederhana.
Plotting multiple data
dalam satu Axes

Kita juga bisa memplot dua data dalam


satu Axes.

Pada contoh ini, kita akan


menggunakan Numpy untuk
mengenerate bilangan sehingga kita
perlu mengimpor Numpy terlebih
dahulu.
Mengatur style
Kita dapat mengatur style di Matplotlib. Untuk mengetahui style apa saja yang tersedia,
kita dapat mengeceknya dengan kode di bawah ini.
Sekarang mari kita coba atur style untuk data trigonometri yang sebelumnya.
Misalnya kita coba style tableaucolorblind10.
Sekarang kita coba dengan style ggplot.
Menyimpan gambar
Untuk menyimpan gambar grafik yang telah dibuat, kita dapat menggunakan method savefig()
yang diberikan argumen berupa nama file gambar yang ingin kita simpan. Misalnya dari contoh
sebelumnya, kita ingin menyimpan gambar hasil visualisasi data tersebut dengan nama
contoh_visualisasi.png.

Setelah itu, coba Anda cek di folder yang sama dengan yang Anda gunakan untuk
menyimpan file notebook ini, file contoh_visualisasi.png otomatis tersimpan disana.
BAR PLOT
DATA VISUALIZATION – DATA SCIENCE [12-1]
Dataset
Dataset yang digunakan adalah dataset Automobile yang berasal dari UCI Machine Learning Repository.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')

column_names = ['symboling', 'normalized-losses', 'make', 'fuel-type', 'aspiration',


'num-of-doors', 'body-style', 'drive-wheels', 'engine-location',
'wheel-base', 'length', 'width', 'height', 'curb-weight', 'engine-type',
'num-of-cylinders', 'engine-size', 'fuel-system', 'bore', 'stroke',
'compression-ratio', 'horsepower', 'peak-rpm', 'city-mpg', 'highway-mpg',
'price']

df = pd.read_csv('datasets/automobile.data', names=column_names)
df.head()
Seperti yang kita lihat dari contoh dataframe df, ada beberapa cell yang
mengandung missing values berupa simbol tanda tanya ?.

Oleh karena itu, kita harus menangani dulu missing values ini.

Pertama, kita harus mengubah dulu tanda ? menjadi NaN.

df = df.replace('?', np.nan)
# Menghapus baris yang mengandung mising values di kolom price
df.dropna(subset=['price'], axis=0, inplace=True)

# Me-reset indeks karena ada data yang terhapus


df.reset_index(drop=True, inplace=True)

# Mengganti missing values dengan 'four' untuk kolom num-of-doors


df['num-of-doors'].fillna('four', inplace=True)
Kemudian kita hapus data yang menganding
NaN pada kolom price menggunakan dropna(). # Mengganti missing values dengan mean-nya untuk kolom lainnya
avg_norm = df['normalized-losses'].astype('float').mean(axis=0)
df['normalized-losses'].replace(np.nan, avg_norm, inplace=True)
Sementara itu, untuk kolom lainnya, kita ganti
nilai NaN dengan nilai tertentu. avg_stroke = df['stroke'].astype('float').mean(axis=0)
df['stroke'].replace(np.nan, avg_stroke, inplace=True)

avg_bore = df['bore'].astype('float').mean(axis=0)
df['bore'].replace(np.nan, avg_bore, inplace=True)

avg_horse = df['horsepower'].astype('float').mean(axis=0)
df['horsepower'].replace(np.nan, avg_horse, inplace=True)

avg_peak = df['peak-rpm'].astype('float').mean(axis=0)
df['peak-rpm'].replace(np.nan, avg_norm, inplace=True)

df.head()
Selanjutnya kita ganti tipe datanya.

df[['bore', 'stroke', 'peak-rpm']] = df[['bore', 'stroke', 'peak-


rpm']].astype('float')
df[['normalized-losses', 'horsepower']] = df[['normalized-losses',
'horsepower']].astype('int')
df[['price']] = df[['price']].astype('float')

Sekarang kita cek info dataframe df


setelah penanganan missing values.
Visualisasi data dengan Bar Plot
• Dalam praktek kali ini, kita akan menggunakan kolom make untuk
melihat total jumlah mobil dari masing-masing merek yang ada dalam
dataframe tersebut.
• Untuk memperoleh jumlah mobil atau data dari masing-masing
merek, kita dapat menggunakan method size() dengan
mengelompokkannya berdasarkan kolom make. Setelah itu, kita
masukkan data tersebut menjadi sebuah dataframe baru, misalnya
disini kita beri nama variabel dataframe baru dengan df_tot.
# Membuat dataframe total data untuk masing-masing merek mobil

group_make = df.groupby('make').size()
df_tot = pd.DataFrame(group_make).reset_index()
df_tot = df_tot.rename(columns={0: 'total'})
df_tot
Setelah dataframe siap, kita dapat memvisualisasikannya dengan bar plot seperti di bawah ini

# Visualisasi dengan bar plot

plt.figure(figsize=(16,8))
plt.bar(df_tot['make'], df_tot['total'])

plt.title('Total for Each Make', size=18)


plt.xlabel('\nMake', size=14)
plt.ylabel('Total\n', size=14)
plt.xticks(size=14, rotation=90)
plt.yticks(size=14)
plt.show()

Kita dapat menggunakan method bar() dari


Matplotlib yang diberi argumen berupa data
yang akan dimasukkan ke sumbu x dan sumbu
y. Dalam hal ini, kita menetapkan
df_tot['make'] sebagai sumbu x, dan
df_tot['total'] sebagai sumbu y.
Mengatur warna
Untuk mengatur warna bar, kita dapat menambahkan parameter color
dan memberikan nama warna yang diinginkan.

# Mengatur warna bar


plt.figure(figsize=(16,8))
plt.bar(df_tot['make'], df_tot['total'], color='green')

plt.title('Total for Each Make', size=18)


plt.xlabel('\nMake', size=14)

plt.ylabel('Total\n', size=14)
plt.xticks(size=14, rotation=90)
plt.yticks(size=14)
plt.show()

Selain dengan memberikan nama warnanya, kita juga dapat


menggunakan kode warna hexagonal.
Menambahkan label di ujung bar
Kita juga menambahkan label di ujung bar. Untuk menambahkan label, kita perlu menggunakan cara explicit
yaitu dengan membuat figure dan axes karena agak rumit. Perhatikan kode di bawah ini.

fig, ax = plt.subplots(figsize=(16,8))
plot_data = ax.bar(df_tot['make'], df_tot['total'], color='#c60cef',
width=0.85)

for rect in plot_data:


height = rect.get_height()
ax.annotate('{}'.format(height),
xy=(rect.get_x() + rect.get_width() / 2, height),
xytext=(0, 2),
textcoords='offset points',
ha='center',
va='bottom',
fontsize=14)

plt.title('Total for Each Make', size=18)


plt.xlabel('\nMake', size=14)
plt.ylabel('Total\n', size=14)
plt.xticks(size=14, rotation=90)
plt.yticks(size=14)
plt.show()
Dari kode di atas untuk menambahkan label di atas masing-masing bar, kita dapat menggunakan annotate()
yang diletakkan di dalam perulangan for.

• get_height() digunakan untuk mendapatkan tinggi dari bar.


• get_x() digunakan untuk mendapatkan kooordinat kiri dari bar.
• get_width() digunakan untuk mendapatkan lebar dari bar.

Parameter dari annotate(


• xy : Titik koordinat x,y atau titik dimana kita akan menuliskan label.
• xytext : Posisi penulisan label, default-nya adalah nilai xy.
• textcoords : Sistem koordinat, ada dua nilai yang dapat diberikan, yaitu offset points atau offset
pixels.
• ha : Horizontal Alignment
• va : Vertical Alignment
• fontsize : Ukuran huruf

Ada beberapa parameter lagi dari annotate() yang tidak digunakan di praktek ini, namun mungkin akan
berguna untuk penggunaan lainnya.
Grouped bar chart
• Kita juga dapat membuat grouped bar chart. Misalnya kita ingin
membuat bar chart dimana kita ingin menampilkan jumlah data
untuk masing-masing body-style yang dikelompokkan juga
berdasarkan fueltype.
• Pertama kita harus membuat dataframe baru untuk menampung data
yang dibutuhkan. Disini, kita mengelompokkan data berdasarkan
body-style dan fuel-type dan mengkalkulasi jumlahnya menggunakan
size(). Setelah itu, kita buat dataframe dari pengelompokkan tersebut.
body_style = df.groupby(['body-style', 'fuel-type']).size()
df_body = pd.DataFrame(body_style).reset_index()
df_body = df_body.rename(columns={0: 'total'})
df_body

Kita perlu membuat list yang berisi nilai unik dari kolom body-
style yang akan digunakan sebagai xticklabels nantinya.
Sekarang kita filter dataframe df_body untuk data dengan fuel-type =='gas'
dan menyimpannya sebagai dataframe gas.

gas = df_body[df_body['fuel-type']=='gas'].sort_values(
by='body-style').reset_index(drop=True)
gas

Lakukan hal yang sama untuk fuel-type == 'diesel'.

diesel = df_body[df_body['fuel-type']=='diesel']
diesel
Jika kita lihat dari dataframe diesel, hanya ada 4 kategori body-style, sementara yang
kita tahu ada 5 kategori. Jika dibiarkan, ini akan menjadi masalah perbedaan dimensi.

Oleh karena itu, kita harus menambahkan data baru pada dataframe diesel yang
menyatakan bahwa jenis convertible dengan fuel type diesel berjumlah 0.

# Menambahkan data baru pada dataframe diesel


new_data = {'body-style': 'convertible', 'fuel-type': 'diesel', 'total': 0}
diesel = diesel.append(new_data, ignore_index=True).sort_values(
by='body-style').reset_index(drop=True)
diesel
• Sekarang kita telah memiliki dataframe yang dibutuhkan.
• Selanjutnya adalah visualisasi data. Untuk membuat grouped bar chart, kita mendefinisikan dua bar
plot dalam satu axes yang kita simpan dalam variabel, misalnya d1 dan d2.
• Kita juga perlu mendefinisikan panjang dari sumbu x, dalam hal ini ada berapa label pada sumbu x
yang kita simpan pada variabel x. Selanjutnya kita juga harus mendefinisikan width-nya.

# Membuat grouped bar chart

x = np.arange(len(body))
width = 0.4
labels = body

fig, ax = plt.subplots(figsize=(16, 8))


d1 = ax.bar(x - width/2, gas['total'], width, label='Gas')
d2 = ax.bar(x + width/2, diesel['total'], width, label='Diesel’)

ax.set_title('Total by Body Style and Fuel type', size=18)


ax.set_ylabel('Total', size=14)
ax.set_xticks(x)
ax.set_xticklabels(labels, size=14)
ax.legend(fontsize=16)
plt.show()
Kita dapat menambahkan label di atas # Membuat fungsi untuk menampilkan label
tiap bar.
def peaklabel(data):
Namun, untuk grouped bar chart akan for rect in data:
lebih mudah jika kita membuat sebuah height = rect.get_height()
fungsi terpisah dari kode utama untuk ax.annotate('{}'.format(height),
menampilkan label. Kita tinggal xy=(rect.get_x() + rect.get_width() / 2, height),
memanggilnya saja di kode utama. xytext=(0, 2),
textcoords='offset points',
ha='center',
va='bottom',
fontsize=14)
# Membuat grouped bar chart dengan label
x = np.arange(len(body))
width = 0.4
labels = body

fig, ax = plt.subplots(figsize=(16, 8))


Sekarang kita buat kode seperti sebelumnya, d1 = ax.bar(x - width/2, gas['total'], width, label='Gas')
namun ditambahkan dengan memanggil d2 = ax.bar(x + width/2, diesel['total'], width, label='Diesel')
fungsi peaklabel untuk menampilkan label
pada tiap bar. ax.set_title('Total by Body Style and Fuel type', size=18)
ax.set_ylabel('Total', size=14)
ax.set_xticks(x)
ax.set_xticklabels(labels, size=14)
ax.legend(fontsize=16)

peaklabel(d1)
peaklabel(d2)

plt.show()
Selesai
MATPLOTLIB
BAR PLOT

Anda mungkin juga menyukai