用 Python 绘制可爱的招财猫

  ✨个人主页欢迎您的访问 ✨期待您的三连 ✨

 ✨个人主页欢迎您的访问 ✨期待您的三连 ✨

  ✨个人主页欢迎您的访问 ✨期待您的三连✨

  ​​​​​

​​​​​​​​​

​​​​

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

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

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

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

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

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


2. 绘图的基本概念🧧✨✨🧧

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

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

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

部件几何形状示例
头部和身体圆形、椭圆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='center')

4. 完整代码🧧✨✨🧧

将所有部分整合在一起:

import matplotlib.pyplot as plt
from matplotlib.patches import Circle, Ellipse, Polygon, FancyBboxPatch, Arcdef 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()

最终效果

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

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

优化建议

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

改进后的代码

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

import matplotlib.pyplot as plt
from matplotlib.patches import Circle, Ellipse, Polygon, FancyBboxPatch, Arcdef 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()

改进后的效果

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

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

5. 运行效果🧧✨✨🧧

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


6. 总结与学习心得🧧✨✨🧧

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

“编程是一种艺术,而艺术则是程序中最可爱的部分。” ✨


下一个话题:用 Python 绘制春节对联 🌸?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/504963.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

socket网络编程-TC/IP方式

网络编程 1.概念:两台设备之间通过网络数据传输。 2.网络通信:将数据通过网络从一台设备传输另外一台设备。 3.java.net包下提供了一系列的类和接口,提供程序员使用,完成网络通信。 TCP和UDP TCP协议: 1.使用TCP协…

G1原理—2.G1是如何提升分配对象效率

大纲 1.G1的对象分配原理是怎样的 2.深入分析TLAB机制原理 3.借助TLAB分配对象的实现原理是什么 4.什么是快速分配 什么是慢速分配 5.大对象分配的过程 与TLAB的关系 6.救命的稻草—JVM的最终分配尝试 G1如何分配对象TLAB机制分区协调机制 G1设计了一套TLAB机制快速分…

Wsl报 不存在具有提供的名称的分布

在使用wsl --set-version Ubuntu 2命令升级WSL2时, 不存在具有提供的名称的分布,如下图。 图片 解决的办法也很简单,只需要把该命令的 Ubuntu 改为具体使用的发行版全称即可。此处,使用“wsl -l -v”命令显示安装的Ubuntu 版本。 …

视频编辑最新SOTA!港中文Adobe等发布统一视频生成传播框架——GenProp

文章链接:https://arxiv.org/pdf/2412.19761 项目链接:https://genprop.github.io 亮点直击 定义了一个新的生成视频传播问题,目标是利用 I2V 模型的生成能力,将视频第一帧的各种变化传播到整个视频中。 精心设计了模型 GenProp&…

计算机网络例题

IP地址分类: A类:网络号范围: 1~126 (0000 0001 ~ 0111 1110) B类:网络号范围:128.1 ~ 191.255 (可用范围) C类:网络号段范围:192.0.1 ~ 223.2…

【大数据基础】大数据概述

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈大数据技术原理与应用 ⌋ ⌋ ⌋专栏系统介绍大数据的相关知识,分为大数据基础篇、大数据存储与管理篇、大数据处理与分析篇、大数据应用篇。内容包含大数据概述、大数据处理架构Hadoop、分布式文件系统HDFS、分布式数…

鸿蒙UI(ArkUI-方舟UI框架)

参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/arkts-layout-development-overview-V13 ArkUI简介 ArkUI(方舟UI框架)为应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能&#xff…

【Java项目】基于SpringBoot的【校园交友系统】

【Java项目】基于SpringBoot的【校园交友系统】 技术简介:系统软件架构选择B/S模式、SpringBoot框架、java技术和MySQL数据库等,总体功能模块运用自顶向下的分层思想。 系统简介:系统主要包括管理员和用户。 (a) 管理员的功能主要有首页、个人…

C#中的常用集合

目录 一、动态数组ArrayList 二、List 三、栈(Stack) 四、队列(Queue) 五、字典(Dictionary),int> 一、动态数组ArrayList ArrayList 是 C# 中提供的一种动态数组类,位于命名空间 Syste…

[笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server

随着软件开发节奏的加快,持续集成(CI)和持续部署(CD)已经成为确保软件质量和加速产品发布的不可或缺的部分。Jenkins作为一款广泛使用的开源自动化服务器,为开发者提供了一个强大的平台来实施这些实践。然而…

WEB前端-2

目录 HTML-常见的网页标签-分类2 语义化标签 列表标签 表单标签 form标签 input标签 select标签 textarea标签 html转义符 h5提供的新标签 【例3:豆瓣电影】 【源码】 【例4:登录注册】 【源码】 【例5:QQ注册】 【源码】 H…

Nacos概述与集群实战

什么是Nacos,它有什么作用 Nacos 是一个开源的服务发现和配置管理平台,由阿里巴巴开发,用于构建云原生应用程序。Nacos 的名字源自于 “Naming and Configuration Service”(命名和配置服务)的缩写。它支持服务注册与发现、动态配置服务、动态服务管理等特性,广泛应用于微…

EtherCAT转Modbus网关与TwinCAT3的连接及配置详述

在工业自动化控制系统中,常常需要整合不同的通信协议设备。本案例旨在展示如何利用捷米特JM-ECT-RTU协议转换网关模块,实现 EtherCAT 网络与 Modbus 设备之间的无缝连接,并在 TwinCAT3 环境中进行有效配置,以构建一个稳定可靠的自…

目标检测中的Bounding Box(边界框)介绍:定义以及不同表示方式

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

YARN WebUI 服务

一、WebUI 使用 与HDFS一样,YARN也提供了一个WebUI服务,可以使用YARN Web用户界面监视群集、队列、应用程序、服务、流活动和节点信息。还可以查看集群详细配置的信息,检查各种应用程序和服务的日志。 1.1 首页 浏览器输入http://node2.itc…

Linux标准IOday3

1:思维导图 2 :使用3语言编写一个简易的界面,界面如下 1:标准输出流 2:标准错误流 3:文件流 要求:按1的时候,通过printf输出数据,按2的时候,通过perror输出数据,按3的时候将输入写入文件中&a…

Clickhouse基础(一)

操作命令: sudo clickhouse start sudo clickhouse restart sudo clickhouse status进入clickhouse clickhouse-client -mCREATE TABLE db_13.t_assist (modelId UInt64,taskId UInt64,testNo String,tdId UInt64,eventDay String,eventDaytime UInt64,eventBatch …

Ubuntu网络连接问题(笔记本更换wifi后,虚拟机连不上网络)

1、笔记本更换wifi后,虚拟机的IP地址变了,然后就连不上网络了(主机笔记本连接wifi正常上网) 2、修改子网地址(按照ubutun的ip设置子网掩码) 3、Ubuntu已经显示网络连接正常了,但是就是无法上网&…

Spring 项目 基于 Tomcat容器进行部署

文章目录 一、前置知识二、项目部署1. 将写好的 Spring 项目先打包成 war 包2. 查看项目工件(Artifact)是否存在3. 配置 Tomcat3.1 添加一个本地 Tomcat 容器3.2 将项目部署到 Tomcat 4. 运行项目 尽管市场上许多新项目都已经转向 Spring Boot&#xff0…

VSCode 在Windows下开发时使用Cmake Tools时输出Log乱码以及CPP文件乱码的终极解决方案

在Windows11上使用VSCode开发C程序的时候,由于使用到了Cmake Tools插件,在编译运行的时候,会出现输出日志乱码的情况,那么如何解决呢? 这里提供了解决方案: 当Settings里的Cmake: Output Log Encoding里设…