用 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.mzph.cn/bicheng/67690.shtml

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

相关文章

docker常用命令及dockerfile编写

docker常用命令及dockerfile编写 1.docker常用命令1.1镜像相关1.2容器相关1.3数据卷1.4网络模式 2.Dockerfile3.Dockerfile示例 1.docker常用命令 1.1镜像相关 镜像相当于是一个模板,可以实例化出很多个容器; #查看docker版本 docker -v#查看docker默…

2025新年源码免费送

2025很开门很开门的源码免费传递。不需要馒头就能获取4套大开门源码。 听泉偷宝,又进来偷我源码啦👊👊👊。欢迎偷源码 🔥🔥🔥 获取免费源码以及更多源码,可以私信联系我 我们常常…

springboot + vue+elementUI图片上传流程

1.实现背景 前端上传一张图片&#xff0c;存到后端数据库&#xff0c;并将图片回显到页面上。上传组件使用现成的elementUI的el-upload。、 2.前端页面 <el-uploadclass"upload-demo"action"http://xxxx.xxx.xxx:9090/file/upload" :show-file-list&q…

如何用 ESP32-CAM 做一个实时视频流服务器

文章目录 ESP32-CAM 概述ESP32-S 处理器内存Camera 模块MicroSD 卡槽天线板载 LED 和闪光灯其他数据手册和原理图ESP32-CAM 功耗 ESP32-CAM 引脚参考引脚排列GPIO 引脚哪些 GPIO 可以安全使用&#xff1f;GPIO 0 引脚MicroSD 卡引脚 ESP32-CAM 的烧录方式使用 ESP32-CAM-MB 编程…

Virgo:增强慢思考推理能力的多模态大语言模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

使用Supervisor在Ubuntu中实现后台自启动服务

在Ubuntu系统中&#xff0c;Supervisor是一个非常实用的进程管理工具&#xff0c;它可以让你的应用程序在后台运行&#xff0c;并且在系统启动时自动启动这些应用程序。下面&#xff0c;我将详细介绍如何在Ubuntu中使用Supervisor来实现后台自启动服务&#xff0c;并以一个具体…

照片做成图书小程序开发制作介绍

照片做成图书小程序系统&#xff0c;主要是让用户直接通过小程序选择需要做成书的类型和照片排版布局模板&#xff0c;以及上传照片的数量。照片上传完成后&#xff0c;生成模板图片样式进行预览或编辑修改。修改完成全部保存。保存后生成完整的照片书进行预览没问题&#xff0…

docker推送本地仓库报错

(base) rootainode3:~# dp 192.168.2.186:5000/bert-deepspeed:latest The push refers to repository [192.168.2.186:5000/bert-deepspeed] Get "http://192.168.2.186:5000/v2/": dial tcp 192.168.2.186:5000: connect: connection refused排查思路如下&#xff…

《Spring Framework实战》10:4.1.4.2.详细的依赖和配置

欢迎观看《Spring Framework实战》视频教程 集合 <list/>、<set/>、<map/>和<props/>元素分别设置Java集合类型list、set、map和properties的属性和参数。以下示例显示了如何使用它们&#xff1a; <bean id"moreComplexObject" class&qu…

花生好坏缺陷识别数据集,7262张图片,支持yolo,coco json,pasical voc xml格式的标注,识别准确率在95.7%

花生好坏缺陷识别数据集,7262张图片&#xff0c;支持yolo&#xff0c;coco json&#xff0c;pasical voc xml格式的标注&#xff0c;识别准确率在95.7% 数据集分割 训练组87&#xff05; 6353图片 有效集8% 606图片 测试集4% 303图片 预处理 自动定…

实时数仓:基于数据湖的实时数仓与数据治理架构

设计一个基于数据湖的实时数仓与数据治理架构&#xff0c;需要围绕以下几个核心方面展开&#xff1a;实时数据处理、数据存储与管理、数据质量治理、数据权限管理以及数据消费。以下是一个参考架构方案&#xff1a; 一、架构整体概览 核心组成部分 数据源层 数据来源&#xff…

C#中实现线程安全单例模式的多种方法

在C#中实现线程安全的单例模式通常涉及确保类的实例在多线程环境中只被创建一次&#xff0c;并且这个实例在应用程序的生命周期内是唯一的。以下是几种常见的方法来实现线程安全的单例模式&#xff1a; 1. 使用lock关键字 这是最简单和直接的方法之一。通过在创建实例时锁定一…

【HTML+CSS+JS+VUE】web前端教程-1-VScode开发者工具快捷键

VScode打开文件夹与创建文件 1、选择文件夹 2、拖拽文件夹 生成浏览器文件.html的快捷方式 ! 回车vscode常用快捷键列表 代码格式化&#xff1a;shift alt F 向上或向下移动一行&#xff1a; alt up 或者 alt down 快速复制一行代码&#xff1a;shift alt up 或者 sh…

C语言将点分十进制的IP字符串转成4个整数

最近在做lldp的snmp返回值时需要做这样的转换处理&#xff1a;C语言将点分十进制的IP字符串转成4个整数。 这里用两种方式&#xff1a; sscanf格式化处理用 inet_aton函数将ip字符串转成32位的整形&#xff0c;然后再根据bit转成对应的4个整数。 man命令可以确认下sscanf和i…

WebLogic安全基线

WebLogic安全基线 一、 用户权限1 、检查weblogic 的启动用户2 、用户权限整改3 、使用普通用户重启weblogic 二、账户共用1 、检查weblogic 控制台的账户2 、账户共用整改3 、测试登录weblogic 控制台新账户 三、 账户清理1 、检查weblogic 控制台的账户2 、帐户清理整改 四、…

Unity3D Huatuo热更环境安装与示例项目详解

前言 Unity3D作为一款强大的游戏开发引擎&#xff0c;广泛应用于各类游戏和应用程序的开发中。然而&#xff0c;随着游戏版本的迭代和功能的增加&#xff0c;热更新技术变得越来越重要。Huatuo是一款基于Unity3D的IL2CPP解释执行框架&#xff0c;可以实现对游戏代码的热更新&a…

react-quill 富文本组件编写和应用

index.tsx文件 import React, { useRef, useState } from react; import { Modal, Button } from antd; import RichEditor from ./RichEditor;const AnchorTouchHistory: React.FC () > {const editorRef useRef<any>(null);const [isModalVisible, setIsModalVis…

TDv2:一种用于离线数学表达式识别的新型树形结构解码器

TDv2:一种用于离线数学表达式识别的新型树形结构解码器 本文提出了一种针对手写数学表达式识别(HMER)任务的新型树形解码器(TDv2) ,旨在充分利用数学表达式的树结构标签进行更有效的建模和预测。相较于传统的LaTeX字符串解码器,该模型通过采用一个节点分类模块和一个分…

银行信贷管理系统flask

完整源码项目包获取→点击文章末尾名片&#xff01;

WordPress静态缓存插件WP Super Cache与 WP Fastest Cache

引言 WordPress是一款开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;最初作为博客平台开发&#xff0c;现已发展成为一个功能强大的建站工具&#xff0c;支持创建各种类型的网站&#xff0c;包括企业网站、在线商店、个人博客等。它具有用户友好的界面、丰富的插…