使用Python繪制可愛的招財(cái)貓
本篇博客不僅適合對 Python 繪圖感興趣的開發(fā)者,還能幫助你了解如何利用 matplotlib
繪制復(fù)雜的卡通形象。不需要額外圖片資源,一切都用代碼實(shí)現(xiàn)!
1. 為什么選擇用 Python 繪制?
繪制卡通形象通常需要設(shè)計(jì)工具(例如 Photoshop 或 Illustrator),但通過 Python,我們可以:
- 全面掌控每一部分的比例和顏色:所有幾何形狀均由代碼生成,你可以精確調(diào)整它們的位置、大小和顏色。
- 程序化生成和復(fù)用:繪制的招財(cái)貓代碼可以用作模板,方便生成不同樣式和設(shè)計(jì)的圖案。
- 學(xué)習(xí)數(shù)學(xué)和編程技巧:繪制圖形涉及幾何學(xué)、坐標(biāo)系統(tǒng)和編程邏輯。
如果你是一個數(shù)據(jù)分析師或開發(fā)者,這個過程會讓你對 matplotlib 的藝術(shù)應(yīng)用有更深的體會!
2. 繪圖的基本概念
在 Python 中,我們將使用以下方法和模塊完成繪制任務(wù):
matplotlib.patches
模塊:- 提供了繪制基本幾何圖形的功能,例如圓形、橢圓形、多邊形等。
- 通過
Circle
、Ellipse
、Polygon
等來構(gòu)建復(fù)雜的卡通形象。
matplotlib.pyplot
模塊:- 提供了繪圖區(qū)域(Figure)和坐標(biāo)軸(Axes)。
- 幫助我們將圖形添加到畫布上,并進(jìn)行整體調(diào)整。
要繪制一只完整的招財(cái)貓,我們需要將各個部分分解為基礎(chǔ)幾何形狀,如下所示:
部件 | 幾何形狀 | 示例 |
---|---|---|
頭部和身體 | 圓形、橢圓 | Circle , Ellipse |
耳朵 | 三角形 | Polygon |
五官(眼、鼻、嘴) | 弧線和圓形 | Arc , Circle |
胡須 | 直線 | plot |
手和腳 | 橢圓形 | Ellipse |
裝飾物(鈴鐺、卷軸等) | 圓形、長方形 | Circle , FancyBboxPatch |
3. 實(shí)現(xiàn)代碼解析
以下是完整代碼,按模塊逐步解析。
3.1 設(shè)置繪圖畫布
我們首先創(chuàng)建繪圖畫布,并設(shè)置招財(cái)貓的坐標(biāo)系范圍。注意:需要關(guān)閉坐標(biāo)軸,以便突出卡通形象。
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') # 隱藏坐標(biāo)軸
3.2 繪制頭部和身體
招財(cái)貓的頭部和身體由一個大圓和一個橢圓組成。
# 繪制身體 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 繪制耳朵和內(nèi)部細(xì)節(jié)
耳朵由兩個三角形構(gòu)成,分別是外部的白色耳朵和內(nèi)部的紅色部分。
# 外部耳朵 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) # 內(nèi)部耳朵 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 繪制五官
招財(cái)貓的五官以弧線和圓形為主,營造出微笑的效果。
# 笑眼 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 繪制裝飾物和肚子文字
- 項(xiàng)圈和鈴鐺:
# 項(xiàng)圈 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, "招財(cái)\n進(jì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) # 耳朵內(nèi)部 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) # 繪制紅色項(xiàng)圈 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, "招財(cái)\n進(jì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()
最終效果
運(yùn)行本文的代碼后,我們將獲得如下所示的可愛卡通招財(cái)貓:
從運(yùn)行結(jié)果來看,當(dāng)前繪圖效果和預(yù)期的細(xì)節(jié)相去甚遠(yuǎn),需要進(jìn)一步優(yōu)化來更好優(yōu)化招財(cái)貓形象。以下是對代碼的優(yōu)化建議和改進(jìn)版代碼:
優(yōu)化建議
- 頭部和身體比例:目前身體和頭部的比例以及位置沒有調(diào)整好,應(yīng)該讓頭部顯得更大,同時調(diào)整身體位置。
- 耳朵和五官細(xì)節(jié):耳朵形狀可以更接近原圖的尖銳感,眼睛需要弧形的笑眼,鼻子和嘴巴也需要更加擬合。
- 裝飾物和手臂:紅色項(xiàng)圈、鈴鐺以及手臂的位置要更準(zhǔn)確,尤其是左手抱著的金幣和右手的卷軸。
- 肚子上的福字:調(diào)整字體大小和位置,使其更貼合身體。
- 整體布局:對位置和比例重新調(diào)整,讓招財(cái)貓整體更加協(xié)調(diào)。
改進(jìn)后的代碼
以下是優(yōu)化版的代碼,包含上述改進(jìn):
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) # 耳朵內(nèi)部 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) # 繪制紅色項(xiàng)圈 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, "招財(cái)\n進(jì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()
改進(jìn)后的效果
運(yùn)行優(yōu)化后的代碼,你會發(fā)現(xiàn):
- 五官更生動:笑眼、鼻子和嘴巴更符合卡通形象。
- 裝飾完整:項(xiàng)圈、鈴鐺、金幣、紅色卷軸都已正確放置。
- 整體比例協(xié)調(diào):身體、頭部和手臂的位置調(diào)整后更加真實(shí)。
- 細(xì)節(jié)更加精細(xì):如耳朵的內(nèi)外填充色、肚子上的福字等。
5. 運(yùn)行效果
運(yùn)行代碼后,你將看到一只生動的卡通招財(cái)貓!這只貓手持金幣和紅色卷軸,搭配經(jīng)典的笑眼與鈴鐺,非常適合用于海報(bào)設(shè)計(jì)、賀卡或編程練習(xí)。
6. 總結(jié)與學(xué)習(xí)心得
通過這篇教程,你不僅學(xué)會了如何用 Python 繪制一只完整的卡通招財(cái)貓,還熟悉了 matplotlib.patches
模塊的強(qiáng)大之處。試想一下,未來你可以用類似的方法繪制其他卡通形象,甚至設(shè)計(jì)屬于自己的吉祥物!
以上就是使用Python繪制可愛的招財(cái)貓的詳細(xì)內(nèi)容,更多關(guān)于Python繪制招財(cái)貓的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python描述數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之哈夫曼樹篇
這篇文章主要給大家介紹了關(guān)于Python描述數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之哈夫曼樹篇的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Python開啟線程,在函數(shù)中開線程的實(shí)例
今天小編就為大家分享一篇Python開啟線程,在函數(shù)中開線程的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02Python定義一個跨越多行的字符串的多種方法小結(jié)
今天小編就為大家分享一篇Python定義一個跨越多行的字符串的多種方法小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07詳解Python垃圾回收機(jī)制和常量池的驗(yàn)證
這篇文章主要介紹了詳解Python垃圾回收機(jī)制和常量池的驗(yàn)證,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03Python面向?qū)ο蠖鄳B(tài)實(shí)現(xiàn)原理及代碼實(shí)例
這篇文章主要介紹了Python面向?qū)ο蠖鄳B(tài)實(shí)現(xiàn)原理及代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09