2025年6月7日 星期六

Streamlit 學習筆記 : 內建統計圖表 (二) 長條圖

本篇旨在測試 Streamlit 內建統計圖表函式中的直條圖函式 st.bar_chart() :


 函式名稱  說明
 st.line_chart()  繪製折線圖,適合用來呈現時間序列或連續變化的資料。
 st.bar_chart()  繪製長條圖,適合用來比較各分類資料的數值大小。
 st.scatter_chart()  繪製散佈圖,用於顯示兩個變數之間的關係(需 DataFrame 格式資料)。
 st.area_chart()  繪製區域圖,類似折線圖,但底部會填滿陰影,強調總量變化。
 st.map()  在地圖上繪製地理座標點,支援 DataFrame 中包含緯度與經度的資料。


本系列所有測試文章參考 :



2. 長條圖函式 st.bar_chart() : 

st.bar_chart() 可將資料視覺化為橫向或直向的長條圖, 適合展示分類資料的數量, 總和, 平均等比較資訊, 例如產品銷售統計 (每月銷售量, 各類別營收), 分類數據比較 (男女比例, 各縣市人數), 或
每日/每週的數值分佈 (網站流量, 實驗測試結果) 等. 

參數結構與 st.line_chart() 相同 : 

st.bar_chart(
    data=None,
    x=None,
    y=None,
    width=None,
    height=None,
    use_container_width=True
    )

參數說明如下表 :


st.line_chart() 參數 說明
 data 要繪製的資料,可為 pandas DataFrame、numpy array 或 dict。
 x 指定 x 軸的欄位名稱或索引,僅適用於 DataFrame。
 y 指定 y 軸的欄位名稱 (可為單一欄位或其串列),僅適用於 DataFrame。
 width 圖表寬度(像素),預設為 0,表示由系統自動決定。
 height 圖表高度(像素),預設為 0。
 use_container_width 是否讓圖表自動填滿容器寬度 (預設 True,有設 width 時須設 False)。


注意, 雖然 data 參數不是必要, 但通常需提供, 未傳入 data 參數不會報錯, 而是會繪製一張空白的圖表. 

例如 : 


測試 2-1 : 用長條圖比較營收的逐月變化 (1) [看原始碼]   

# st-bar-chart-test-1.py
import streamlit as st
import pandas as pd

# 模擬每月營收資料
data=pd.DataFrame({
    '月份': ['一月', '二月', '三月', '四月', '五月'],
    '營收': [120000, 135000, 99000, 150000, 170000]
    })
st.subheader('今年前五月月營收長條圖')
# 繪製 bar chart
st.bar_chart(data=data, x='月份', y='營收')

此例直接用 x 與 y 參數指定 X 與 Y 軸的資料欄位, 結果如下 : 




也可以用 DataFrame 的 set_index() 指定索引欄位, Streamlit 會自動以索引為 X 軸, 然後再選取要輸出的欄位當 Y 軸 (必須是數值欄位, 若含有其它非數值欄位則必須選取), 例如 : 


測試 2-2 : 用長條圖比較營收的逐月變化 (2) [看原始碼]   

# st-bar-chart-test-2.py
import streamlit as st
import pandas as pd

# 模擬每月營收資料
data=pd.DataFrame({
    '月份': ['一月', '二月', '三月', '四月', '五月'],
    '營收': [120000, 135000, 99000, 150000, 170000]
    })
st.subheader('今年前五月月營收長條圖')
# 繪製 bar chart
chart_data=data.set_index('月份')['營收']
st.bar_chart(data=chart_data)

結果與上例一樣. 

下面範例是 Y 軸資料有兩個的情形 :


測試 2-3 : 用長條圖比較營收的逐月同比變化 [看原始碼]   

# st-bar-chart-test-2.py
import streamlit as st
import pandas as pd

# 模擬每月營收資料
data=pd.DataFrame({
    '月份': ['一月', '二月', '三月', '四月', '五月'],
    '今年營收': [120000, 135000, 99000, 150000, 170000],
    '去年營收': [110000, 125000, 95000, 145000, 160000]
    })
st.subheader('今年 vs 去年前五個月營收比較')
# 繪製 bar chart
chart_data=data.set_index('月份')[['去年營收', '今年營收']]
st.bar_chart(data=chart_data)

此例的 DataFrame 中添加了去年營收這一欄, 要繪製的 Y 軸變數有兩個, 因此無法使用 x 與 y 參數, 這時要利用 set_index() 函式來指定 '月份' 欄為索引, Streamlit 會自動將索引欄做為 X 軸, 然後選取 '去年營收' 與 '今年營收' 這兩欄為要顯示的資料傳給 st.bar_chart() 繪製 (這動作雖然不是必要, 但此函式會試圖繪製所有非索引欄位, 若 DataFrame 中有非數值欄位就會報錯), 結果如下 : 




可見 st_bar_chart() 會把兩個 Y 軸以堆疊方式繪製, 而非以 grouped (兩個 Y 軸並排) 方式. 因為 st.bar_chart() 是一個簡化的 API, 它是使用 Altair 的堆疊模式 (stacked) 實作的. 如果想繪製群組式的直條圖, 那就要直接使用 Altair 了. 

沒有留言 :