使用Python繪制可愛的招財貓
本篇博客不僅適合對 Python 繪圖感興趣的開發(fā)者,還能幫助你了解如何利用 matplotlib 繪制復雜的卡通形象。不需要額外圖片資源,一切都用代碼實現!

1. 為什么選擇用 Python 繪制?
繪制卡通形象通常需要設計工具(例如 Photoshop 或 Illustrator),但通過 Python,我們可以:
- 全面掌控每一部分的比例和顏色:所有幾何形狀均由代碼生成,你可以精確調整它們的位置、大小和顏色。
- 程序化生成和復用:繪制的招財貓代碼可以用作模板,方便生成不同樣式和設計的圖案。
- 學習數學和編程技巧:繪制圖形涉及幾何學、坐標系統(tǒng)和編程邏輯。
如果你是一個數據分析師或開發(fā)者,這個過程會讓你對 matplotlib 的藝術應用有更深的體會!
2. 繪圖的基本概念
在 Python 中,我們將使用以下方法和模塊完成繪制任務:
matplotlib.patches模塊:- 提供了繪制基本幾何圖形的功能,例如圓形、橢圓形、多邊形等。
- 通過
Circle、Ellipse、Polygon等來構建復雜的卡通形象。
matplotlib.pyplot模塊:- 提供了繪圖區(qū)域(Figure)和坐標軸(Axes)。
- 幫助我們將圖形添加到畫布上,并進行整體調整。
要繪制一只完整的招財貓,我們需要將各個部分分解為基礎幾何形狀,如下所示:
| 部件 | 幾何形狀 | 示例 |
|---|---|---|
| 頭部和身體 | 圓形、橢圓 | Circle, Ellipse |
| 耳朵 | 三角形 | Polygon |
| 五官(眼、鼻、嘴) | 弧線和圓形 | Arc, Circle |
| 胡須 | 直線 | plot |
| 手和腳 | 橢圓形 | Ellipse |
| 裝飾物(鈴鐺、卷軸等) | 圓形、長方形 | Circle, FancyBboxPatch |
3. 實現代碼解析
以下是完整代碼,按模塊逐步解析。
3.1 設置繪圖畫布
我們首先創(chuàng)建繪圖畫布,并設置招財貓的坐標系范圍。注意:需要關閉坐標軸,以便突出卡通形象。
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, Ellipse, Polygon, FancyBboxPatch, Arc
# 創(chuàng)建畫布
fig, ax = plt.subplots(figsize=(6, 8))
ax.set_xlim(-10, 10)
ax.set_ylim(-12, 12)
ax.axis('off') # 隱藏坐標軸3.2 繪制頭部和身體
招財貓的頭部和身體由一個大圓和一個橢圓組成。
# 繪制身體 body = Ellipse((0, -2), width=12, height=14, color='white', edgecolor='black', linewidth=2) ax.add_patch(body) # 繪制頭部 head = Circle((0, 5), radius=5, color='white', edgecolor='black', linewidth=2) ax.add_patch(head)
3.3 繪制耳朵和內部細節(jié)
耳朵由兩個三角形構成,分別是外部的白色耳朵和內部的紅色部分。
# 外部耳朵 left_ear = Polygon([[-4, 8], [-6, 12], [-2, 10]], closed=True, color='white', edgecolor='black', linewidth=2) right_ear = Polygon([[4, 8], [6, 12], [2, 10]], closed=True, color='white', edgecolor='black', linewidth=2) ax.add_patch(left_ear) ax.add_patch(right_ear) # 內部耳朵 left_inner_ear = Polygon([[-4.5, 8.5], [-5.5, 11], [-3.5, 9.5]], closed=True, color='red', edgecolor='black', linewidth=1) right_inner_ear = Polygon([[4.5, 8.5], [5.5, 11], [3.5, 9.5]], closed=True, color='red', edgecolor='black', linewidth=1) ax.add_patch(left_inner_ear) ax.add_patch(right_inner_ear)
3.4 繪制五官
招財貓的五官以弧線和圓形為主,營造出微笑的效果。
# 笑眼 left_eye = Arc((-2, 6), width=2, height=1, theta1=0, theta2=180, color='black', linewidth=2) right_eye = Arc((2, 6), width=2, height=1, theta1=0, theta2=180, color='black', linewidth=2) ax.add_patch(left_eye) ax.add_patch(right_eye) # 鼻子和嘴巴 nose = Circle((0, 5), radius=0.2, color='black') ax.add_patch(nose) mouth_left = Arc((-0.5, 4.6), width=1, height=0.5, theta1=0, theta2=-180, color='black') mouth_right = Arc((0.5, 4.6), width=1, height=0.5, theta1=0, theta2=-180, color='black') ax.add_patch(mouth_left) ax.add_patch(mouth_right)
3.5 繪制裝飾物和肚子文字
- 項圈和鈴鐺:
# 項圈 collar = Ellipse((0, 3.5), width=8, height=1.5, color='red', edgecolor='black', linewidth=2) ax.add_patch(collar) # 鈴鐺 bell = Circle((0, 2.5), radius=0.8, color='gold', edgecolor='black', linewidth=2) bell_inner = Circle((0, 2.5), radius=0.3, color='black') ax.add_patch(bell) ax.add_patch(bell_inner)
紅色卷軸和文字:
# 紅色卷軸 scroll = FancyBboxPatch((6, -2), width=1.5, height=5, boxstyle="round,pad=0.1", color='red', edgecolor='black', linewidth=2) ax.add_patch(scroll) ax.text(6.75, 0.5, "招財\n進寶", color='black', fontsize=10, ha='center', va='center', rotation=90)
肚子上的“福 ”字:
# 福字 ax.text(0, -3, "福", color='red', fontsize=30, ha='center', va='center')
4. 完整代碼
將所有部分整合在一起:
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, Ellipse, Polygon, FancyBboxPatch, Arc
def draw_lucky_cat():
fig, ax = plt.subplots(figsize=(6, 8))
ax.set_xlim(-10, 10)
ax.set_ylim(-12, 12)
ax.axis('off')
# 繪制身體
body = Ellipse((0, -2), width=12, height=14, color='white', edgecolor='black', linewidth=2)
ax.add_patch(body)
# 繪制頭部
head = Circle((0, 5), radius=5, color='white', edgecolor='black', linewidth=2)
ax.add_patch(head)
# 繪制耳朵
left_ear = Polygon([[-4, 8], [-6, 12], [-2, 10]], closed=True, color='white', edgecolor='black', linewidth=2)
right_ear = Polygon([[4, 8], [6, 12], [2, 10]], closed=True, color='white', edgecolor='black', linewidth=2)
ax.add_patch(left_ear)
ax.add_patch(right_ear)
# 耳朵內部
left_inner_ear = Polygon([[-4.5, 8.5], [-5.5, 11], [-3.5, 9.5]], closed=True, color='red', edgecolor='black', linewidth=1)
right_inner_ear = Polygon([[4.5, 8.5], [5.5, 11], [3.5, 9.5]], closed=True, color='red', edgecolor='black', linewidth=1)
ax.add_patch(left_inner_ear)
ax.add_patch(right_inner_ear)
# 繪制眼睛
left_eye = Ellipse((-2, 6), width=1, height=0.5, color='black')
right_eye = Ellipse((2, 6), width=1, height=0.5, color='black')
ax.add_patch(left_eye)
ax.add_patch(right_eye)
# 繪制鼻子
nose = Ellipse((0, 5), width=0.5, height=0.3, color='black')
ax.add_patch(nose)
# 繪制嘴巴
mouth_left = Arc((-0.5, 4.5), width=1, height=0.5, theta1=0, theta2=-180, color='black')
mouth_right = Arc((0.5, 4.5), width=1, height=0.5, theta1=0, theta2=-180, color='black')
ax.add_patch(mouth_left)
ax.add_patch(mouth_right)
# 繪制胡須
ax.plot([-3, -6], [5.5, 5.8], color='black', linewidth=1)
ax.plot([-3, -6], [5, 5], color='black', linewidth=1)
ax.plot([-3, -6], [4.5, 4.2], color='black', linewidth=1)
ax.plot([3, 6], [5.5, 5.8], color='black', linewidth=1)
ax.plot([3, 6], [5, 5], color='black', linewidth=1)
ax.plot([3, 6], [4.5, 4.2], color='black', linewidth=1)
# 繪制紅色項圈
collar = Ellipse((0, 3), width=8, height=2, color='red', edgecolor='black', linewidth=2)
ax.add_patch(collar)
# 繪制鈴鐺
bell = Circle((0, 2.3), radius=0.8, color='gold', edgecolor='black', linewidth=2)
bell_inner = Circle((0, 2.3), radius=0.3, color='black')
ax.add_patch(bell)
ax.add_patch(bell_inner)
# 繪制左手和金幣
left_hand = Ellipse((-5, -2), width=3, height=6, angle=30, color='white', edgecolor='black', linewidth=2)
ax.add_patch(left_hand)
coin = Ellipse((-7, -1.5), width=3, height=2, color='gold', edgecolor='black', linewidth=2)
ax.add_patch(coin)
# 繪制右手和紅色卷軸
right_hand = Ellipse((5, -2), width=3, height=6, angle=-30, color='white', edgecolor='black', linewidth=2)
ax.add_patch(right_hand)
scroll = FancyBboxPatch((6, -2), width=1.5, height=5, boxstyle="round,pad=0.1", color='red', edgecolor='black', linewidth=2)
ax.add_patch(scroll)
ax.text(6.75, 0, "招財\n進寶", color='black', fontsize=10, ha='center', va='center', rotation=90)
# 繪制腳
left_foot = Ellipse((-3, -9), width=3, height=2, color='white', edgecolor='black', linewidth=2)
right_foot = Ellipse((3, -9), width=3, height=2, color='white', edgecolor='black', linewidth=2)
ax.add_patch(left_foot)
ax.add_patch(right_foot)
# 繪制肚子上的 "福" 字
ax.text(0, -3, "福", color='red', fontsize=30, ha='center', va='center')
plt.show()
draw_lucky_cat()最終效果
運行本文的代碼后,我們將獲得如下所示的可愛卡通招財貓:

從運行結果來看,當前繪圖效果和預期的細節(jié)相去甚遠,需要進一步優(yōu)化來更好優(yōu)化招財貓形象。以下是對代碼的優(yōu)化建議和改進版代碼:
優(yōu)化建議
- 頭部和身體比例:目前身體和頭部的比例以及位置沒有調整好,應該讓頭部顯得更大,同時調整身體位置。
- 耳朵和五官細節(jié):耳朵形狀可以更接近原圖的尖銳感,眼睛需要弧形的笑眼,鼻子和嘴巴也需要更加擬合。
- 裝飾物和手臂:紅色項圈、鈴鐺以及手臂的位置要更準確,尤其是左手抱著的金幣和右手的卷軸。
- 肚子上的福字:調整字體大小和位置,使其更貼合身體。
- 整體布局:對位置和比例重新調整,讓招財貓整體更加協調。
改進后的代碼
以下是優(yōu)化版的代碼,包含上述改進:
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, Ellipse, Polygon, FancyBboxPatch, Arc
def draw_optimized_lucky_cat():
fig, ax = plt.subplots(figsize=(6, 8))
ax.set_xlim(-10, 10)
ax.set_ylim(-12, 12)
ax.axis('off')
# 繪制身體
body = Ellipse((0, -2), width=12, height=14, color='white', edgecolor='black', linewidth=2)
ax.add_patch(body)
# 繪制頭部
head = Circle((0, 5), radius=5, color='white', edgecolor='black', linewidth=2)
ax.add_patch(head)
# 繪制耳朵
left_ear = Polygon([[-4, 8], [-6, 12], [-2, 10]], closed=True, color='white', edgecolor='black', linewidth=2)
right_ear = Polygon([[4, 8], [6, 12], [2, 10]], closed=True, color='white', edgecolor='black', linewidth=2)
ax.add_patch(left_ear)
ax.add_patch(right_ear)
# 耳朵內部
left_inner_ear = Polygon([[-4.5, 8.5], [-5.5, 11], [-3.5, 9.5]], closed=True, color='red', edgecolor='black', linewidth=1)
right_inner_ear = Polygon([[4.5, 8.5], [5.5, 11], [3.5, 9.5]], closed=True, color='red', edgecolor='black', linewidth=1)
ax.add_patch(left_inner_ear)
ax.add_patch(right_inner_ear)
# 繪制笑眼
left_eye = Arc((-2, 6), width=2, height=1, theta1=0, theta2=180, color='black', linewidth=2)
right_eye = Arc((2, 6), width=2, height=1, theta1=0, theta2=180, color='black', linewidth=2)
ax.add_patch(left_eye)
ax.add_patch(right_eye)
# 繪制鼻子和嘴巴
nose = Circle((0, 5), radius=0.2, color='black')
ax.add_patch(nose)
mouth_left = Arc((-0.5, 4.6), width=1, height=0.5, theta1=0, theta2=-180, color='black')
mouth_right = Arc((0.5, 4.6), width=1, height=0.5, theta1=0, theta2=-180, color='black')
ax.add_patch(mouth_left)
ax.add_patch(mouth_right)
# 繪制胡須
ax.plot([-3, -6], [5.5, 5.8], color='black', linewidth=1)
ax.plot([-3, -6], [5, 5], color='black', linewidth=1)
ax.plot([-3, -6], [4.5, 4.2], color='black', linewidth=1)
ax.plot([3, 6], [5.5, 5.8], color='black', linewidth=1)
ax.plot([3, 6], [5, 5], color='black', linewidth=1)
ax.plot([3, 6], [4.5, 4.2], color='black', linewidth=1)
# 繪制紅色項圈
collar = Ellipse((0, 3.5), width=8, height=1.5, color='red', edgecolor='black', linewidth=2)
ax.add_patch(collar)
# 繪制鈴鐺
bell = Circle((0, 2.5), radius=0.8, color='gold', edgecolor='black', linewidth=2)
bell_inner = Circle((0, 2.5), radius=0.3, color='black')
ax.add_patch(bell)
ax.add_patch(bell_inner)
# 繪制左手和金幣
left_hand = Ellipse((-4.5, -2), width=3, height=5, angle=30, color='white', edgecolor='black', linewidth=2)
ax.add_patch(left_hand)
coin = Ellipse((-7, -1.5), width=3, height=2, color='gold', edgecolor='black', linewidth=2)
ax.add_patch(coin)
# 繪制右手和紅色卷軸
right_hand = Ellipse((4.5, -2), width=3, height=5, angle=-30, color='white', edgecolor='black', linewidth=2)
ax.add_patch(right_hand)
scroll = FancyBboxPatch((6, -2), width=1.5, height=5, boxstyle="round,pad=0.1", color='red', edgecolor='black', linewidth=2)
ax.add_patch(scroll)
ax.text(6.75, 0.5, "招財\n進寶", color='black', fontsize=10, ha='center', va='center', rotation=90)
# 繪制腳
left_foot = Ellipse((-3, -8.5), width=3, height=2, color='white', edgecolor='black', linewidth=2)
right_foot = Ellipse((3, -8.5), width=3, height=2, color='white', edgecolor='black', linewidth=2)
ax.add_patch(left_foot)
ax.add_patch(right_foot)
# 繪制肚子上的 "福" 字
ax.text(0, -3, "福", color='red', fontsize=30, ha='center', va='center')
plt.show()
draw_optimized_lucky_cat()改進后的效果
運行優(yōu)化后的代碼,你會發(fā)現:
- 五官更生動:笑眼、鼻子和嘴巴更符合卡通形象。
- 裝飾完整:項圈、鈴鐺、金幣、紅色卷軸都已正確放置。
- 整體比例協調:身體、頭部和手臂的位置調整后更加真實。
- 細節(jié)更加精細:如耳朵的內外填充色、肚子上的福字等。

5. 運行效果
運行代碼后,你將看到一只生動的卡通招財貓!這只貓手持金幣和紅色卷軸,搭配經典的笑眼與鈴鐺,非常適合用于海報設計、賀卡或編程練習。
6. 總結與學習心得
通過這篇教程,你不僅學會了如何用 Python 繪制一只完整的卡通招財貓,還熟悉了 matplotlib.patches 模塊的強大之處。試想一下,未來你可以用類似的方法繪制其他卡通形象,甚至設計屬于自己的吉祥物!
以上就是使用Python繪制可愛的招財貓的詳細內容,更多關于Python繪制招財貓的資料請關注腳本之家其它相關文章!

