首页 分享 用Python的Matplotlib和NumPy画3D玫瑰花,代码逐行解析(附完整可运行源码)

用Python的Matplotlib和NumPy画3D玫瑰花,代码逐行解析(附完整可运行源码)

来源:花匠小妙招 时间:2026-04-23 02:05

用Python的Matplotlib和NumPy画3D玫瑰花:从数学原理到视觉呈现

在 数据可视化 的世界里,3D图形总能带来更直观的冲击力。今天,我们将一起探索如何用Python的Matplotlib和NumPy库,通过数学公式构建一朵精致的3D玫瑰花。这不仅仅是一个代码实现,更是一次数学之美与编程艺术的完美结合。

1. 环境准备与基础概念

在开始绘制3D玫瑰花之前,我们需要确保 环境配置 正确。首先安装必要的库:

pip install numpy matplotlib

bash

3D绘图的核心在于理解几个关键概念:

参数方程:用参数表示曲面的数学方法网格生成:创建3D曲面所需的点阵颜色映射:将数值映射到颜色空间的机制

Matplotlib的3D绘图能力主要来自mpl_toolkits.mplot3d模块,它提供了多种3D绘图函数,包括plot_surface、plot_wireframe等。

提示:在Jupyter Notebook中运行3D绘图代码时,记得添加%matplotlib inline魔术命令以获得更好的显示效果。

2. 数学原理:玫瑰曲线的3D扩展

玫瑰曲线在2D中已经足够美丽,但将其扩展到3D空间需要更复杂的数学表达。我们使用以下核心公式:

参数定义

t:角度参数,控制花瓣的旋转x:径向参数,控制花瓣的形状

关键方程

p = (np.pi / 2) * np.exp(-t / (8 * np.pi))

u = 1 - (1 - np.mod(3.3 * t, 2 * np.pi) / np.pi) ** 4 / 2

y = 2 * (x ** 2 - x) ** 2 * np.sin(p)

python

运行

这些方程共同决定了玫瑰花的形状:

变量作用数学意义p控制花瓣起伏指数衰减函数u决定花瓣宽度周期调制函数y影响花瓣弯曲度多项式与三角函数的组合

3. 代码逐行解析

让我们深入分析完整的玫瑰花绘制代码:

import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(10, 8))

ax = fig.add_subplot(111, projection='3d')

[x, t] = np.meshgrid(

np.linspace(0, 1, 25),

np.arange(0, 575.5, 0.5) / 575 * 30 * np.pi - 4*np.pi

)

p = (np.pi / 2) * np.exp(-t / (8 * np.pi))

change = np.sin(20*t)/50

u = 1 - (1 - np.mod(3.3 * t, 2 * np.pi) / np.pi) ** 4 / 2 + change

y = 2 * (x ** 2 - x) ** 2 * np.sin(p)

r = u * (x * np.sin(p) + y * np.cos(p)) * 1.5

h = u * (x * np.cos(p) - y * np.sin(p))

surf = ax.plot_surface(

r * np.cos(t),

r * np.sin(t),

h,

rstride=1,

cstride=1,

cmap='magma',

linewidth=0,

antialiased=True

)

plt.tight_layout()

plt.show()

python

运行

关键参数解析:

rstride和cstride:控制曲面网格的密度,值越小曲面越精细cmap:颜色映射方案,可替换为'viridis'、'plasma'等linewidth:设置为0使曲面更平滑

4. 高级定制技巧

掌握了基础绘制方法后,我们可以通过调整参数创造不同风格的玫瑰花:

4.1 颜色变化

Matplotlib提供了丰富的colormap选项:

colormaps = ['viridis', 'plasma', 'inferno', 'magma', 'cividis']

for cmap in colormaps:

surf.set_cmap(cmap)

plt.draw()

plt.pause(1)

python

运行

4.2 花瓣形状调整

通过修改数学公式中的参数,可以创造不同形态的花朵:

花瓣数量:调整角度参数t的系数

t = np.arange(0, 575.5, 0.5) / 575 * 20 * np.pi - 4*np.pi

python

运行

花瓣宽度:修改u函数的系数

u = 1 - (1 - np.mod(2.8 * t, 2 * np.pi) / np.pi) ** 4 / 2

python

运行

4.3 动态旋转展示

添加交互式旋转功能,更好地观察3D效果:

from matplotlib.animation import FuncAnimation

def update(frame):

ax.view_init(elev=20, azim=frame)

return fig,

ani = FuncAnimation(fig, update, frames=np.arange(0, 360, 2), interval=50)

plt.show()

python

运行

5. 性能优化 与常见问题

当绘制更复杂的3D图形时,可能会遇到性能问题。以下是一些优化建议:

网格密度控制

适当增大rstride和cstride值减少np.arange的步长精度

渲染优化

surf = ax.plot_surface(..., antialiased=False, shade=False)

python

运行

常见错误解决

错误现象可能原因解决方案图形不显示未调用plt.show()确保代码最后有plt.show()图形变形坐标比例不一致添加ax.set_box_aspect([1,1,1])颜色异常colormap名称错误检查plt.colormaps()获取有效名称

注意:在Jupyter Notebook中,如果3D图形无法旋转交互,尝试添加%matplotlib notebook魔术命令。

6. 创意扩展应用

掌握了3D玫瑰的基本绘制方法后,我们可以发挥创意,开发更多有趣的应用:

花束组合

def draw_rose(ax, offset_x, offset_y, color):

x_coord = r * np.cos(t) + offset_x

y_coord = r * np.sin(t) + offset_y

surf = ax.plot_surface(x_coord, y_coord, h, cmap=color)

return surf

fig = plt.figure()

ax = fig.add_subplot(111, projection='3d')

draw_rose(ax, 0, 0, 'Reds')

draw_rose(ax, 3, 0, 'Blues')

draw_rose(ax, 1.5, 2.6, 'Greens')

python

运行

季节变化效果

春季:使用'spring' colormap,花瓣较宽冬季:使用'winter' colormap,添加"雪花"点阵

数据映射艺术: 将实际数据映射到花的参数上,如用花瓣高度表示股票价格变化。

data = np.sin(np.linspace(0, 4*np.pi, len(t)))

h = u * (x * np.cos(p) - y * np.sin(p)) * (1 + 0.5 * data.reshape(h.shape))

python

运行

在实际 项目 中,我发现最影响视觉效果的是u函数的参数设置。通过调整np.mod的第一个系数,可以让花瓣看起来更饱满或更纤细。而change变量添加的微小扰动,则让花瓣边缘更自然,避免了过于机械的完美曲线。

相关知识

用Python的Matplotlib和NumPy画3D玫瑰花,代码逐行解析(附完整可运行源码)
Python画玫瑰花完整代码
python运行出玫瑰花的代码
用python画立体玫瑰花
如何用python画玫瑰花
Python多彩的玫瑰花(完整代码)
Python玫瑰花
如何使用python画玫瑰花
【Python表白系列】用代码画玫瑰花,属于程序员的浪漫告白(完整代码)
matplotlib基本操作(一)(附完整代码)

网址: 用Python的Matplotlib和NumPy画3D玫瑰花,代码逐行解析(附完整可运行源码) https://www.huajiangbk.com/newsview2595399.html

所属分类:花卉
上一篇: 仙侠种田文《二人森林》by浴火小
下一篇: 玫瑰复合苹果酱的制作工艺研究

推荐分享