Pandas 繪圖


使用 Pandas 組織資料時,若想要繪圖,可以直接使用 Matplotlib,這可以掌握許多繪圖細節,然而對於簡單的繪圖需求,可以直接透過 Pandas 對 Matplotlib 的整合,例如〈NumPy 與 Matplotlib〉中的 sin 繪圖,使用 Pandas 的繪圖整合的話,可以如下撰寫:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

x = np.arange(0, 2 * np.pi, np.pi / 180)  # 0 到 2 * PI,步進值 PI / 180
y = np.sin(x)

sin = pd.Series(y, index = x)   
sin.plot(title = 'y = sin(x)', xlabel = 'x', ylabel = 'y')

plt.show()

繪製出來的圖案如下:

Pandas 繪圖

如果要畫散佈圖的話,必須使用 DataFrame,呼叫 plot 時指定 kind'scatter',並指定 xy 來自哪一行,例如:

import matplotlib.pyplot as plt
import pandas as pd

scores = pd.DataFrame(
    [
        [90, 99, 100],
        [99, 87, 94],
        [92, 85, 76],
        [87, 67, 72],
        [85, 89, 67]
    ],
    columns = ['數學', '英文', '物理']
)

scores.plot(kind = 'scatter', x = '數學', y = '英文')
plt.show()

這會顯示以下的圖案:

Pandas 繪圖

因此,對於〈NumPy 陣列資料型態〉中的謝爾賓斯基三角形,可以使用以下的程式:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

def sierpinski(n):
    def quotientAndRemainderZero(elem, n):
        quotient = elem // n
        remainder = elem % n
        return quotient & remainder == 0

    quotientAndRemainderZero = np.frompyfunc(quotientAndRemainderZero, 2, 1)

    nums = np.arange(n ** 2)
    nums = nums[np.where(quotientAndRemainderZero(nums, n))]
    return (nums % n, nums // n)


n = 64
x, y = sierpinski(n)

plotwidth = 6
axislim = (-0.5, n - 0.5)
plotsize = (plotwidth, plotwidth)
PTS_PER_INCH = 72
plotwidth_pts = PTS_PER_INCH * plotwidth
markersize = 0.775 * plotwidth_pts / n

tri = pd.DataFrame(np.array([x, y]).T)
tri.plot(
    title = 'Sierpinski triangle', 
    kind = 'scatter', 
    x = 0, 
    y = 1,
    xlabel = 'x', 
    ylabel = 'y',
    xlim = axislim,
    ylim = axislim,
    # Matplotlib 的 plot.scatter 方法需要的參數
    marker = 's',
    s = markersize ** 2
)
plt.show()

原本 Matplotlib 的 plot.scatter 方法需要的參數,可以附加在 DataFrameplot 方法上,它們會轉給 Matplotlib 的 plot.scatter 方法,繪製出來的圖案如下:

Pandas 繪圖

在最簡單的情境下,什麼都不用設,就會有預設的圖例、著色等,例如:

import matplotlib.pyplot as plt
import pandas as pd

scores = pd.DataFrame(
    [
        [90, 99, 100],
        [99, 87, 94],
        [92, 85, 76],
        [87, 67, 72],
        [85, 89, 67]
    ],
    columns = ['數學', '英文', '物理'],
    index = ['No.01', 'No.02', 'No.03', 'No.04', 'No.05']
)

scores.plot()
plt.show()

這會呈現出以下的圖案:

Pandas 繪圖

如果使用 Pandas,對於簡單的圖案,可以試著直接使用整合的繪圖功能,若需要設定的細節變多,或者是整合的繪圖功能無法直接滿足時,再試著直接設定 Matplotlib。