用 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/34.html

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

相关文章

Java多线程

一、线程的简介: 1.普通方法调用和多线程: 2.程序、进程和线程: 在操作系统中运行的程序就是进程,一个进程可以有多个线程 程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念; 进程则是执行程序的一次执…

IP 地址与蜜罐技术

基于IP的地址的蜜罐技术是一种主动防御策略,它能够通过在网络上布置的一些看似正常没问题的IP地址来吸引恶意者的注意,将恶意者引导到预先布置好的伪装的目标之中。 如何实现蜜罐技术 当恶意攻击者在网络中四处扫描,寻找可入侵的目标时&…

鸿蒙面试 2025-01-09

鸿蒙分布式理念?(个人认为理解就好) 鸿蒙操作系统的分布式理念主要体现在其独特的“流转”能力和相关的分布式操作上。在鸿蒙系统中,“流转”是指涉多端的分布式操作,它打破了设备之间的界限,实现了多设备…

GDPU Android移动应用 重点习题集

目录 程序填空 ppt摘选 题目摘选 “就这两页ppt,你还背不了吗” “。。。” 打开ppt后 “Sorry咯,还真背不了😜” 更新日志 考后的更新日志 没想到重点勾了一堆,还愣是没考到其中的内容,翻了一下,原…

Unity3d 基于Barracuda推理库和YOLO算法实现对象检测功能

前言 近年来,随着AI技术的发展,在游戏引擎中实现和运行机器学习模型的需求也逐渐显现。Unity3d引擎官方推出深度学习推理框架–Barracuda ,旨在帮助开发者在Unity3d中轻松地实现和运行机器学习模型,它的主要功能是支持在 Unity 中…

【Notepad++】Notepad++如何删除包含某个字符串所在的行

Notepad如何删除包含某个字符串所在的行 一,简介二,操作方法三,总结 一,简介 在使用beyoundcompare软件进行对比的时候,常常会出现一些无关紧要的地方,且所在行的内容是变化的,不方便进行比较&…

机器学习笔记合集

大家好,这里是好评笔记,公主 号:Goodnote。本笔记的任务是解读机器学习实践/面试过程中可能会用到的知识点,内容通俗易懂,入门、实习和校招轻松搞定。 笔记介绍 本笔记的任务是解读机器学习实践/面试过程中可能会用到…

OCR文字识别—基于PP-OCR模型实现ONNX C++推理部署

概述 PaddleOCR 是一款基于 PaddlePaddle 深度学习平台的开源 OCR 工具。PP-OCR是PaddleOCR自研的实用的超轻量OCR系统。它是一个两阶段的OCR系统,其中文本检测算法选用DB,文本识别算法选用CRNN,并在检测和识别模块之间添加文本方向分类器&a…

湘潭大学人机交互复习

老师没给题型也没划重点,随便看看复习了 什么是人机交互 人机交互(Human-Computer Interaction,HCI)是关于设计、评价和实现供人们使用的交互式计算机系统,并围绕相关的主要现象进行研究的学科。 人机交互研究内容 …

离线录制激光雷达数据进行建图

目前有一个2D激光雷达,自己控制小车运行一段时间,离线获取到激光雷达数据后运行如下代码进行离线建图。 roslaunch cartographer_ros demo_revo_lds.launch bag_filename:/home/firefly/AutoCar/data/rplidar_s2/2025-01-08-02-08-33.bag实际效果如下 d…

通信与网络安全管理之ISO七层模型与TCP/IP模型

一.ISO参考模型 OSI七层模型一般指开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架。 它从低到高分别是…

Linux权限

目录 一.Linux权限的概念 二.Linux权限管理 1.文件访问者的分类 2.文件类型和访问权限 1.文件类型 2.基本权限 3.文件权限的表示方法 1.字符表示法 2.八进制表示法 4.文件权限的相关访问方法 1.chmod 2.chown 3.chgrp 4.粘滞位 三.权限总结 一.Linux权限的概念 …

UML系列之Rational Rose笔记三:活动图(泳道图)

一、新建活动图(泳道图) 依旧在用例视图里面,新建一个activity diagram;新建好之后,就可以绘制活动图了: 正常每个活动需要一个开始,点击黑点,然后在图中某个位置安放,接…

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…

基于mybatis-plus历史背景下的多租户平台改造

前言 别误会&#xff0c;本篇【并不是】 要用mybatis-plus自身的多租户方案&#xff1a;在表中加一个tenant_id字段来区分不同的租户数据。并不是的&#xff01; 而是在假设业务系统已经使用mybatis-plus多数据源的前提下&#xff0c;如何实现业务数据库隔开的多租户系统。 这…

大数据技术实训:Hadoop完全分布式运行模式配置

准备&#xff1a; 1&#xff09;准备3台客户机&#xff08;关闭防火墙、静态ip、主机名称&#xff09; 2&#xff09;安装JDK 3&#xff09;配置环境变量 4&#xff09;安装Hadoop 5&#xff09;配置环境变量 6&#xff09;配置集群 7&#xff09;单点启动 8&#xff09;配置ss…

计算机网络(五)运输层

5.1、运输层概述 概念 进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时…

可视化-Visualization

可视化-Visualization 1.Introduction Visualization in Open CASCADE Technology is based on the separation of: on the one hand – the data which stores the geometry and topology of the entities you want to display and select, andon the other hand – its pr…

FPGA自学之路:到底有多崎岖?

FPGA&#xff0c;即现场可编程门阵列&#xff0c;被誉为硬件世界的“瑞士军刀”&#xff0c;其灵活性和可编程性让无数开发者为之倾倒。但谈及FPGA的学习难度&#xff0c;不少人望而却步。那么&#xff0c;FPGA自学之路到底有多崎岖呢&#xff1f; 几座大山那么高&#xff1f;…

关于扫描模型 拓扑 和 传递贴图工作流笔记

关于MAYA拓扑和传递贴图的操作笔记 一、拓扑低模: 1、拓扑工作区位置: 1、准备出 目标 高模。 (高模的状态如上 ↑ )。 2、打开顶点吸附,和建模工具区,选择四边形绘制. 2、拓扑快捷键使…