介紹如何在 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()
參考資料:matplotlib