介紹如何在 Python 中使用 matplotlib 的 xkcd 模式,繪製手繪卡通圖風格的插圖。
手繪卡通圖模式
若要使用 matplotlib 的 xkcd 模式繪製插圖樣式圖形,建議先安裝 Humor Sans 這個卡通風格的字型:
# 安裝 Humor Sans 字型
sudo apt-get install fonts-humor-sans
接著就可以在 Python 中使用 xkcd 模式繪製圖形了。
matplotlib 的 xkcd 模式可以自動將圖形轉為手繪卡通圖的風格,只要將普通的 matplotlib 繪圖程式碼放進來,就可以自動轉為 xkcd 風格的圖片:
from matplotlib import pyplot as plt
with plt.xkcd():
# 繪製 XKCD 風格圖形
fig1 = plt.figure()
# ...
# 繪製正常圖形
fig2 = plt.figure()
XKCD 風格折線圖
以下是一個 xkcd 風格折線圖的簡單範例:
from matplotlib import pyplot as plt
import numpy as np
# 繪製 XKCD 風格圖形
with plt.xkcd():
# 建立空的圖形
fig = plt.figure()
# 增加座標軸
ax = fig.add_axes((
0.1, # X 座標
0.2, # Y 座標
0.8, # 寬度
0.7 # 高度
))
# 不顯示上方與右方的方框
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 不顯示 X 軸與 Y 軸的刻度
ax.set_xticks([])
ax.set_yticks([])
# Y 軸顯示範圍
ax.set_ylim([-20, 20])
# 產生資料
data = np.repeat(10, 100)
data[70:] -= np.arange(30)
# 加入註解
ax.annotate('Annotation',
xy=(69, 9), # 標示位置
arrowprops=dict(arrowstyle='->'), # 箭頭屬性
xytext=(45, -5)) # 文字位置
# 繪製資料
ax.plot(data)
# 設定 X 軸與 Y 軸文字
ax.set_xlabel('x label')
ax.set_ylabel('y label')
# 加入文字
fig.text(0.5, 0.05, 'This is my title', ha='center')

XKCD 風格直方圖
以下是一個 xkcd 風格直方圖(histogram)的簡單範例:
import matplotlib.pyplot as plt
import numpy as np
# 繪製 XKCD 風格圖形
with plt.xkcd():
# 產生常態分布資料
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
# 繪製直方圖
plt.hist(x, 50, density=True, facecolor='g', alpha=0.75)
# 設定 X 軸與 Y 軸文字
plt.xlabel('Smarts')
plt.ylabel('Probability')
# 設定圖形標題
plt.title('Histogram of IQ')
# 加入文字
plt.text(45, .025, r'$\mu=100,\ \sigma=15$')
# X 軸 與 Y 軸顯示範圍
plt.xlim(40, 160)
plt.ylim(0, 0.03)
# 顯示格線
plt.grid(True)

XKCD 風格長條圖
以下是一個 xkcd 風格長條圖(bar plot)的簡單範例:
import matplotlib.pyplot as plt
import numpy as np
# 繪製 XKCD 風格圖形
with plt.xkcd():
# 產生資料
x = np.arange(4)
money = [150, 280, 550, 180]
# 繪製長條圖
plt.bar(x, money)
# X 軸資料標示文字
plt.xticks(x, ('Bill', 'Fred', 'Mary', 'Sue'))

XKCD 風格箱形圖
以下是一個 xkcd 風格箱形圖(box plot)的簡單範例:
import matplotlib.pyplot as plt
import numpy as np
# 繪製 XKCD 風格圖形
with plt.xkcd():
# 產生常態分布資料
x1 = 15 + 50 * np.random.randn(200)
x2 = 30 * np.random.randn(150)
x3 = 30 + 100 * np.random.randn(150)
data = [x1, x2, x3]
# 繪製箱形圖
plt.boxplot(data)
# X 軸資料標示文字
plt.xticks([1, 2, 3], ['mon', 'tue', 'wed'])

XKCD 風格圓餅圖
以下是一個 xkcd 風格圓餅圖(pie chart)的簡單範例:
import matplotlib.pyplot as plt
# 繪製 XKCD 風格圖形
with plt.xkcd():
# 建立資料
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.2, 0, 0) # 將 Hogs 拆開
# 繪製圓餅圖
fig, ax = plt.subplots()
ax.pie(sizes, explode=explode, labels=labels, autopct='%1d%%',
shadow=False, startangle=90)
ax.axis('equal') # 將 X 與 Y 座標軸比例設定為相等

常見問題
如果安裝了 Humor Sans 字型之後,還是出現找不到字型的問題,可以嘗試執行以下 Python 指令重建 matplotlib 字型庫:
# 重建 matplotlib 字型庫
import matplotlib
matplotlib.font_manager._rebuild()
