Di tutorial sebelumnya kita telah membahas tentang membuat barchart dan melakukan kustomisasi dengan matplotlib, kali ini kita akan membahas bagaimana membuat stacked bar chart dengan matplotlib.
Seperti halnya barchart biasa, stacked barchart atau diagram batang bertumpuk digunakan untuk menampilkan variabel kategorikal. Bedanya, jika pada barchart biasa melibatkan satu variabel kategorikal, maka stacked barchart melibatkan dua variabel kategorikal, yang ditampilkan sebagai kategori dan subkategori.
Stacked Bar Chart digunakan ketika kita ingin membandingkan nilai total setiap kategori, dan menunjukkan kontribusi setiap subkategori terhadap nilai total per kategori tersebut.
Misalnya untuk menampilkan perbandingan jumlah pelanggan per daerah berdasar jenis produknya. Diagram batang bertumpuk dapat menampilkan jumlah total pelanggan per daerah (kategori), dengan masing-masing segmen mewakili tiap produk (subkategori).
Membuat Stacked Bar Chart dengan Matplotlib
Untuk membuat stacked bar chart menggunakan matplotlib, kita harus 'menggambar' satu persatu barchart untuk masing-masing subkategori. Gunakan fungsi plt.bar(), dan parameter bottom.
Sebelumnya kita import package yang akan kita gunakan, yaitu matplotlib.pyplot dan numpy
import matplotlib.pyplot as plt
import numpy as np
# Data
daerah = ['Area 1', 'Area 2', 'Area 3']
produk1 = np.array([10, 20, 10])
produk2 = np.array([15, 10, 25])
# Tampilkan bar chart
plt.bar(daerah, produk1, label='Produk 1')
plt.bar(daerah, produk2, bottom=produk1, label='Produk 2')
# Tambahkan label and judul
plt.xlabel('Nama Daerah')
plt.ylabel('Jumlah Penjualan')
plt.title('Penjualan per Daerah per Produk')
# Tampilkan legend
plt.legend()
# Tampilkan plot
plt.show()
Membuat stacked bar chart dengan lebih dari 2 subkategori.
Untuk membuat barchart dengan lebih dari 2 subkategori, kita perlu membuat pot untuk masing-masing subkategori, dan menjumlahkan nilai bottom dari subkategori sebelumnya secara manual.
Agar kita dapat melakukan penjumlahan 2 list, maka kita perlu mengubah list menjadi numpy array, dengan perintah np.array()
# Data
daerah = ['Area 1', 'Area 2', 'Area 3']
produk1 = np.array([10, 20, 10])
produk2 = np.array([15, 10, 25])
produk3 = np.array([10, 20, 15])
# Tampilkan bar chart
plt.bar(daerah, produk1, label='Produk 1')
plt.bar(daerah, produk2, bottom=produk1, label='Produk 2')
plt.bar(daerah, produk3, bottom=produk1+produk2, label='Produk 3')
# Tambahkan label and judul
plt.xlabel('Nama Daerah')
plt.ylabel('Jumlah Penjualan')
plt.title('Penjualan per Daerah per Produk')
# Tampilkan legend
plt.legend()
# Tampilkan plot
plt.show()
Menambahkan Label Nilai pada Stacked Bar Chart
Untuk menambahkan label pada barchart, kita dapat menggunakan fungsi bar_label() pada objek axes, dengan parameter barchart_container.
Untuk mendapatkan object axes, kita panggil fungsi plt.subplots(), sedangkan objek barchart_container bisa kita dapatkan dari return value fungsi plt.bar().
Berbeda dengan contoh sebelumnya, pada contoh ini kita akan lakukan setting label sumbu x, sumbu y, dan judul melalui fungsi set pada object Axes.
Selain itu kita juga akan set batas atas sumbu y menjadi 60 untuk memberi space di atas label, dengan parameter ylim.
# Data
daerah = ['Area 1', 'Area 2', 'Area 3']
produk1 = np.array([10, 20, 10])
produk2 = np.array([15, 10, 25])
produk3 = np.array([10, 20, 15])
#mengambil object axes
fig, ax = plt.subplots()
p = plt.bar(daerah, produk1, label='Produk 1') #simpan object bar_container p
ax.bar_label(p, label_type='center', color='w') #set label
p = plt.bar(daerah, produk2, bottom=produk1, label='Produk 2')
ax.bar_label(p, label_type='center', color='w')
p = plt.bar(daerah, produk3, bottom=produk1+produk2, label='Produk 3')
ax.bar_label(p, label_type='center', color='w')
#set label dan judul
ax.set(xlabel='Nama Daerah',
ylabel='Jumlah Penjualan',
title='Penjualan per Daerah per Produk',
ylim=(0,60))
#tampilkan legend
plt.legend()
# Tampilkan plot
plt.show()
Mengubah Warna Salah satu Elemen / Subkategori
Kadang kala kita perlu memberikan penekanan (highlight) kepada suatu nilai tertentu, misalnya nilai minimum atau maksimum.
Kita dapat menggunakan warna yang berbeda untuk memberikan penekanan tersebut.
Kita dapat mengubah salah satu batang pada diagram, dengan menggunakan fungsi set_color().
- Untuk mengubah warna batang, kita gunakan bar_container yang dikembalikan oleh fungsi plt.plot().
- Untuk mengubah warna label, kita gunakan object text yang dikembalikan oleh fungsi bar_label().
Misalnya pada contoh di bawah ini kita ingin memberi penekanan pada Produk 2 di Area 2, dengan mengubah warna segmen tersebut menjadi merah, dan labelnya menjadi putih.
Maka untuk plot kedua, disamping menyimpan bar_container di variabel p, kita akan menyimpan text atau annotation di variabel t, dan kita akan gunakan keduanya untuk mengubah warna dengan memanggil fungsi set_color().
# Data
daerah = ['Area 1', 'Area 2', 'Area 3']
produk1 = np.array([10, 20, 10])
produk2 = np.array([15, 5, 25])
produk3 = np.array([10, 20, 15])
#mengambil object axes
fig, ax = plt.subplots()
p = plt.bar(daerah, produk1, label='Produk 1') #simpan object bar_container p
ax.bar_label(p, label_type='center') #set label
p = plt.bar(daerah, produk2, bottom=produk1, label='Produk 2')
t = ax.bar_label(p, label_type='center')
p[1].set_color('r') #set warna bar ke 2, sub 2 = red
t[1].set_color('w') #set warna label bar ke 2, sub 2 = white
p = plt.bar(daerah, produk3, bottom=produk1+produk2, label='Produk 3')
ax.bar_label(p, label_type='center')
#set label dan judul
ax.set(xlabel='Nama Daerah',
ylabel='Jumlah Penjualan',
title='Penjualan per Daerah per Produk',
ylim=(0,60))
#tampilkan legend
plt.legend()
# Tampilkan plot
plt.show()
Horizontal Stacked Bar Chart
Diagram batang bertumpuk dapat juga ditampilkan secara horizontal dengan menggunakan fungsi plt.barh(). Sintaks untuk membuat dan mengkustomisasi stacked bar chart horizontal hampir sama dengan sintaks untuk bar chart vertikal.
# Data
daerah = ['Area 1', 'Area 2', 'Area 3']
produk1 = np.array([10, 20, 10])
produk2 = np.array([15, 5, 25])
produk3 = np.array([10, 20, 15])
#mengambil object axes
fig, ax = plt.subplots()
p = plt.barh(daerah, produk1, label='Produk 1') #simpan object bar_container p
ax.bar_label(p,label_type='center') #set label
Perbedaannya adalah pada parameter yang digunakan, yaitu sebagai ganti bottom, kita menggunakan parameter left.
p = plt.barh(daerah, produk2, left=produk1, label='Produk 2')
t = ax.bar_label(p, label_type='center')
p = plt.barh(daerah, produk3, left=produk1+produk2, label='Produk 3')
ax.bar_label(p, label_type='center')
Serta tentunya nilai xlabel dan ylabel kita pertukarkan, dan parameter ylim kita ganti dengan xlim.
#set label dan judul
ax.set(ylabel='Nama Daerah',
xlabel='Jumlah Penjualan',
title='Penjualan per Daerah per Produk',
xlim=(0,60))
#tampilkan legend
plt.legend()
# Tampilkan plot
plt.show()
Wrapping Up
Diagram batang merupakan salah satu jenis diagram yang paling banyak digunakan karena kesederhanaan dan kemudahannya. Salah satu variasi diagram batang yang sering kita gunakan ketika kita ingin menampilkan subkategori adalah stacked bar chart atau diagram batang bertumpuk.
Membuat stacked barchart dengan matplotlib memang relatif rumit, karena kita harus membuat satu persatu plot untuk tiap subkategori. Untuk menghindari hal ini, package-package lain yang dibangun di atas matplotlib, seperti seaborn dan pandas telah menyediakan fungsi yang praktis, yang hanya memerlukan setting parameter saja. Misalnya seperti bisa dilihat di dalam artikel Visualisasi Dengan Pandas - Bar Chart
Simak juga tutorial-tutorial lainnya tentang visualisasi data