Matplotlib 3D 绘制小红花原理

目录
  • 1. 极坐标系
  • 2. 极坐标系花瓣
  • 3. 三维花瓣
  • 4. 花瓣微调
  • 5. 结束语

 前言:

在上篇博文中使用了matplotlib绘制了3D小红花,本篇博客主要介绍一下3D小红花的绘制原理。

1. 极坐标系

对于极坐标系中的一点 P ,我们可以用极径 r  和极角 θ 来表示,记为点 P ( r , θ ) ,

使用matplotlib绘制极坐标系:

import matplotlib.pyplot as plt
import numpy as np

if __name__ == '__main__':
    # 极径
    r = np.arange(10)
    # 角度
    theta = 0.5 * np.pi * r

    fig = plt.figure()
    plt.polar(theta, r, c='r', marker='o', ms=3, ls='-', lw=1)
    # plt.savefig('img/polar1.png')
    plt.show()

使用matplotlib绘制极坐标散点图:

import matplotlib.pyplot as plt
import numpy as np

if __name__ == '__main__':
    r = np.linspace(0, 10, num=10)
    theta = 2 * np.pi * r
    area = 3 * r ** 2

    ax = plt.subplot(111, projection='polar')
    ax.scatter(theta, r, c=theta, s=area, cmap='hsv', alpha=0.75)
    # plt.savefig('img/polar2.png')
    plt.show()

有关matplotlib极坐标的参数更多介绍,可参阅官网手册

2. 极坐标系花瓣

绘制r = s i n ( θ ) r=sin(\theta)r=sin(θ) 在极坐标系下的图像:

import matplotlib.pyplot as plt
import numpy as np

if __name__ == '__main__':
    fig = plt.figure()
    ax = plt.subplot(111, projection='polar')
    ax.set_rgrids(radii=np.linspace(-1, 1, num=5), labels='')

    theta = np.linspace(0, 2 * np.pi, num=200)
    r = np.sin(theta)
    ax.plot(theta, r)
    # plt.savefig('img/polar3.png')
    plt.show()

以 2 π 为一个周期,增加图像的旋转周期:

r = np.sin(2 * theta)

继续增加图像的旋转周期:

r = np.sin(3 * theta)
r = np.sin(4 * theta)

然后我们可以通过调整极径系数和角度系数来调整图像:

import matplotlib.pyplot as plt
import numpy as np

if __name__ == '__main__':
    fig = plt.figure()
    ax = plt.subplot(111, projection='polar')
    ax.set_rgrids(radii=np.linspace(-1, 1, num=5), labels='')

    theta = np.linspace(0, 2 * np.pi, num=200)
    r1 = np.sin(4 * (theta + np.pi / 8))
    r2 = 0.5 * np.sin(5 * theta)
    r3 = 2 * np.sin(6 * (theta + np.pi / 12))

    ax.plot(theta, r1)
    ax.plot(theta, r2)
    ax.plot(theta, r3)
    # plt.savefig('img/polar4.png')
    plt.show()

3. 三维花瓣

现在可以将花瓣放置在三维空间上了,根据花瓣的生成规律,其花瓣外边缘线在一条旋转内缩的曲线上,这条曲线的极径 r 随着角度的增大逐渐变小,其高度 h  逐渐变大。

其函数图像如下:

这样定义就满足前面对花瓣外边缘曲线的假设了,即 r 递减, h 递增。

现在将其放在三维空间中:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

if __name__ == '__main__':
    fig = plt.figure()
    ax = Axes3D(fig)
    # plt.axis('off')

    x = np.linspace(0, 1, num=30)
    theta = np.linspace(0, 2 * np.pi, num=1200)
    theta = 30 * theta
    x, theta = np.meshgrid(x, theta)

    # f is a decreasing function of theta
    f = 0.5 * np.pi * np.exp(-theta / 50)

    r = x * np.sin(f)
    h = x * np.cos(f)

    # 极坐标转笛卡尔坐标
    X = r * np.cos(theta)
    Y = r * np.sin(theta)
    ax = ax.plot_surface(X, Y, h,
                         rstride=1, cstride=1, cmap=plt.cm.cool)

    # plt.savefig('img/polar5.png')
    plt.show()

笛卡尔坐标系(Cartesian coordinate system),即直角坐标系。

然而,上述的表达仍然没有得到花瓣的细节,因此我们需要在此基础之上进行处理,以得到花瓣形状。因此设计了一个花瓣函数:

其是一个以 2 π 为周期的周期函数,其值域为[ 0.5 , 1.0 ],图像如下图所示:

再次绘制:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

if __name__ == '__main__':
    fig = plt.figure()
    ax = Axes3D(fig)
    # plt.axis('off')

    x = np.linspace(0, 1, num=30)
    theta = np.linspace(0, 2 * np.pi, num=1200)
    theta = 30 * theta
    x, theta = np.meshgrid(x, theta)

    # f is a decreasing function of theta
    f = 0.5 * np.pi * np.exp(-theta / 50)

    # 通过改变函数周期来改变花瓣的形状
    # 改变值域也可以改变花瓣形状
    # u is a periodic function
    u = 1 - (1 - np.absolute(np.sin(3.3 * theta / 2))) / 2
    r = x * u * np.sin(f)
    h = x * u * np.cos(f)
    
    # 极坐标转笛卡尔坐标
    X = r * np.cos(theta)
    Y = r * np.sin(theta)
    ax = ax.plot_surface(X, Y, h,
                         rstride=1, cstride=1, cmap=plt.cm.RdPu_r)

    # plt.savefig('img/polar6.png')
    plt.show()

4. 花瓣微调

  为了使花瓣更加真实,使花瓣的形态向下凹,因此需要对花瓣的形状进行微调,这里添加一个修正项和一个噪声扰动,修正函数图像为:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

if __name__ == '__main__':
    fig = plt.figure()
    ax = Axes3D(fig)
    # plt.axis('off')

    x = np.linspace(0, 1, num=30)
    theta = np.linspace(0, 2 * np.pi, num=1200)
    theta = 30 * theta
    x, theta = np.meshgrid(x, theta)

    # f is a decreasing function of theta
    f = 0.5 * np.pi * np.exp(-theta / 50)

    noise = np.sin(theta) / 30
    # u is a periodic function
    u = 1 - (1 - np.absolute(np.sin(3.3 * theta / 2))) / 2 + noise

    # y is a correction function
    y = 2 * (x ** 2 - x) ** 2 * np.sin(f)
    r = u * (x * np.sin(f) + y * np.cos(f))
    h = u * (x * np.cos(f) - y * np.sin(f))

    X = r * np.cos(theta)
    Y = r * np.sin(theta)
    ax = ax.plot_surface(X, Y, h,
                         rstride=1, cstride=1, cmap=plt.cm.RdPu_r)

    # plt.savefig('img/polar7.png')
    plt.show()

修正前后图像区别对比如下:

5. 结束语

3D花的绘制主要原理是极坐标,通过正弦/余弦函数进行旋转变形构造,参数略微变化就会出现不同的花朵,有趣!

到此这篇关于Matplotlib 3D 绘制小红花原理的文章就介绍到这了,更多相关Matplotlib 绘制小红花内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python中Matplotlib实现绘制3D图的示例代码

    Matplotlib 也可以绘制 3D 图像,与二维图像不同的是,绘制三维图像主要通过 mplot3d 模块实现.但是,使用 Matplotlib 绘制三维图像实际上是在二维画布上展示,所以一般绘制三维图像时,同样需要载入 pyplot 模块. mplot3d 模块下主要包含 4 个大类,分别是: mpl_toolkits.mplot3d.axes3d() mpl_toolkits.mplot3d.axis3d() mpl_toolkits.mplot3d.art3d() mpl_toolkit

  • python+matplotlib绘制3D条形图实例代码

    本文分享的实例主要实现的是Python+matplotlib绘制一个有阴影和没有阴影的3D条形图,具体如下. 首先看看演示效果: 完整代码如下: import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # setup the figure and axes fig = plt.figure(figsize=(8, 3)) ax1 = fig.add_subplot(121

  • matplotlib 3D模型绘制一朵小红花

    目录 1. 含苞待放 2. 灼灼其华 前言: 在github上看到一个有趣的代码,虽然情人节已经过了两天,但还是想和大家分享^_^ 1. 含苞待放   3D模型的绘制需要网格点,关于网格点的作用,在基于python,Matplotlib绘制函数的等高线与三维图像的博文中已经介绍,这里不再赘述. import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.f

  • python 利用matplotlib在3D空间绘制二次抛物面的案例

    图形预览: 0.import import numpy as np from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D 1.开口向上的抛物面 fig = plt.figure(figsize=(9,6), facecolor='khaki' ) ax = fig.gca(projection='3d') # 二元函数定义域平面集 x = np.linspace(start=-3, stop=3,

  • matplotlib在python上绘制3D散点图实例详解

    大家可以先参考官方演示文档: 效果图: ''' ============== 3D scatterplot ============== Demonstration of a basic scatterplot in 3D. ''' from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np def randrange(n, vmin, vmax): ''' Helper f

  • python 利用matplotlib在3D空间中绘制平面的案例

    图形: 0.import import numpy as np import matplotlib as mpl from matplotlib import cm from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D 1.水平和垂直平面 # 创建画布 fig = plt.figure(figsize=(12, 8), facecolor='lightyellow' ) # 创建 3D 坐标系 a

  • Python利用matplotlib模块数据可视化绘制3D图

    目录 前言 1 matplotlib绘制3D图形 2 绘制3D画面图 2.1 源码 2.2 效果图 3 绘制散点图 3.1 源码 3.2 效果图 4 绘制多边形 4.1 源码 4.2 效果图 5 三个方向有等高线的3D图 5.1 源码 5.2 效果图 6 三维柱状图 6.1 源码 6.2 效果图 7 补充图 7.1 源码 7.2 效果图 总结 前言 matplotlib实际上是一套面向对象的绘图库,它所绘制的图表中的每个绘图元素,例如线条Line2D.文字Text.刻度等在内存中都有一个对象与之

  • Matplotlib 3D 绘制小红花原理

    目录 1. 极坐标系 2. 极坐标系花瓣 3. 三维花瓣 4. 花瓣微调 5. 结束语  前言: 在上篇博文中使用了matplotlib绘制了3D小红花,本篇博客主要介绍一下3D小红花的绘制原理. 1. 极坐标系 对于极坐标系中的一点 P ,我们可以用极径 r  和极角 θ 来表示,记为点 P ( r , θ ) , 使用matplotlib绘制极坐标系: import matplotlib.pyplot as plt import numpy as np if __name__ == '__m

  • 用Python的绘图库(matplotlib)绘制小波能量谱

    时间小波能量谱 反映信号的小波能量沿时间轴的分布. 由于小波变换具有等距效应,所以有: 式中 表示信号强度,对于式①在平移因子b方向上进行加权积分 式中 代表时间-小能量谱 尺度小波能量谱 反映信号的小波能量随尺度的变化情况. 同理,对式①在尺度方向上进行加权积分: 式中 连续小波变换 连续小波变换的结果是一个小波系数矩阵,随着尺度因子和位移因子变化.然后将系数平方后得到小波能量,把每个尺度因子对应的所有小波能量进行叠加,那么就可以得到随尺度因子变换的小波能量谱曲线.把尺度换算成频率后,这条曲线

  • Python+matplotlib实现绘制等高线图示例详解

    目录 前言 1. 等高线图概述 什么是等高线图? 等高线图常用场景 绘制等高线图步骤 案例展示 2. 等高线图属性 设置等高线颜色 设置等高线透明度 设置等高线颜色级别 设置等高线宽度 设置等高线样式 3. 显示轮廓标签 4. 填充颜色 5. 添加颜色条说明 总结 前言 我们在往期对matplotlib.pyplot()方法学习,到现在我们已经会绘制折线图.柱状图.散点等常规的图表啦(往期的内容如下,大家可以方便查看往期内容) Python matplotlib底层原理解析 Python利用 m

  • Python基于matplotlib实现绘制三维图形功能示例

    本文实例讲述了Python基于matplotlib实现绘制三维图形功能.分享给大家供大家参考,具体如下: 代码一: # coding=utf-8 import numpy as np import matplotlib.pyplot as plt import mpl_toolkits.mplot3d x,y = np.mgrid[-2:2:20j,-2:2:20j] #测试数据 z=x*np.exp(-x**2-y**2) #三维图形 ax = plt.subplot(111, project

  • Python使用matplotlib实现绘制自定义图形功能示例

    本文实例讲述了Python使用matplotlib实现绘制自定义图形功能.分享给大家供大家参考,具体如下: 一 代码 from matplotlib.path importPath from matplotlib.patches importPathPatch import matplotlib.pyplot as plt fig, ax = plt.subplots() #定义绘图指令与控制点坐标 #其中MOVETO表示将绘制起点移动到指定坐标 #CURVE4表示使用4个控制点绘制3次贝塞尔曲

  • python之matplotlib学习绘制动态更新图实例代码

    简介 通过定时器Timer触发事件,定时更新绘图,可以形成动态更新图片.下面的实例是学习<matplotlib for python developers>一文的笔记. 实现 实现代码及简单介绍 通过self.user = self.user[1:] + [temp],每次删除列表的第一元素,在其尾部添加新的元素.这样完成user数据的动态更新.其他详细的解释见文中的注释部分. #-*-coding:utf-8-*- import wx from matplotlib.figure impor

  • python 如何在 Matplotlib 中绘制垂直线

    介绍 Matplotlib是Python中使用最广泛的数据可视化库之一.Matplotlib的受欢迎程度大部分来自其自定义选项.您可以调整其对象层次结构中的几乎任何元素. 在本教程中,我们将研究如何在Matplotlib图上绘制垂直线,这使我们能够标记和突出显示图的某些区域,而无需缩放或更改轴范围. 创建图 让我们首先用一些随机数据创建一个简单的图: import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots

  • Matplotlib直方图绘制中的参数bins和rwidth的实现

    目录 情景引入 bins 参数 stacked参数 rwidth 参数 引用 情景引入 我们在做机器学习相关项目时,常常会分析数据集的样本分布,而这就需要用到直方图的绘制. 在Python中可以很容易地调用matplotlib.pyplot的hist函数来绘制直方图.不过,该函数参数不少,有几个绘图的小细节也需要注意. 首先,我们假定现在有个联邦学习的项目情景.我们有一个样本个数为15的图片数据集,样本标签有4个,分别为cat, dog, car, ship.这个数据集已经被不均衡地划分到4个任

随机推荐