Double vertical axis chart/ grafik 2 sumbu vertikal dengan matplotlib

Ya, Excel masih tidak memberi hasil yang rasanya cukup memuaskan. Jadi, kembali ke matplotlib. Berikut contoh membuat Angka Kematian Ibu dan Jumlah Kematian Ibu dalam satu grafik. Pustaka python yang dibutuhkan sama seperti saat membuat grafik piramida penduduk: matplotlib, numpy, pandas.

Siapkan data, simpan dengan nama dataAKIkematianIbu.csv. Contoh:

2013;92.1;2
2014;46.45;1
2015;45.85;1
2016;95.83;2
2017;49.7;1

Buat berkas python berikut, simpan dengan nama grafikAKIkematianIbu.py, jalankan dengan python.

import numpy as np
import matplotlib.pyplot as plt
import pandas
from textwrap import wrap
from matplotlib.ticker import FuncFormatter

# read data file
colnames = ['tahun','aki', 'kematian']
data = pandas.read_csv(r'D:\path\tempat\simpan\file\dataAKIkematianIbu.csv', names=colnames, sep=';')
tahun = data.tahun.tolist()
aki = data.aki.tolist()
kematian = data.kematian.tolist()

# setting up x locations for the groups and width of the bars
ind = np.arange(len(tahun))
width = 0.25

fig, ax = plt.subplots()
garis1 = ax.plot(ind, aki, marker='.', color='royalblue', label='AKI')
# setting up secondary y-axis, sharing the same x-axis
# https://matplotlib.org/api/_as_gen/matplotlib.pyplot.twinx.html
ax2 = ax.twinx()
garis2 = ax2.plot(ind, kematian, marker='.', color='#cc0000', label='AKI')

# add some text for labels, title and axes ticks
ax.set_title('Angka Kematian Ibu')
ax.set_ylim(0,110)
# yticks can be set to auto
# ax.set_yticks(np.arange(0,110,20))
ax.set_ylabel('per 10.000 kelahiran')
formatter = FuncFormatter(lambda y, pos: "%d" % (y))
ax.yaxis.set_major_formatter(formatter)

# set secondary yticks
ax2.set_ylim(0,11)
ax2.set_yticks(np.arange(0,11,5))
ax2.set_ylabel('Jumlah kematian')

ax.set_xticks(ind)
ax.set_xticklabels(list(tahun), fontsize='small', ha='center')

# should've remove this since it might give wrong perception with 2 y-axis
ax.grid(axis='y',ls='dashed')

box = ax.get_position()
ax.set_position([box.x0, box.y0 + box.height * 0.1, box.width, box.height * 0.9])
kolomLegen = ['AKI','Jumlah Kematian']
ax.legend((garis1[0], garis2[0]), kolomLegen, fontsize='x-small', loc='upper center', bbox_to_anchor=(0.5, -0.15), fancybox=True, shadow=True, ncol=3)

# make labels for plots
for i, txt in enumerate(aki):
		ax.annotate(txt, (ind[i],aki[i]))
for i, txt in enumerate(kematian):
		ax2.annotate(txt, (ind[i],kematian[i]))

# finishing
pyrfig = plt.figure(1)
pyrfig.set_figwidth(8)
pyrfig.set_figheight(5)
fig.savefig(r'D:\path\tempat\simpan\file\grafikAKIkematianIbu.png',bbox_inches='tight')
plt.close(pyrfig)
# plt.show()

Hasilnya:

grafikaki

NB: Somewhat related article https://blog.datawrapper.de/dualaxis/
NB 2: Kenapa hasil googling kebanyakan memberi contoh mencampur grafik batang/ bar dengan garis/ line walaupun di sumbu x tidak menggambarkan waktu/ kronologis?
Atau lebih tepatnya, untuk apa menggunakan grafik garis/ line kalau di sumbu x sama sekali tidak menggambarkan waktu/ kronologis?

bar-line-wrong_impression

Iklan

Grafik piramida penduduk dengan matplotlib

Kenapa tidak dengan Excel? Karena dari googling cepat, mesti menggunakan nilai negatif untuk salah satu kolom. It doesn’t feel right.

piramidapendudukexcel

Don’t want to

Beberapa alternatif yang menjanjikan: gnuplot (contoh), ggplot2 (contoh). Tapi karena belum paham gnuplot atau R, jadi lanjut ke alternatif berikutnya, yaitu matplotlib, sebuah pustaka Python untuk membuat diagram. Untuk membuat piramida penduduk ini juga diperlukan bantuan beberapa pustaka lainnya yaitu numpy dan pandas. Tidak wajib, tapi akan lebih memudahkan. (And I will need them anyway to create a lot more necessary diagrams).

Python bisa diinstall dengan paket manager di Linux. Untuk pemasangan di Windows, bisa unduh installernya di web resmi Python. Setelah itu pasang matplotlib, numpy dan pandas dengan pip.

pip install matplotplib numpy pandas

Siapkan data penduduk dalam format csv. Simpan dengan nama dataPiramidaPenduduk.csv. Contoh:
0 - 4;5040;4614
5 - 9;5208;4984
10 - 14;5400;5054
15 - 19;4908;4775
20 - 24;4593;4358
25 - 29;4592;4430
30 - 34;5391;5014
35 - 39;5954;5395
40 - 44;5180;4474
45 - 49;3982;3636
50 - 54;3289;3015
55 - 59;2577;2638
60 - 64;2069;2067
65 - 69;1411;1450
70 - 74;808;899
75+;874;1182

Lalu buat skrip python berikut, simpan dengan nama grafikPiramidaPenduduk.py, jalankan dengan python.

import numpy as np
import matplotlib.pyplot as plt
import pandas
import locale
locale.setlocale(locale.LC_ALL, 'Indonesian_indonesia.1252')

colnames = ['kelompokUmur','popLakiLaki','popPerempuan']
data = pandas.read_csv(r'D:\path\tempat\simpan\file\dataPiramidaPenduduk.csv', names=colnames, sep=';')
sumbuY = data.kelompokUmur.tolist()
bar1 = data.popLakiLaki.tolist()
bar2 = data.popPerempuan.tolist()

def pyramid_plot(ylabels, data_left, xlabel_left, data_right, xlabel_right, fig=None, **kwargs):
    if(fig is None):
        fig = plt.figure()

    y_pos = np.arange(len(ylabels))
    empty_ticks = tuple('' for n in ylabels)
    rentang = 6700

    fig.add_subplot(121)
    plt.barh(y_pos, data_left, color="red", **kwargs)
    for i, v in enumerate(data_left): plt.text(v,i, '{:n}'.format(v), ha="right", va="center")
    plt.yticks(y_pos, empty_ticks, va="center", ha='center')
    plt.axis(xmin=rentang, xmax=(0))
    plt.tick_params(axis='x', which='major', labelsize='small')
    plt.tick_params(axis='y', which='major', length=0)
    plt.xlabel(xlabel_left)

    fig.add_subplot(122)
    plt.barh(y_pos, data_right, **kwargs)
    plt.axis(xmin=(0), xmax=rentang)
    plt.yticks(y_pos, ylabels)
    for i, v in enumerate(data_right): plt.text(v,i, '{:n}'.format(v), va="center")
    plt.xlabel(xlabel_right)
    plt.tick_params(axis='x', which='major', labelsize='small')
    plt.tick_params(axis='y', which='major', length=0)

    fig.suptitle('Piramida Penduduk')
    return fig

# Plot the data
pyrfig = plt.figure(1)
pyrfig = pyramid_plot(sumbuY, bar2, 'Perempuan', bar1, 'Laki-laki', pyrfig, align='center', alpha=0.4)

pyrfig.set_figwidth(10)
pyrfig.set_figheight(5)
# pyrfig.savefig(r'D:\path\tempat\simpan\file\piramidaPenduduk.png',bbox_inches='tight')
# plt.close(pyrfig)
plt.show(pyrfig)

Hasilnya:

piramidapenduduk

Looks much better than what Excel produced

Jika ingin langsung menyimpan ke berkas png, sunting 3 baris terakhir menjadi:

pyrfig.savefig(r'D:\path\tempat\simpan\file\piramidaPenduduk.png',bbox_inches='tight')
plt.close(pyrfig)
# plt.show(pyrfig)

NB: Semestinya “Laki-laki” di kiri dan “Perempuan” di kanan. Hanya perlu edit baris 10, 11, dan 44, tapi malas ngeditnya.

Ubuntu spotted at wild! 

Not quite so. But a colleague at office did recently ask me to take a look at her non-booting Ubuntu laptop (it was fsck problem). 

What caught my attention was she’s using 16.04 version. The last Ubuntu I used was 12.04, iirc? And it’s latest release apparently has reached the end of alphabet. Zesty Zapus. Maybe I should give it a try?  (Thank God for Virtual Machines. No need for total harddisk wipe-out like when I installed Ubuntu for the first time, 8.04). 

Replacing Lenovo G405 mainboard

Minggu, 12 Maret 2017.Saya baru saja kembali ke Manggar setelah 3 hari ikut kegiatan dinas di Pk.Pinang (sekalian mudik). Sampai di kontrakan nyalain laptop… dan tidak menyala. BIOS saja tidak muncul. Cuma ada kursor putih kedap-kedip genit di pojok kiri atas layar. 

Setelah mencoba berkali-kali reset BIOS dengan sia-sia, dan keliling beberapa servis komputer, vonis dijatuhkan:Lenovo G405 yang dibeli 3 tahun lalu ini sudah waktunya ganti mainboard. Pilihan lainnya adalah lembiru, lempar-beli-baru, yang mana duitnya dak ado

Jadi ya apa boleh baut, ubek-ubek Tokopedia nyari yang jualan mainboard G405. Dapat yang melegonya dengan mahar 900 ribu. Barangnya datang akhir pekan berikutnya. Bawa lagi ke servis, karena tidak bisa pasang sendiri. Sudah coba bongkar sendiri, tapi mentok di bezel di bawah keyboard yang sungguh keterlaluan sekali lengketnya. Tukang servisnya saja sampai habis setengah jam sendiri mencoba membongkar bezel itu. 

Setelah itu, semua lancar. Mainboard lama dilepas, yang baru dipasang, lalu perintilan lainnya dirakit ulang ke laptop. Sabtu, 18 Maret 2017.G405 kembali sehat walafiat. 

Mudah-mudahan bertahan setidaknya 3 tahun ke depan.

LyX on Windows

Sekedar pengingat untuk diri sendiri:

  • Gunakan LyX versi installer, yang ukurannya lebih kecil ketimbang versi bundle. Walau harus unduh dan install TeX terpisah. 
  • Meskipun berkas iso DVD TeX Live lebih gede, lebih baik gunakan ini ketimbang MikTex. Kalau internet lega dan stabil, pakai network install.
  • Kalau bisa, saat instalasi TeX Live pilih semua paket yang ditawarkan, karena tlmgr itu menyebalkan lemotnya.
  • Prepare some coffee. Instalasinya bakal lama. 
  • Tentu, akan lebih sedikit pusing setting-nya jika menggunakan LyX di Linux.

Mengklaim akun ymail yang di”daurulang” Yahoo

Pertama-tama: SAYA BERHASIL MENDAPATKAN KEMBALI AKUN YMAIL YANG TERLANJUR DIDAURULANG YAHOO KARENA KELEWAT JARANG DIPAKE UWOHHHHHHHHH

Kira-kira di awal tahun ini, iseng-iseng saya mencoba login ke akun Ymail, yang jarang saya gunakan. Rupanya gagal login, gagal reset password, gagal login dari Flickr, dst. Selidik punya selidik di laman bantuan Yahoo, rupanya ada kebijakan “mendaurulang” akun ymail kalau selama beberapa bulan tidak ada gelagat login, kira-kira semacam itu. Kecewa benar saya, soalnya nama akunnya bagus: singkat, padat, jelas, tanpa angka.

Apa boleh buat, Ymail masih pakai paradigma konservatif penyedia email. Berbeda dengan Gmail yang mau jarang login bertahun-tahun pun tetap akunnya aktif (setidaknya demikianlah normanya hingga hari ini).

Sebetulnya, Ymail sudah menyediakan mekanisme untuk mengklaim kembali akun tersebut, tapi mesti menunggu setahun dari login terakhir, baru bisa sukses reset password dan login ulang. Itu pun kalau tidak keburu diserobot orang lain yang menginginkan nama akun yang sama. Arsip inbox-draft-sent mail pun akan dihapus total, kecuali email “Welcome to Yahoo!” dan email pergantian password.

Jadi malam ini, kembali saya iseng reset password akun Ymail tersebut, rekues email link reset agar dikirim ke akun Gmail yang sehari-hari saya gunakan…dan wow, emailnya benar-benar datang. Setelah memasukkan password baru, akun Ymail tersebut akhirnya kembali ke tangan saya. Lihat inbox, ternyata aktivitas login terakhir saya sebelum diblokir adalah awal Maret 2014! Beruntung sekali tidak ada yang mencoba klaim akun ini sejak Maret 2015 😀

Tautan: https://id.bantuan.yahoo.com/kb/account/Memulihkan-atau-mengubah-kata-sandi-Yahoo-sln2047.html?impressions=true#cont1

Ethernet Atheros QCA8172 di Debian Wheezy

Saya baru tahu kalau selama ini port Ethernet (alias colokan kabel LAN) di laptop Lenovo G405 saya ternyata tidak dikenali oleh Debian Wheezy O_O. Biasanya sehari-hari cuma pakai interface wlan0 (alias wireless) sih. Ini baru ketahuan ketika hendak mencoba jaringan VPN dari Pusdatin Kemenkes, kok “eth0 not found”. Rupanya drivernya memang belum masuk di repo Wheezy.

Buka-buka dokumentasi Debian ketemu juga petunjuknya di https://wiki.debian.org/alx . Sekarang sedang install paket dari repo wheezy-backport, mudah-mudahan eth0 bisa dikenali. Menurut laman itu sih bisa untuk Atheros QCA8172 seperti yang ada di Lenovo G405.

The following list is based on the alias fields of modinfo alx in Debian 3.16 (3.16.7-ckt9-3~deb8u1) kernel images.


PCI: 1969:1090 Qualcomm Atheros AR8162 Fast Ethernet
PCI: 1969:1091 Qualcomm Atheros AR8161 Gigabit Ethernet
PCI: 1969:10A0 Qualcomm Atheros QCA8172 Fast Ethernet
PCI: 1969:10A1 Qualcomm Atheros QCA8171 Gigabit Ethernet
PCI: 1969:E091 Qualcomm Atheros Killer E220x Gigabit Ethernet Controller

Update: eth0 berhasil dikenali 😀

2015-05-22-154621_1368x768_scrot