本文章中,我們將介紹如何使用 Python 的 Matplotlib、Seaborn、以及 Plotly Express 套件來繪製散佈圖(Scatter Charts)與折線圖(Line Charts)。
Table of Contents
Matplotlib
Matplotlib 的 plot() 可以繪製散佈圖與折線圖。它的宣告如下。我們在這邊只列出常用的參數,其餘的參數請參考官網。
matplotlib.pyplot.plot(x, y, fmt, data)
- x:x 軸上的座標。型態為 array-like 或 data 的 column 名稱。
- y:y 軸上的座標。型態為 array-like 或 data 的 column 名稱。
- fmt:[marker][line][color] 格式的字串。詳細的值可以參考官網。
- marker:點的樣式。
- line:線的樣式。
- color:顏色。
- data:資料。
此外,Matplotlib 的 scatter() 也可以繪製散佈圖。它可以設定每個點的大小和顏色。
matplotlib.pyplot.scatter(x, y, sizes=None, c=None, marker=None, cmap=None, alpha=None, data=None)
- x:x 軸上的座標。型態為 array-like 或 data 的 column 名稱。
- y:y 軸上的座標。型態為 array-like 或 data 的 column 名稱。
- data:資料。
- marker:點的樣式。
- sizes:點的大小。型態為 float 或 array-like。
- c:顏色。型態為 color 或 array-like。
- cmap:color map。
- alpha:不透明度。型態為 float。
Scatter Charts
下面的範例顯示如何使用 plot() 繪製散佈圖。
import matplotlib.pyplot as plt x = [1, 2, 3, 4, 5] y = [2, 3, 4, 5, 1] plt.plot(x, y, 'o', label='o') plt.plot(y, x, 'x', label='x') plt.legend() plt.xlabel('X') plt.ylabel('Y') plt.title('Scatter Chart')
範例一中,我們用 plot() 繪製 (x, y),參數 label 可以設定右上角的說明文字,並且呼叫 legend() 來顯示右上角的說明。xlabel() 和 ylabel() 可以設定 x 軸與 y 軸的標題。而 title()
是設定整個圖表的標題。
import pandas as pd df = pd.DataFrame([ [1, 2], [2, 3], [3, 4], [4, 5], [5, 1], ], columns=['x', 'y']) plt.plot('x', 'y', 'bs', data=df, label="s") plt.legend() plt.xlabel('X') plt.ylabel('Y') plt.title('Scatter Chart')
範例二顯示如何使用參數 data。當傳一個 DataFrame 給參數 data 時,我們只要傳入 column 名稱給參數 x 和 y 即可。
下面的範例顯示如何使用 scatter() 繪製散佈圖。
import numpy as np colors = np.random.rand(5) sizes = np.random.rand(5) * 1000 plt.scatter(x, y, c=colors, cmap='jet', sizes=sizes, alpha=0.3) plt.colorbar() plt.xlabel('X') plt.ylabel('Y') plt.title('Scatter Chart')
plt.scatter('x', 'y', data=df, c=colors, cmap='jet', sizes=sizes, alpha=0.3) plt.colorbar() plt.xlabel('X') plt.ylabel('Y') plt.title('Scatter Chart')
範例三與四中,我們改用 scatter() 繪製圖表。colors
的值會是 [0, 1] 區間,就會對應到 color map 裡面的分佈。jet
是 Matplotlib 裡內建的一個 color map 的名稱。colorbar() 會顯示右邊的顏色條。
Line Charts
下面的範例顯示如何使用 plot() 繪製折線圖。
import matplotlib.pyplot as plt x = [1, 2, 3, 4, 5] y = [2, 3, 4, 5, 1] plt.plot(x, y, 'ro-', label='o') plt.plot(y, x, 'gx--', label='x') plt.legend() plt.xlabel('X') plt.ylabel('Y') plt.title('Line Chart')
與繪製散佈圖的方法幾乎一樣,差別在要在參數 marker 裡加上線的樣式。範例中,我們使用了直線(-)和虛線(-)。線的樣式共有四種,可以參考官網。
Seaborn
Seaborn 使用不同的函式來繪製散佈圖和折線圖。與 Matplotlib 相比,Seaborn 可以簡單地繪製出更漂亮的圖表。當然 Matplotlib 也可以繪製出一樣漂亮的圖表,但是就要設定比較多得東西。
Scatter Charts
scatterplot() 可以繪製散佈圖。它的宣告如下。我們在這邊只列出常用的參數,其餘的參數請參考官網。
seaborn.scatterplot(*, x=None, y=None, hue=None, style=None, size=None, data=None, palette=None, sizes=None, alpha=None)
- x:x 軸上的座標。型態為 data 的 column 名稱或是 array。
- y:y 軸上的座標。型態為 data 的 column 名稱或是 array。
- data:資料。
- hue:顏色分群。型態為 data 的 column 名稱或是 array。
- style:樣式分群。型態為 data 的 column 名稱或是 array。
- size:大小分群。型態為 data 的 column 名稱或是 array。
- sizes:大小。型態為 list、dict、或 tuple。
- alpha:不透明度。
- palette:color map。
範例如下。
import pandas as pd import seaborn as sns df = pd.DataFrame([ ['Asia', 'T', 120, 150], ['Asia', 'J', 150, 100], ['Europe', 'E', 150, 200], ['Europe', 'F', 200, 150], ['Americas', 'U', 250, 150], ['Americas', 'M', 70, 100], ], columns=['continent', 'country', 'gdp', 'life']) ax = sns.scatterplot(x=df['gdp'], y=df['life'], hue=df['continent']) ax.set_title('Scatter Chart')
ax = sns.scatterplot(x='gdp', y='life', data=df, hue='continent', style='continent', palette='Set2', size='continent', sizes=(20, 100)) ax.set_title('Scatter Chart')
我們可以看到 scatterplot() 預設用 column 的名稱作為 x 軸與 y 軸的標題。參數 hue 可以幫我們分類並選擇不同的顏色,相當地方便。另外,參數 style 與 size 也都是只要填入 column 的名稱,它們就會根據資料幫我們分類並選擇不同的樣式和大小。
而,參數 sizes 是指定大小的區間。當根據參數 size 分類後,會對應到 sizes 的區間來選擇大小。
參數 palette 是設定 color map。範例中,我們設定使用內建的 Set2 palette。
set_title()
則是設定整個圖表的標題。
Line Charts
lineplot() 可以繪製折線圖。它的宣告如下。我們在這邊只列出常用的參數,其餘的參數請參考官網。
seaborn.lineplot(*, x=None, y=None, hue=None, size=None, style=None, data=None, palette=None, sizes=None)
- x:x 軸上的座標。型態為 data 的 column 名稱或是 array。
- y:y 軸上的座標。型態為 data 的 column 名稱或是 array。
- data:資料。
- hue:顏色分群。型態為 data 的 column 名稱或是 array。
- style:樣式分群。型態為 data 的 column 名稱或是 array。
- size:大小分群。型態為 data 的 column 名稱或是 array。
- sizes:大小。型態為 list、dict、或 tuple。
- palette:color map。
lineplot() 的參數與 scatterplot() 非常的相似。常用的幾個參數幾乎一模一樣。讓我們來看看範例吧。
import pandas as pd import seaborn as sns df = pd.DataFrame([ ['T', 2019, 150], ['T', 2020, 200], ['E', 2019, 170], ['E', 2020, 160], ['U', 2019, 200], ['U', 2020, 180], ], columns=['country', 'year', 'life']) ax = sns.lineplot(x='year', y='life', data=df.query('country=="T"')) ax.set_title('Line Chart')
ax = sns.lineplot(x='year', y='life', data=df, hue='country', style='country', palette='Set2', size='country', sizes=(2, 10)) ax.set_title('Line Chart')
我們可以看到,lineplot() 的範例與 scatterplot() 的範例幾乎一樣。與 Matplotlib 相比,lineplot() 自動幫我們選擇線的樣式。這些自動化的功能,讓我們可以更專注在程式的商業邏輯部分。
Plotly Express
Plotly Express 也是提供不同的函式來繪製散佈圖和折線圖。它的使用方法和 Seaborn 一樣相當地簡潔。此外,它還提供了更多的互動方式。
Scatter Charts
scatter() 可以繪製散佈圖。它的宣告如下。它有相當多的參數,但我們在這邊只列出常用的參數,其餘的參數請參考官網。
plotly.express.scatter(data_frame=None, x=None, y=None, color=None, symbol=None, size=None, hover_name=None, opacity=None, size_max=None, title=None)
- data_frame:資料。
- x:x 軸上的座標。型態為 data 的 column 名稱或是 array。
- y:y 軸上的座標。型態為 data 的 column 名稱或是 array。
- title:圖表的標題。
- color:顏色分群。型態為 data 的 column 名稱或是 array。
- symbol:樣式分群。型態為 data 的 column 名稱或是 array。
- size:大小分群。型態為 data 的 column 名稱或是 array。
- size_max:大小的最大值。
- opacity:不透明度。
- hover_name:游標移到點上時,會顯示點的詳細資料。hover_name 可以設定這個詳細資料框的標題。
範例如下。
import pandas as pd import plotly.express as px df = pd.DataFrame([ ['Asia', 'T', 120, 150], ['Asia', 'J', 150, 100], ['Europe', 'E', 150, 200], ['Europe', 'F', 200, 150], ['Americas', 'U', 250, 150], ['Americas', 'M', 70, 100], ], columns=['continent', 'country', 'gdp', 'life']) px.scatter(df, x='gdp', y='life', title='Scatter Chart')
px.scatter(df, x='gdp', y='life', color='continent', title='Scatter Chart', hover_name='country', symbol='country', size='life', size_max=20)
我們可以在 nbviewer 看到輸出的圖表。
與 Seaborn 的使用方式非常相似,大部分的參數,我們只需要傳入 column 的名稱,然後它會根據資料來分群並選擇顏色、樣式、和大小。
Line Charts
line() 可以繪製散佈圖。它的宣告如下。我們在這邊只列出常用的參數,其餘的參數請參考官網。
plotly.express.line(data_frame=None, x=None, y=None, color=None, line_dash=None, title=None)
- data_frame:資料。
- x:x 軸上的座標。型態為 data 的 column 名稱或是 array。
- y:y 軸上的座標。型態為 data 的 column 名稱或是 array。
- title:圖表的標題。
- color:顏色分群。型態為 data 的 column 名稱或是 array。
- line_dash:樣式分群。型態為 data 的 column 名稱或是 array。
範例如下。
import pandas as pd import plotly.express as px df = pd.DataFrame([ ['T', 2019, 150], ['T', 2020, 200], ['E', 2019, 170], ['E', 2020, 160], ['U', 2019, 200], ['U', 2020, 180], ], columns=['country', 'year', 'life']) px.line(df.query('country=="T"'), x='year', y='life', title='Line Chart')
px.line(df, x='year', y='life', color='country', title='Line Chart', line_dash='country')
我們可以在 nbviewer 看到輸出的圖表。
大部分的參數的使用方法與 scatter() 一樣。而,參數 line_dash 會根據資料來分群並選擇線的樣式。
結論
我們介紹了三套繪製散佈圖與折線圖的套件,分別是 Matplotlib、Seaborn、和 Plotly Express。Seaborn 與 Plotly Express 提供高階的函式來幫我們可以快速地繪製出漂亮的圖表。此外,Plotly Express 還有互動的方式提供額外的資料。