利用Python Plotly 來進行成績可視化分析

Ho Yipyik
11 min readJul 21, 2020

愉快的期末考試已經過去. 高校學生大多都開始了查詢成績的刺激旅程. 無論學校為教務系統傾注了多少金錢, 成績單網頁的表格總是那麽簡陋樸素. 如果各位的成績不夠理想, 那麽就更加顯得慘不忍睹.

爲了展現出自己作爲工科生的專業, 爲了更加優雅地在別人面前推銷自己. 直白點講, 爲了給自己蒼白的收穫增添一抹簡約的美感. 我想到了用Python 的 Plotly來做一下數據的可視化處理.

Python的迷人之處在於豐富的庫, 我們只需要秉持著敬仰之心, 下載安裝導入就可以直接使用. 即使是沒有編程的經驗, 簡單瞭解基礎後, 直接照著教程學習完成Chart的繪製也沒有太高的難度.

個人不瞭解數據庫和pandas知識, 而官方的doc中的舉例大多不是.csv的數據源, 雖然對熟練運用的數據工具的專業人士來講沒有區別. 但是在缺少示例和講解的情況下學習.csv的操作確實帶給還在念大一的我很大的挑戰. 所以想寫這個超入門版的教程.

大概的效果展示:

  • Bubble Chart Verion 1
Bubble Chart Version 1
  • Bubble Chart Verion 2
Bubble Chart Version 2

工具和準備操作:

注: 本文為在Windows10平臺的操作, 其他的平臺基本類似.

Jupiter Notebook :

Jupyter Notebook(前身是IPython Notebook)是一個基於Web的交互式計算環境,用於創建Jupyter Notebook文檔。Notebook一詞可以通俗地引用許多不同的實體,主要是Jupyter Web應用程式、Jupyter Python Web伺服器或Jupyter文檔格式(取決於上下文)。Jupyter Notebook文檔是一個JSON文檔,遵循版本化模式,包含一個有序的輸入/輸出單元格列表,這些單元格可以包含代碼、文本(使用Markdown語言)、數學、圖表和富媒體,通常以「.ipynb」結尾擴展。

From Wikipedia: https://zh.wikipedia.org/wiki/Jupyter#Jupyter_Notebook

爲了真的讓沒玩過電腦科的人也可以上手, 所以開始的教程顯得十分智障.

  1. Google搜尋Anaconda并且按照提示安裝.
  2. 進入Anaconda 程式完成庫的安裝
點擊Environments
左邊選All, 在右邊的檢索框搜尋 plotly
點選 plotly進行安裝

3. 啓動 Jupiter Notebook:

直接點擊

4. 建立新的 Notebook:

在New選中Python3 完成建立

5.Jupiter Notebook的内部介紹:

  • 入門教學:

https://medium.com/fishtung/python-jupyter-notebook-%E4%BD%BF%E7%94%A8%E6%95%99%E5%AD%B8-90b31fda3f5a

  • 快捷鍵:

https://opus.konghy.cn/ipynb/jupyter-notebook-keyboard-shortcut.html

CSV檔案的預處理

  • .csv格式是一種通過逗號以及換行符進行分割的一種儲存的資料的形式, 沒有其他的複雜儲存結構. 通俗來講就是表示形式比較簡單
  • 爲了閲讀方便.csv檔案可以使用MicroSoft Excel或者Google Sheet來開啓和處理.
  • 爲了照顧 Ctrl C + Ctrl V 玩家的體驗, 這裏推薦各位將表頭改爲以下形式.
分別是: 序號, 學期, 科目, 分數, 學分, 種類, 科目風格

Score 和 Credit 必須是數字的形式, 其他的類型隨意.

Bubble Chart Version 1

  1. 庫和csv檔案的導入
import pandas as pd
import plotly.graph_objects as go
from plotly.offline import iplot
df = pd.read_csv("Score.csv")

本項目將使用pandas和plotly. Version 1 使用的是plotly中的graph_objects和offline的iplot.

注意將Score.csv檔案放在和 ipynb 檔案相同的資料夾内.

2. 圖表的參數賦值和繪製

fig = go.Figure()    
chart_color = [(-float(each)) for each in df.Score]
chart_size = [(float(each)*17) for each in df.Credit]
data = [
{
'y': df.Score,
'x': df.Credit,
'mode': 'markers',
'marker': {
'color':chart_color,
'size':chart_size,
'showscale': False
},
"text": df.Subject
}
]
fig = dict(data = data)
iplot(fig)

簡單來講:

  • 建立fig
  • 設定data和layout[本代碼沒有體現]
  • 通過dict 將data和layout賦值給fig
  • iplot(fig)來繪圖

單獨的data部分:

data = [
{
'y': df.Score, #給y軸賦值分數
'x': df.Credit, #給x軸賦值學分
'mode': 'markers',
'marker': {
'color':chart_color, #設定顔色和氣泡的大小
'size':chart_size,
'showscale': False
#關閉scale(只是個色條, 本圖爲了美觀沒有開啓)
},
"text": df.Subject #滑鼠位於Bubble上方時顯示科目名稱
}
]

color和size的變量的解釋:

chart_color = [(-float(each)) for each in df.Score]  
chart_size = [(float(each)*17) for each in df.Credit]
'''
for each in df.Score 表示逐個讀取
float(each)是强制的浮點型數的轉換
color是和Score的相關,最前面加上了 - 是爲了讓高分的科目顔色深一些.
size和學分大小相關, 學分占比越高的科目的Bubble更大. *17也是爲了大小合適
'''

3. 完整的Version 1 代碼

import pandas as pd
import plotly.graph_objects as go
from plotly.offline import iplot
df = pd.read_csv('Score.csv')fig = go.Figure()
chart_color = [(-float(each)) for each in df.Score]
chart_size = [(float(each)*17) for each in df.Credit]
data = [
{
'y': df.Score,
'x': df.Credit,
'mode': 'markers',
'marker': {
'color':chart_color,
'size':chart_size,
'showscale': False
},
"text": df.Subject
}
]
fig = dict(data = data)
iplot(fig)

4. 展示

Bubble Chart Version 1

Bubble Chart Version 2

  1. 庫和csv檔案的導入
import pandas as pd
from plotly.offline import iplot
import plotly.express as px
df = pd.read_csv("Score.csv")

plotly.express 和version1的go在内部沒有本質區別, 只是另外一種表現的形式

plotly.express的簡介:

The plotly.express module (usually imported as px) contains functions that can create entire figures at once, and is referred to as Plotly Express or PX. Plotly Express is a built-in part of the plotly library, and is the recommended starting point for creating most common figures.

Link: https://plotly.com/python/plotly-express/

2. 圖表的參數賦值和繪製

fig = px.scatter(
x = df.Credit,
y = df.Score,
size = df.Credit,
color = df.Style,
log_x=True,
size_max = 60,
hover_name = df.Subject,
)
fig.update_layout(
xaxis={
'title':'Credit',
'type':'log'},
yaxis={'title':'Score'},
title='Socre Analysis Bubble Chart (PX Version)',
legend = {'title' : "Subject Type"},

),

fig.show()
  • 建立了px.scatter()
  • 在px.scatter()内部進行了變量和參數的賦值
  • 通過update_layout() 完成了layout外觀的設定
  • fig.show()展示

變量的賦值:

fig = px.scatter(
x = df.Credit, #x對應的學分
y = df.Score, #y對應的分數
size = df.Credit, #大小和學分對應
color = df.Style, #顔色和學科風格對應
log_x=True, #使用了不均一比例尺方便低學分占比科目顯示
size_max = 60, #氣跑大小的設定
hover_name = df.Subject, #滑鼠移動至上方顯示學科
)
#學科風格指科學類,電腦類,社會類等

layout設定:

fig.update_layout(
xaxis={
'title':'Credit', #x軸顯示的標題
'type':'log'},
yaxis={'title':'Score'}, #y軸顯示的標題
title='Socre Analysis Bubble Chart (PX Version)', #大標題
legend = {'title' : "Subject Type"}, #圖例的標題

)

3. 完整的Version 2代碼

import pandas as pd
from plotly.offline import iplot
import plotly.express as px
df = pd.read_csv("Score.csv")fig = px.scatter(
x = df.Credit,
y = df.Score,
size = df.Credit,
color = df.Style,
log_x=True,
size_max = 60,
hover_name = df.Subject,
)fig.update_layout(
xaxis={
'title':'Credit',
'type':'log'},
yaxis={'title':'Score'},
title='Socre Analysis Bubble Chart (PX Version)',
legend = {'title' : "Subject Type"},

),

fig.show()

4. 展示

Bubble Chart Version 2

--

--