本文章中,我們將介紹如何使用 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 還有互動的方式提供額外的資料。









