Dangdut Top

Di pos kali ini, saya hanya mau menunjukkan beberapa konfigurasi yang mungkin menarik untuk Anda gunakan dalam grafik Anda. Gaya ini baru ada di bulan Maret 2020 dan langsung jadi salah satu favorit saya: mplcyberpunk. Berhubung saya agak kesulitan mencari dataset yang masih bisa dihitung konten lokal tapi bisa mewakili pendar dari gaya ini, maka mari kita coba mengeksplorasi dataset yang biasa kita korelasikan dengan warna berpendar dan ngejreng di Indonesia: dangdut.

Data di pos ini diambil menggunakan Audio Features API dari Spotify. Tidak semua fiturnya akan saya bahas di sini, karena fokusnya adalah di gaya penampilan grafiknya. Bagaimana pun, biar lengkap, saya akan mencoba membandingkan tiga playlist dari Musik Indonesia dari Spotify: Dangdut Top, Dangdut Lawas, dan Dangdut Laris Manis.

#collapse-hide

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import requests
import mplcyberpunk

plt.style.use('cyberpunk')
plt.rcParams['font.size'] = 16
plt.rcParams['text.usetex'] = True
plt.rcParams['figure.figsize'] = (12,7)
%config InlineBackend.figure_format = 'retina'

def get_audio_features(playlist, token):
    headers = {
        "Authorization": "Bearer {}".format(token)
    }
    
    resp = requests.get("https://api.spotify.com/v1/playlists/{}/tracks".format(playlist), headers=headers)
    items = resp.json()['items']
    titles = [item['track']['name'] for item in items]
    artist_list = []
    for artists in [item['track']['artists'] for item in items]:
        artist_list.append(', '.join([artist['name'] for artist in artists]))
    
    ids = [item['track']['id'] for item in items]
    resp = requests.get("https://api.spotify.com/v1/audio-features?ids={}".format(','.join(ids)), headers=headers)
    df = pd.DataFrame(resp.json()['audio_features'])
    df['artists'] = artist_list
    df['title'] = titles
    return df

def draw_density(column):
    ax = plt.gca()
    labels = []
    for label, group in df.groupby('playlist'):
        sns.distplot(group[column], hist=False, label=label)
        labels.append(label.replace('_', ' '))
    plt.ylabel('density')
    mplcyberpunk.add_glow_effects()
    plt.legend(labels)

def draw_trend(column):
    ax = plt.gca()
    df.groupby('playlist')[column].plot.line()
    mplcyberpunk.make_lines_glow()
    plt.legend(['dangdut laris manis', 'dangdut lawas', 'dangdut top'])
    plt.xlabel('track number')
    plt.ylabel(column)

dangdut_top = "37i9dQZF1DWUWbdikWtt34"
dangdut_lawas = "37i9dQZF1DX7NZzYCEKYgA"
dangdut_laris_manis = "37i9dQZF1DXchLe2S7NIQn"
token = "" # token bisa diambil dari https://developer.spotify.com/console/get-audio-features-track/

df_top = get_audio_features(dangdut_top, token)
df_top['playlist'] = 'dangdut_top'
df_lawas = get_audio_features(dangdut_lawas, token)
df_lawas['playlist'] = 'dangdut_lawas'
df_laris = get_audio_features(dangdut_laris_manis, token)
df_laris['playlist'] = 'dangdut_laris_manis'

df = pd.concat([
    df_top,
    df_lawas,
    df_laris
])

Berdasarkan fitur danceability atau seberapa jogetable - dengan 1.0 adalah paling jogetable, ternyata playlist Dangdut Top dan Dangdut Laris Manis cenderung lebih besar nilainya dibandingkan Dangdut Lawas. Kalau seingat saya, dangdut lawas memang biasanya yang lebih menyayat hati dan sendu. Di bawah ini adalah grafik yang menggambarkan distribusi dari fitur danceability.

By the way, asyik kan grafiknya jadi berpendar begitu?

#collapse-hide

draw_density('danceability')

Selain bisa dibuat berpendar dan ada shade-nya, kita bisa membuat grafiknya hanya berpendar di garisnya saja. Kali ini, kita mencoba melihat progresi dari danceability seiring dengan diputarnya lagu demi lagu di ketiga playlist. Dari grafik di bawah, semuanya terlihat dibuat fluktuatif oleh Spotify.

#collapse-hide

draw_trend('danceability')

Fitur lain yang saya temukan menarik adalah tempo. Di grafik di bawah ini dapat dilihat bahwa Dangdut Lawas cenderung lebih variatif temponya dibandingkan Dangdut Top yang rata-ratanya di sekitar 131 BPM.

#collapse-hide

draw_density('tempo')