使用Python绘制可爱的招财猫

2025-01-09 16:50

本文主要是介绍使用Python绘制可爱的招财猫,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一...

本篇博客不仅适合对 Python 绘图感兴趣的开发者,还能帮助你了解如何利用 matplotlib 绘制复杂的卡通形象。不需要额外图片资源,一切都用代码实现!

使用Python绘制可爱的招财猫

1. 为什么选择用 Python 绘制?

绘制卡通形象通常需要设计工具(例如 Photoshop 或 Illustrator),但通过 Python,我们可以:

  • 全面掌控每一部分的比例和颜色:所有几何形状均由代码生成,你可以精确调整它们的位置、大小和颜色。
  • 程序化生成和复用:绘制的招财猫代码可以用作模板,方便生成不同样式和设计的图案。
  • 学习数学和编程技巧:绘制图形涉及几何学、坐标系统和编程逻辑。

如果你是一个数据分析师或开发者,这个过程会让你对 matplotlib 的艺术应用有更深的体会!

2. 绘图的基本概念

在 Python 中,我们将使用以下方法和模块完成绘制任务:

  • matplotlib.patches 模块
    • 提供了绘制基本几何图形的功能,例如圆形、椭圆形、多边形等。
    • 通过 CircleEllipsePolygon 等来构建复杂的卡通形象。
  • matplotlib.pyplot 模块
    • 提供了绘图区域(Figure)和坐标轴(Axes)。
    • 帮助我们将图形添加到画布上,并进行整体调整。

要绘制一只完整android的招财猫,我们需要将各个部分分解为基础几何形状,如下所示:

部件几何形状示例
头部和身体圆形、椭圆CircleEllipse
耳朵三角形Polygon
五官(眼、鼻、嘴)弧线和圆形ArcCircle
胡须直线plot
手和脚椭圆形Ellipse
装饰物(铃铛、卷轴等)圆形、长方形CircleFancyBboxPatch

3. 实现代码解析

以下是完整代码,按模块逐步解析。

3.1 设置绘图画布

我们首先创建绘图画布,并设置招财猫的坐标系范围。注意:需要关闭坐标轴,以便突出卡通形象。

import matplotlib.pyplot as plt
from matplotlib.patches import Circle, Ellipse, Polygon, FancyBboxPatch, Arc
 
# 创建画布
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 绘制耳朵和内部细节

耳朵由两个三角形构成,分别是外部的白色耳朵和内部的红色部分。

# 外部耳朵
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=android'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 js= 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()

最终效果

运行本文的代码后,我们将获得如下所示的可爱卡通招财猫:

使用Python绘制可爱的招财猫

从运行结果来看,当前绘图效果和预期的细节相去甚远,需要进一步优化来更好优化招财猫形象。以下是对代码的优化建议和改进版代码:

优化建议

  1. 头部和身体比例:目前身体和头部的比例以及位置没有调整好,应该让头部显得更大,同时调整身体位置。
  2. 耳朵和五官细节:耳朵形状可以更接近原图的尖锐感,眼睛需要弧形的笑眼,鼻子和嘴巴也需要更加拟合。
  3. 装饰物和手臂:红色项圈、铃铛以及手臂的位置要更准确,尤其是左手抱着的金币和右手的卷轴。
  4. 肚子上的福字:调整字体大小和位置,使其更贴合身体。
  5. 整体布局:对位置和比例重新调整,让招财猫整体更加协调。

改进后的代码

以下是优化版的代码,包含上述改进:

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('offjs')
 
    # 绘制身体
    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()

改进后的效果

运行优化后的代码,你会发现:

  • 五官更生动:笑眼、鼻子和嘴巴更符合卡通形象。
  • 装饰完整:项圈、铃铛、金币、红色卷轴都已正确放置。
  • 整体比例协调:身体、头部和手臂的位置调整后更加真实。
  • 细节更加精细:如耳朵的内外填充色、肚子上的福字等。

使用Python绘制可爱的招财猫

5. 运行效果

运行代码后,你将看到一只生动的卡通招财猫!这只猫手持金币和红色卷轴,搭配经典的笑眼与铃铛,非常适合用于海报设计、贺卡或编程练习。

6. 总结与学习心得

通过这篇教程,你不仅学会了如何用 Python 绘制一只完整的卡通招财猫,还熟悉了 matplotlib.patches 模块的强大之处。试想一下,未来你可以用类似的方法绘制其他卡通形象,甚至设计属于自己的吉祥物!

以上就是使用Python绘制可爱的招财猫的详细内容,更多关于Python绘制招财猫的资料请关注China编程(www.chinasem.cn)其它相关文章!

这篇关于使用Python绘制可爱的招财猫的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153001

相关文章

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多