Python使用Matplotlib和NumPy绘制蛇年春节祝福图实例解析

AI技术控 2025-01-14 10:43:26编程技术
142

随着农历新年的临近,人们开始准备各种庆祝活动和装饰。在这篇博客文章中,我们将探讨如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图。这幅图结合了数字、蛇形、花朵、文字以及一些背景装饰,整体风格生动活泼,传达出吉祥的祝福。本文将分步骤介绍如何实现这幅作品。

1. 绘图的基本概念

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

matplotlib.patches 模块:

  • 提供了绘制基本几何图形的功能,例如圆形、椭圆形、多边形等。

  • 通过 Circle、Ellipse、Polygon 等来构建复杂的卡通形象。

matplotlib.pyplot 模块:

  • 提供了绘图区域(Figure)和坐标轴(Axes)。

  • 帮助我们将图形添加到画布上,并进行整体调整。

2. 准备工作

首先,你需要安装Matplotlib库。如果还没有安装,可以通过以下命令进行安装:

pip install matplotlib

我们还需要用到NumPy库来生成平滑的蛇形曲线。它可以帮助我们更好地控制蛇的身体形态。

pip install numpy

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 绘制数字“2025”

这幅艺术图的中心元素是数字“2025”,代表着未来的年份。我们使用FancyBboxPatch来绘制这些数字,利用边框和圆角使其看起来更有趣。每个数字被放置在不同的位置,确保它们之间有足够的间隔。代码如下:

# 绘制数字块
def draw_number_block(x, y, number, color="red", edge_color="black"):
    block = FancyBboxPatch((x, y), 3, 5, boxstyle="round,pad=0.2", color=color, edgecolor=edge_color, linewidth=2)
    ax.add_patch(block)
    ax.text(x + 1.5, y + 2.5, number, color="black", fontsize=30, ha="center", va="center", fontweight="bold")
 
# 绘制数字“2025”
draw_number_block(-9, -6, "2")
draw_number_block(-5, -6, "0")
draw_number_block(-1, -6, "2")
draw_number_block(3, -6, "5")

通过FancyBboxPatch,我们为数字设置了圆角矩形的背景,并用ax.text方法在每个矩形中心绘制数字,使用黑色字体来增加对比度。

3.3 绘制蛇形图案

接下来,我们绘制蛇的身体,利用平滑的样条曲线模拟蛇的形状。使用np.sin和np.cos函数生成蛇的轨迹,并通过指数衰减让蛇身逐渐变小,增加层次感。

# 绘制小蛇身体(用平滑的样条曲线模拟)
t = np.linspace(0, 2 * np.pi, 500)
x_snake = 5 * np.sin(t) * np.exp(-0.05 * t)  # 小蛇身体的横向分布
y_snake = 3 * np.cos(t) * np.exp(-0.05 * t) + 3  # 小蛇身体的纵向分布
ax.plot(x_snake, y_snake, color="yellow", linewidth=12, zorder=2)  # 黄色曲线表示蛇的身体

蛇的身体用黄色线条表示,通过ax.plot绘制曲线。蛇的头部在蛇形曲线的起点上,我们通过一个圆形表示蛇头,并为蛇头添加一些装饰。

3.4 蛇头装饰与表情

为了让蛇看起来更加生动,我们为蛇头添加了眼睛、腮红、花朵、嘴巴和舌头等细节。眼睛是两个小黑圆形,而腮红则是两个淡粉色的圆形,增加了可爱的感觉。嘴巴用一个“v”字形表示,而舌头则是通过多边形来完成的。

# 蛇头装饰
head_x, head_y = x_snake[0], y_snake[0]
head = Circle((head_x, head_y), radius=1.5, color="yellow", ec="black", lw=2, zorder=3)
ax.add_patch(head)
 
# 眼睛
ax.add_patch(Circle((head_x - 0.5, head_y + 0.5), radius=0.2, color="black", zorder=4))  # 左眼
ax.add_patch(Circle((head_x + 0.5, head_y + 0.5), radius=0.2, color="black", zorder=4))  # 右眼

除此之外,我们还为蛇的头部添加了几朵粉色的小花,通过绘制多个小圆形来实现。

3.5 背景装饰与文字

为了增强艺术效果,我们在图的背景加入了星星和花瓣装饰。我们使用draw_star函数绘制了几颗星星,分布在画布的不同位置。

# 背景装饰(星星和花瓣)
def draw_star(x, y, size=0.5, color="gold"):
    for angle in range(0, 360, 144):
        star_x = x + size * np.cos(np.radians(angle))
        star_y = y + size * np.sin(np.radians(angle))
        ax.plot([x, star_x], [y, star_y], color=color, lw=2)
 
draw_star(2, 5, size=1)
draw_star(-6, 3, size=1)
draw_star(6, 0, size=1)

此外,我们还在左右两侧添加了“蛇年有福”和“平安喜乐”两段文字,利用ax.text函数为文字加上背景框,增强可读性。

# 绘制左边的文字 "蛇年有福"
x_text_left, y_text_left = -7, 6  # 左侧文字位置
for i, char in enumerate("蛇年有福"):
    ax.text(x_text_left, y_text_left - i * 2, char, fontsize=25, color="yellow", ha="center", va="center",
            fontweight="bold", bbox=dict(boxstyle="round", facecolor="red", edgecolor="black", pad=0.5),
            fontname="SimHei")  # 指定字体为SimHei(黑体)

文字的颜色为黄色,背景色是红色,字体使用了“SimHei”(黑体),并为文字添加了圆角矩形背景框,增强视觉效果。

3.6 展示最终图像

通过plt.show()方法,我们展示了最终绘制的艺术图。这幅图不仅仅是一个简单的图形,它结合了数字、蛇形、花朵和装饰文字,传达出祝福与喜庆的氛围。

# 显示图像
plt.show()

4. 完整代码

将所有部分整合在一起:

import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse, Circle, Polygon, FancyBboxPatch
import numpy as np
 
def draw_snake_art_optimized_v4():
    # 设置画布
    fig, ax = plt.subplots(figsize=(12, 10))
    ax.set_xlim(-10, 10)
    ax.set_ylim(-10, 10)
    ax.axis('off')
    ax.set_facecolor('white')  # 背景色
 
    # 绘制“2025”数字块
    def draw_number_block(x, y, number, color="red", edge_color="black"):
        block = FancyBboxPatch((x, y), 3, 5, boxstyle="round,pad=0.2", color=color, edgecolor=edge_color, linewidth=2)
        ax.add_patch(block)
        ax.text(x + 1.5, y + 2.5, number, color="black", fontsize=30, ha="center", va="center", fontweight="bold")
 
    # 绘制数字
    draw_number_block(-9, -6, "2")
    draw_number_block(-5, -6, "0")
    draw_number_block(-1, -6, "2")
    draw_number_block(3, -6, "5")
 
    # 绘制小蛇身体(用平滑的样条曲线模拟)
    t = np.linspace(0, 2 * np.pi, 500)
    x_snake = 5 * np.sin(t) * np.exp(-0.05 * t)  # 小蛇身体的横向分布
    y_snake = 3 * np.cos(t) * np.exp(-0.05 * t) + 3  # 小蛇身体的纵向分布
    ax.plot(x_snake, y_snake, color="yellow", linewidth=12, zorder=2)  # 黄色曲线表示蛇的身体
 
    # 蛇头
    head_x, head_y = x_snake[0], y_snake[0]
    head = Circle((head_x, head_y), radius=1.5, color="yellow", ec="black", lw=2, zorder=3)
    ax.add_patch(head)
 
    # 蛇头装饰(花朵)
    def draw_flower(x, y, size=0.3, color="pink"):
        for angle in range(0, 360, 72):
            petal_x = x + size * np.cos(np.radians(angle))
            petal_y = y + size * np.sin(np.radians(angle))
            petal = Circle((petal_x, petal_y), radius=size * 0.6, color=color, ec="black", lw=1)
            ax.add_patch(petal)
        center = Circle((x, y), radius=size * 0.5, color="red", zorder=4)
        ax.add_patch(center)
 
    draw_flower(head_x + 0.5, head_y + 1)
    draw_flower(head_x - 0.8, head_y + 0.8)
    draw_flower(head_x, head_y - 1.5)
 
    # 蛇的表情细节
    # 眼睛
    ax.add_patch(Circle((head_x - 0.5, head_y + 0.5), radius=0.2, color="black", zorder=4))  # 左眼
    ax.add_patch(Circle((head_x + 0.5, head_y + 0.5), radius=0.2, color="black", zorder=4))  # 右眼
    ax.add_patch(Circle((head_x - 0.5, head_y + 0.5), radius=0.1, color="white", zorder=5))  # 左眼高光
    ax.add_patch(Circle((head_x + 0.5, head_y + 0.5), radius=0.1, color="white", zorder=5))  # 右眼高光
 
    # 腮红
    ax.add_patch(Circle((head_x - 1, head_y - 0.5), radius=0.3, color="pink", alpha=0.7, zorder=3))  # 左腮红
    ax.add_patch(Circle((head_x + 1, head_y - 0.5), radius=0.3, color="pink", alpha=0.7, zorder=3))  # 右腮红
 
    # 嘴巴和舌头
    ax.text(head_x, head_y - 0.7, "v", fontsize=30, color="black", ha="center", zorder=4)  # 嘴巴
    tongue = Polygon([[head_x, head_y - 1.3], [head_x + 0.3, head_y - 1.8], [head_x - 0.3, head_y - 1.8]],
                     closed=True, color="red", zorder=4)
    ax.add_patch(tongue)
 
    # 背景装饰(星星和花瓣)
    def draw_star(x, y, size=0.5, color="gold"):
        for angle in range(0, 360, 144):
            star_x = x + size * np.cos(np.radians(angle))
            star_y = y + size * np.sin(np.radians(angle))
            ax.plot([x, star_x], [y, star_y], color=color, lw=2)
 
    draw_star(2, 5, size=1)
    draw_star(-6, 3, size=1)
    draw_star(6, 0, size=1)
 
    # 绘制左边的文字 "蛇年有福"
    x_text_left, y_text_left = -7, 6  # 左侧文字位置
    for i, char in enumerate("蛇年有福"):
        ax.text(x_text_left, y_text_left - i * 2, char, fontsize=25, color="yellow", ha="center", va="center",
                fontweight="bold", bbox=dict(boxstyle="round", facecolor="red", edgecolor="black", pad=0.5),
                fontname="SimHei")  # 指定字体为SimHei(黑体)
 
    # 绘制右边的文字 "平安喜乐"
    x_text_right, y_text_right = 7, 6  # 右侧文字位置
    for i, char in enumerate("平安喜乐"):
        ax.text(x_text_right, y_text_right - i * 2, char, fontsize=25, color="yellow", ha="center", va="center",
                fontweight="bold", bbox=dict(boxstyle="round", facecolor="red", edgecolor="black", pad=0.5),
                fontname="SimHei")  # 指定字体为SimHei(黑体)
 
    # 显示图像
    plt.show()
 
# 调用绘制函数
draw_snake_art_optimized_v4()

最终效果

运行本文的代码后,我们将获得如下所示的可爱蛇年祝福图片:

Python使用Matplotlib和NumPy绘制蛇年春节祝福图实例解析

总结

本文通过详细的代码示例,展示了如何使用Python的Matplotlib和NumPy库绘制一个蛇年春节祝福图。我们首先介绍了如何绘制红色的数字块,然后通过参数方程生成蛇的身体曲线,并在蛇头周围添加了眼睛、舌头、花朵和星星等装饰元素。最后,我们在画布两侧添加了“蛇年有福”和“平安喜乐”的文字,使整个图案更加生动和富有节日氛围。通过这个实例,读者不仅能够学习到Matplotlib和NumPy的基本用法,还能激发对编程艺术创作的兴趣,为新的一年带来更多的创意和乐趣。

Python 春节
THE END
蜜芽
故事不长,也不难讲,四字概括,毫无意义。

相关推荐

Python中axis=0与axis=1的方向差异详解
Python在处理数据时,经常需要对数组或矩阵进行各种操作,如求和、求平均值等。这些操作通常涉及到 axis 参数的使用。axis=0 和 axis=1 是两个常见的参数值,它们分别表示沿着...
2025-01-17 编程技术
119

使用PIL在Python中创建图片裁剪工具的实现步骤
Python作为一种强大且易于学习的编程语言,提供了丰富的库来支持图像处理任务。其中,PIL(Python Imaging Library)是最受欢迎的库之一。本文将详细介绍如何使用PIL在Python中...
2025-01-14 编程技术
133

Python Requests库全面解析及实战用法详解
无论是获取网页内容、与API进行交互,还是实现数据爬取,都需要一个强大且易用的HTTP库。Python的Requests库正是这样一款工具,它以其简洁的API和强大的功能赢得了广大开发者...
2025-01-11 编程技术
151

Python中dropna()函数的作用及示例说明
在 Python 中,Pandas 库提供了一个非常方便的函数——dropna(),用于删除包含缺失值的行或列。本文将详细介绍 dropna() 函数的作用,并通过具体的示例说明如何使用该函数来处...
2025-01-10 编程技术
139

Python开发之plt.subplot()参数使用方法详解
在Python的Matplotlib库中,plt.subplot()是一个非常有用的函数,它允许用户在一个图形窗口中创建多个子图。这对于数据可视化、对比分析以及复杂图表的制作都极为便利。本文Z...
2025-01-08 编程技术
148

解决Python报错IndexError: list index out of range的三种方法详解
在Python编程过程中,IndexError: list index out of range是一个常见的错误。它通常发生在尝试访问列表中不存在的索引时。对于初学者来说,这个错误可能会让人感到困惑和沮丧...
2025-01-07 编程技术
136