資料科學第六週-期中了!用Streamlit展示文字資訊與圖表
在本週的部落格文章中,介紹了如何將DataFrame和資料視覺化圖表上線,使用的工具有Streamlit、Pandas和Plotly。透過建置網站和Python腳本,可以快速展示資料。另外,也介紹了Streamlit的安裝、文字顯示方式、欄位排版以及利用Plotly製作折線圖和長條圖。使用滑桿和側邊欄進行資料篩選和互動,讓資料呈現更生動。详细教學可參考[完整程式碼連結](https://taoyuan-data.streamlit.app/)。
前言-會使用到什麼讓網站上線
在這週,我們要將前面所學到的DataFrame與資料視覺化圖表的上線,可參考動態展示網站:
https://taoyuan-data.streamlit.app/
若只是在本地(Local)端呈現,會使用到的技術包含:
Streamlit - 建置網站
Pandas and Plotly - 資訊分析與視覺化工具
如果要上雲端,讓人能夠連上,要學會的包含(我會寫在下一篇):
Venv - Python內建虛擬環境設定
Git and Github - 儲存和協作軟體開發專案的線上平台
Streamlit Cloud - 雲端部署網站的平台服務
Streamlit簡介
Streamlit 是一個開源的 Python 框架,專為快速建立美觀且互動性強的資料展示而設計,只要寫幾行程式碼,就可以將 Python 腳本轉變成互動式網頁應用。Let’s try it!
Streamlit安裝與匯入
1 |
|
創建一檔案這取名為app.py
,將套件匯入
1 |
|
Streamlit 文字類型
在使用文字時與平常記筆記的Notion類似,使用Markdown語法可以設定標題
如圖,標題可以使用
1 |
|
使用title
等同於使用write
加上markdown語法#
如下:
1 |
|
所以不想記太多函式的話,可以全部用write
也OK
次標題可以用##
1 |
|
Streamlit 上線
這樣,執行後就可以在本地端測試了:
會看到streamlit run 你的檔案位置
複製並輸入在命令提示字元就可以看到結果。
接者每當你改動程式碼後存檔,只要重新整理頁面,就會跟改動了
更方便的是,你可以點選右上角的… > Settings
再點選Run on save ,網頁就會在你存檔時,不用重整網頁,自動更新囉,非常快速方便吧!
Streamlit 欄位排版
三欄式切版
可以在一行中指定要切成幾欄,例如我要切成三欄
1 |
|
每欄中有多行指令要設定的話,可以配上with
,還進行欄位的設定
官網範例
metric
實作中使用metric
這個函式,當欄位是要強調「某個值或訊息」的時候,很適合使用,其中參數包含:
label
:指標的名稱,用於描述數值的內容。value
:主顯示數值。delta
(可選):和之前數值的變化,用於顯示增加或減少的趨勢(通常是數字或百分比)。delta_color
(可選):控制變化值的顏色。"normal"
:預設,增加顯示綠色,減少顯示紅色。"inverse"
:反轉顏色,增加顯示紅色,減少顯示綠色。
help
(可選):一段說明文字,當使用者將滑鼠懸停在指標名稱上時會顯示。
實作:
1 |
|
和台灣不同,預設「漲是綠色、跌是紅色」,所以在delta_color
要使用inverse
不同比例切版
除了可以在一行中指定要切成幾欄,也可以利用list
的方式設定比例,如官網範例:
Plotly製圖I - 繪折線圖
實作前幾節的資料,用plotly來呈現,幾個plotly的用法可以注意一下:
- 載入Plotly中可以互動的元件
1 |
|
- 建立空的圖表
1 |
|
將線型加入,將我要加入的地區用
list
呈現add_trace()
:在fig中加入軌跡(線圖)Scatter()
:散布圖/折線圖,根據後面的mode
決定name
:這個參數呈現在圖例(legend)當中
1 |
|
- 圖的額外設定,其中
hovermode
可以設定x
,y
,closet
,互動時會依據方式來呈現資料
1 |
|
- 在streamlit呈現出來,
use_container_width=True
能讓圖形根據網頁大小而做變化,更符合RWD建議加入
1 |
|
此區段程式碼:
1 |
|
側邊欄設定
側邊欄是Streamlit一個有趣的設計,可以讓使用者自行篩選資料,讓圖表視覺化的呈現更為彈性,以上面的地區收入變化為例:
側邊欄的標題
分為主標題st.sidebar.header
和次標題st.sidebar.subheader
非常直觀
1 |
|
多選條件
可以選定不同地區做即時的比較,所以使用multiselect
,其中
option
:代表所有可選擇的標籤default
:代表網頁一開始預設有的標籤
1 |
|
側邊欄就被叫出來拉!
因為要讓圖可以跟著調整,所以對原本圖的呈現進行修改:
要加入軌跡add_trace()
的線,改為由selected_areas
這個變數所控制,就這麼簡單!
1 |
|
修改後就可以及時控制圖囉
側邊欄風格調整
另外因為Streamlit預設主視覺顏色很鮮豔,一樣可以透過Setting來做修改,點擊Setting後選擇「Edit active theme」即可變換主題顏色
繪製原餅圖
這裡使用之前廟宇的資料,先透過sidebar進行設定,這樣在算「主祀神祇的比例」的時候,可以篩選,要計入的神明。
這邊要注意的是option_list
,因為原本df_count_ratio.index
得到的是一個Series,要轉成文字串列才能被選擇。
1 |
|
再來就差不多了,label
代表圓餅圖要出現的標籤,values
代表各個值,跟前面畫圖是一樣的
hole
則是用來設計中間的空心,改稱「甜甜圈圖」,可有可無。
1 |
|
此段完整程式碼:
1 |
|
繪製長條圖 和 滑桿側邊欄
樞紐分析表Pivot_table
在前面我們使用pivot_table
來做神明與教別的交叉數量分析,將pivot_table
顯示出來更方便了解:
1 |
|
因為等等要建置的滑桿最小值和最大值和「總廟數」有關,於是又加了一個欄位,將所有列,第一欄以外(iloc[:,1:])進行橫向加總(axis=1)
1 |
|
滑桿Slider
設定滑桿,找到最大值和最小值即可
1 |
|
長條圖繪製前,講一下長表格melt
因為要透過「教別」來進行分組的長條圖,可以想見,x軸是依教別分好組的神祇,y軸是寺廟數量。
因此我想讓表格如下圖,每個神祇對應到四種教別的寺廟數量
但原本pivot_table中,教別在欄,這時候就適合用melt將欄融化成列!
melt
的三個參數:
id_vars
- 代表主要不轉換的鍵var_name
- 代表要融化的欄value_name
- 代表表中還要保留的值
1 |
|
繪製長條圖
轉換為長表格後,就可以用Plotly來進行Bar Chart的繪製,其中barmode
代表長條圖的顯示模式,也可以試著調整看看其他效果。
barmode='group'
:並排顯示條形,用於對比不同類別。barmode='stack'
:堆疊顯示條形,用於展示類別總和及其貢獻。barmode='overlay'
:覆蓋顯示條形,容易遮擋信息,不常用。barmode='relative'
:相對堆疊顯示,展示各類別在x
軸標籤下的比例。
1 |
|
以上為將之前資料放上Streamlit的過程教學,在實作時應該很夠大家消化一下了。
我把地圖folium
的功能放在下一篇分開講!順便記錄一下,十月的颱風,放了兩天!
最後放上完整程式碼連結:
我的Github連結,喜歡可以按星星!