DataLens

Menampilkan DataFrame dan grafik

Pilih antara grafik bawaan Streamlit yang cepat dan figure Plotly lengkap, siapkan data dalam bentuk yang tepat, dan biarkan widget menggerakkan grafiknya.

Level: Menengah · 6 menit baca

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

Idenya

Aplikasi Streamlit sering berbentuk "beberapa widget, lalu grafik yang bereaksi terhadapnya". Streamlit memberimu dua cara untuk menggambar:

Pakai grafik bawaan saat bereksplorasi; pakai Plotly untuk apa pun yang akan dilihat stakeholder.

Grafik bawaan

Grafik ini menerima DataFrame dan menggambar kolom angka terhadap index (atau terhadap x= kalau kamu menyebutkannya):

import streamlit as st
import pandas as pd

sales = pd.read_csv("sales.csv")
completed = sales[sales["status"] == "completed"]
monthly = (completed.assign(month=completed["order_date"].str[:7])
           .groupby("month")["revenue"].sum())

st.subheader("Completed revenue per month")
st.line_chart(monthly)

monthly adalah Series dengan index bulan, jadi bulan menjadi sumbu x. Dengan DataFrame biasa, sebutkan kolomnya:

import streamlit as st
import pandas as pd

sales = pd.read_csv("sales.csv")
completed = sales[sales["status"] == "completed"]
by_category = completed.groupby("category", as_index=False)["revenue"].sum()

st.bar_chart(by_category, x="category", y="revenue")

Beberapa kolom angka menjadi beberapa seri. Tabel lebar (satu kolom per channel) menggambar satu garis per channel:

import streamlit as st
import pandas as pd

sales = pd.read_csv("sales.csv")
completed = sales[sales["status"] == "completed"]
wide = (completed.assign(month=completed["order_date"].str[:7])
        .pivot_table(index="month", columns="channel", values="revenue", aggfunc="sum", fill_value=0))
st.line_chart(wide)
st.dataframe(wide)

Perhatikan bentuknya: grafik bawaan Streamlit menyukai data lebar (satu kolom per seri), sementara Plotly Express menyukai data panjang (kolom channel ditambah color="channel"). pivot_table dan melt mengonversi di antara keduanya.

Grafik Plotly

Untuk kendali atas judul, label, hover dan warna, bangun figure Plotly lalu serahkan:

import streamlit as st
import pandas as pd
import plotly.express as px

sales = pd.read_csv("sales.csv")
completed = sales[sales["status"] == "completed"]
by_category = (completed.groupby("category", as_index=False)["revenue"].sum()
               .sort_values("revenue"))

fig = px.bar(by_category, x="revenue", y="category", orientation="h", text_auto=".2s",
             title="Electronics leads completed revenue",
             labels={"revenue": "Revenue (Rp)", "category": ""})
st.plotly_chart(fig, use_container_width=True)

use_container_width=True meregangkan grafik selebar kolom atau halaman, yang memang kamu inginkan di layout dengan kolom. Hover, zoom dan unduh semuanya berfungsi seperti di notebook.

Fungsi grafikmu dari track Plotly (ranking_bar, trend_line) langsung bisa dipakai: st.plotly_chart(ranking_bar(...)). Itulah hasil dari mengembalikan figure alih-alih menampilkannya.

Widget menggerakkan grafik

Model rerun membuat grafik interaktif menjadi sepele: baca sebuah widget, filter, gambar.

import streamlit as st
import pandas as pd
import plotly.express as px

sales = pd.read_csv("sales.csv")
completed = sales[sales["status"] == "completed"].assign(month=lambda d: d["order_date"].str[:7])

metric = st.radio("Measure", ["revenue", "quantity"], horizontal=True)
channel = st.selectbox("Channel", ["all", "web", "app"])
rows = completed if channel == "all" else completed[completed["channel"] == channel]
monthly = rows.groupby("month", as_index=False)[metric].sum()

fig = px.line(monthly, x="month", y=metric, markers=True,
              title=f"Monthly {metric} ({channel})")
st.plotly_chart(fig, use_container_width=True)

Setiap perubahan menjalankan ulang script, membangun ulang monthly dan figure-nya dari input yang baru. Tidak ada fungsi update di mana pun.

Tabel yang enak dibaca

st.dataframe menerima beberapa opsi yang membuat tabel lebih mudah dibaca:

import streamlit as st
import pandas as pd

sales = pd.read_csv("sales.csv")
completed = sales[sales["status"] == "completed"]
top = (completed.groupby("product", as_index=False)
       .agg(units=("quantity", "sum"), revenue=("revenue", "sum"))
       .sort_values("revenue", ascending=False)
       .head(5))

st.dataframe(top, hide_index=True, use_container_width=True)

Siapkan tabelnya di pandas (agregasi, urutkan, ganti nama kolom menjadi nama yang ramah) dan biarkan st.dataframe menampilkannya. Memformat di pandas (.round(), mengganti nama kolom) menjaga kode tampilan tetap minimal.

Mengapa ini penting untuk kode yang bersih

Pemisahan yang sama seperti di track Plotly berlaku: persiapan data → figure → tampilan. Taruh setiap langkah di beberapa barisnya sendiri (atau fungsi), sehingga bagian Streamlit-nya hanya st.plotly_chart(fig). Saat grafiknya terlihat salah, kamu bisa memeriksa DataFrame dan figure-nya secara terpisah, tanpa harus mengklik-klik aplikasinya.

Rangkuman

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

Berikutnya: session_state: mengingat nilai di antara rerun →