Python 散佈圖/折線圖(Scatter/Line Charts)

Photo by Ali Inay on Unsplash
Photo by Ali Inay on Unsplash
本文章中,我們將介紹如何使用 Python 的 Matplotlib、Seaborn、以及 Plotly Express 套件來繪製散佈圖(Scatter Charts)與折線圖(Line Charts)。

本文章中,我們將介紹如何使用 Python 的 Matplotlib、Seaborn、以及 Plotly Express 套件來繪製散佈圖(Scatter Charts)與折線圖(Line Charts)。

完整程式碼可以在 下載。

Matplotlib

Matplotlibplot() 可以繪製散佈圖與折線圖。它的宣告如下。我們在這邊只列出常用的參數,其餘的參數請參考官網。

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')
Matplotlib scatter chart
Matplotlib 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')
Matplotlib scatter chart
Matplotlib 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')
Matplotlib grouping scatter chart
Matplotlib grouping 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')
Matplotlib line chart
Matplotlib 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')
Seaborn scatter chart
Seaborn 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')
Seaborn grouping scatter chart
Seaborn grouping 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')
Seaborn line chart
Seaborn 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')
Seaborn grouping line chart
Seaborn grouping 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')
Plotly Express scatter chart
Plotly Express scatter chart
px.scatter(df, x='gdp', y='life',
           color='continent', title='Scatter Chart',
           hover_name='country', symbol='country',
           size='life', size_max=20)
Plotly Express grouping scatter chart
Plotly Express grouping scatter chart

我們可以在 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')
Plotly Express line chart
Plotly Express line chart
px.line(df, x='year', y='life', color='country', title='Line Chart', line_dash='country')
Plotly Express grouping line chart
Plotly Express grouping line chart

我們可以在 nbviewer 看到輸出的圖表。

大部分的參數的使用方法與 scatter() 一樣。而,參數 line_dash 會根據資料來分群並選擇線的樣式。

結論

我們介紹了三套繪製散佈圖與折線圖的套件,分別是 Matplotlib、Seaborn、和 Plotly Express。Seaborn 與 Plotly Express 提供高階的函式來幫我們可以快速地繪製出漂亮的圖表。此外,Plotly Express 還有互動的方式提供額外的資料。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

You May Also Like