首页 > 其他分享 >使用 Manim 绘制自定义函数曲线

使用 Manim 绘制自定义函数曲线

时间:2024-10-16 14:24:50浏览次数:7  
标签:axes 自定义 config 曲线 range axis include 绘制 Manim

用动画来展示函数曲线,是一种非常直观、酷炫的方法。

一、Manim 简介

Manim(Mathematical Animation Engine)是一个用于创建数学动画的 Python 库。它允许您以编程的方式创建复杂的动画,包括函数曲线、几何图形和动画效果。

Manim 由 3Blue1Brown(Grant Sanderson)创建,他在 YouTube 上使用 Manim 制作了许多高质量的数学教育视频。

二、Axes 类概述

Axes 类是 Manim 中用于创建二维坐标轴的对象。它继承自 CoordinateSystem,并提供了丰富的方法来定制坐标轴的外观和功能。

Axes 类的主要功能包括:

  • 创建自定义范围和刻度的坐标轴
  • 绘制函数曲线和参数方程
  • 添加坐标网格和刻度线
  • 在坐标轴上添加标签和注释

三、创建坐标轴

要创建一个坐标轴,首先需要实例化 Axes 类。以下是基本的使用方法

axes = Axes()

效果:

坐标范围和刻度设置

x_range:设置 x 轴的范围和刻度。

格式:x_range=[x_min, x_max, x_step]
例如:x_range=[-5, 5, 1] 表示 x 轴从 -5 到 5,刻度间隔为 1。

y_range:设置 y 轴的范围和刻度。

格式与 x_range 相同。

示例:
axes = Axes(
    x_range=[0, 6, 1],
    y_range=[-4, 4, 1],
)

轴标签和刻度数字

axis_config:用于定制轴的样式,一个字典,设置轴的通用配置。常用的配置项:

  • include_numbers:是否在刻度上显示数字(默认为 False)。
  • numbers_to_include:指定要显示数字的列表。
  • numbers_with_elongated_ticks:指定要加长刻度线的数字列表。

示例:在刻度上显示数字

axes = Axes(
    x_range=[-6, 6, 1],
    y_range=[-4, 4, 1],
    axis_config={"include_numbers": True},
)

更高级的配置

如果需要更精细地控制轴的配置,可以使用 x_axis_configy_axis_config

axes = Axes(
    x_range=[-6, 6, 1],
    y_range=[-4, 4, 1],
    x_axis_config={
        "include_numbers": True,
        "numbers_to_include": [-5, 0, 5],
        "numbers_with_elongated_ticks": [-5, 0, 5],
    },
    y_axis_config={
        "include_numbers": True,
        "numbers_to_include": [-3, 0, 3],
        "numbers_with_elongated_ticks": [-3, 0, 3],
    },
)


其中的配置项:

  • include_numbers:是否在刻度上显示数字(默认为 False)。
  • numbers_to_include:指定要显示数字的列表。
  • numbers_with_elongated_ticks:指定要加长刻度线的数字列表。

轴样式定制

可以通过 axis_configx_axis_configy_axis_config 来定制轴的样式。

  • stroke_color:轴的颜色。
  • stroke_width:轴的线宽。
  • include_ticks:是否显示刻度线。
  • tick_size:刻度线的长度。
  • include_tip:是否在轴的末端显示箭头。
  • tip_length:箭头的长度。

示例:定制轴的颜色和箭头

axes = Axes(
    x_range=[-6, 6, 1],
    y_range=[-4, 4, 1],
    x_axis_config={
        "stroke_color": RED,
        "include_tip": True,
        "tip_length": 0.2,
    },
    y_axis_config={
        "stroke_color": GREEN,
        "include_tip": True,
        "tip_length": 0.2,
    },
)

四、在坐标轴上绘制函数

使用 plot 方法绘制函数曲线

Axes 提供了 plot 方法,用于在坐标轴上绘制函数曲线。

curve = axes.plot(lambda x: x**2, color=BLUE)
  • lambda x: x**2:要绘制的函数,可以是任何可计算的 Python 函数。
  • color:曲线的颜色。

自定义函数的绘制

您可以绘制任何自定义函数,例如三角函数、指数函数等。

curve = axes.plot(lambda x: np.sin(x), color=YELLOW)

示例:绘制自定义函数

def custom_function(x):
    return np.exp(-x**2)

curve = axes.plot(custom_function, color=PURPLE)

曲线样式定制

可以通过以下参数定制曲线的样式:

x_range:指定函数曲线的 x 范围,格式为 [x_min, x_max]。
use_smoothing:是否对曲线进行平滑处理(默认 True)。
stroke_width:曲线的线宽。

示例:定制曲线范围和线宽

curve = axes.plot(
    lambda x: np.log(x),
    x_range=[0.1, 5],
    color=ORANGE,
    stroke_width=4,
)

五、添加图形元素

添加函数标签
为了在曲线上添加标签,可以使用 get_graph_label 方法。

label = axes.get_graph_label(
    curve,
    label="y = x^2",
    x_val=2,
    direction=UP,
)

curve:要添加标签的曲线对象。
label:标签内容,可以是字符串或 MathTex 对象。
x_val:标签在曲线上对应的 x 值位置。
direction:标签相对于曲线的方向。
buff:标签与曲线之间的距离。

添加点、线和注释

添加点:

dot = Dot(axes.c2p(2, 4), color=RED)
  • axes.c2p(x, y):将数据坐标转换为场景坐标。

添加垂直线:

v_line = axes.get_vertical_line(axes.c2p(2, 4), color=GREEN)

添加水平线:

h_line = axes.get_horizontal_line(axes.c2p(2, 4), color=GREEN)

添加注释文本:

text = Text("关键点", font_size=24).next_to(dot, RIGHT)

六、示例:

上述功能完整示例

下面是一个完整的示例,演示如何使用 Axes 绘制自定义函数曲线,并添加各种元素。

from manim import *

class CustomFunctionPlot(Scene):
    def construct(self):
        # 创建坐标轴
        axes = Axes(
            x_range=[-5, 5, 1],
            y_range=[-1, 1, 0.2],
            x_length=10,
            y_length=6,
            axis_config={
                "include_numbers": True,
                "include_tip": True,
                "tip_length": 0.2,
            },
        )

        # 绘制函数曲线
        func = lambda x: np.sin(x)
        curve = axes.plot(func, color=BLUE)

        # 添加函数标签
        label = axes.get_graph_label(
            curve,
            label="y = \\sin(x)",
            x_val=2,
            direction=UR,
            buff=0.5,
        )

        # 添加垂直线和点
        x_val = PI / 2
        y_val = func(x_val)
        dot = Dot(axes.c2p(x_val, y_val), color=RED)
        v_line = axes.get_vertical_line(axes.c2p(x_val, y_val), color=YELLOW)

        # 添加注释
        text = MathTex("x = \\frac{\\pi}{2}").next_to(dot, DR)

        # 创建动画
        self.play(Create(axes))
        self.play(Create(curve), Write(label))
        self.play(Create(v_line), FadeIn(dot), Write(text))
        self.wait(2)


运行效果

  • 坐标轴:从 -55 的 x 轴和从 -11 的 y 轴,带有数字和箭头。
  • 函数曲线:绘制了正弦函数 y = sin(x) 的曲线,颜色为蓝色。
  • 函数标签:在 x=2 的位置,曲线的右上方添加了函数的数学表达式标签。
  • 垂直线和点:在 x = π/2 处添加了一个红色的点和一条黄色的垂直线。
  • 注释:在点的右下方添加了注释 x = π/2

示例: Sigmoid函数

%%manim -qm SigmoidFunctionPlot

class SigmoidFunctionPlot(Scene):
    def construct(self):
        axes = Axes(
            x_range=[-7, 7, 1],
            y_range=[0, 1, 0.1],
            x_length=16,
            y_length=6,
            tips=False,
            axis_config={"include_numbers": True},
        )
        sigmoid_graph = axes.plot(
            lambda x: 1 / (1 + np.exp(-x)),
            color=BLUE,
        )
        sigmoid_label = axes.get_graph_label(
            sigmoid_graph, label="\\sigma(x) = \\frac{1}{1 + e^{-x}}", x_val=4, direction=DOWN,buff=0.5
        )
        self.play(Create(axes))
        self.play(Create(sigmoid_graph), Write(sigmoid_label))
        self.wait(2)

效果

七、总结

使用 Manim 的 Axes 类来绘制自定义函数曲线关键点:

  1. 创建坐标轴:使用 Axes 类,并设置 x_rangey_range 等参数。
  2. 定制坐标轴:通过 axis_configx_axis_configy_axis_config 定制轴的外观和功能。
  3. 绘制函数曲线:使用 plot 方法,将自定义函数绘制在坐标轴上。
  4. 添加图形元素:利用 get_graph_labelDotget_vertical_line 等方法添加标签、点和线。
  5. 动画效果:使用 CreateWriteFadeIn 等方法为元素添加动画。

标签:axes,自定义,config,曲线,range,axis,include,绘制,Manim
From: https://www.cnblogs.com/ghj1976/p/18469840/shi-yong-manim-hui-zhi-zi-ding-yi-han-shu-qu-xi

相关文章

  • Stable Diffusion【应用篇】【插画转绘】:建筑风景图片的插画转绘制作教程
    学好AI绘画不论是就业还是做副业赚钱都不错,但要学会AI绘画还是要有一个学习规划。最后大家分享一份全套的AI绘画学习资料,给那些想学习AI绘画的小伙伴们一点帮助!图片的插画转绘有很多种不同的风格,今天我们分享另一种制作方法。我们先看一下效果图。这份完整版的A......
  • 修改公司网站?网站模板如何自定义修改?
    修改公司网站并自定义网站模板是一个涉及多个步骤的过程。以下是一些基本的指导步骤,帮助您完成这一任务:1.登录网站后台管理访问后台:通常在您的域名后面加上 /admin 或 /wp-admin 等路径,例如 https://yourdomain.com/admin。登录:使用您的管理员账号和密码登录。2.选择......
  • manim边做边学--数轴
    数轴是数学中的一个基本概念,它规定了原点、正方向和单位长度的直线。Manim中的NumberLine就是一个专门用来表示数轴的对象,它允许用户设置数轴的范围、间隔和显示长度等参数,从而灵活地在动画中展示数学中的一维数值变化。下面将介绍Manim中的NumberLine对象的基本功能到使用示例......
  • WordPress WP_Query自定义搜索多个关键词
    WP_Query是 WordPress 中用于查询文章和自定义内容的核心类。它提供了强大的查询能力,允许开发者以多种方式从数据库中检索和展示内容。WP_Query支持广泛的查询参数,可以用于获取文章、页面、自定义文章类型等。所以通过WP_Query可以创建复杂的搜索功能,以便根据各种条件检索内......
  • python画图|在三维空间的不同平面上分别绘制不同类型二维图
    【1】引言前序已经完成了基础的二维图和三维图绘制教程探索,可直达的链接包括但不限于:python画图|3D参数化图形输出-CSDN博客python画三角函数图|小白入门级教程_正余弦函数画图python-CSDN博客在学习过程中,发现一个案例:在三维空间的不同平面上分别绘制不同类型二维图。经......
  • 自定义信号与槽
    在Qt中,自定义信号与槽是实现对象间通信的一种机制。信号和槽是Qt对象通信的核心特性,使得一个对象能够在发生某种事件时通知其他对象。自定义信号与槽的实现步骤如下:定义信号:在Qt中,信号是由signals关键字声明的类成员函数。它们不需要实现,只需声明。classMyClass:publi......
  • 【idea技巧篇】idea的类注释和方法注释模版自定义设置
    这块idea技巧虽然常用,谁没事会经常修改模版设置呢,一般是搭建开发环境的时候或者开发规范要求等设置一次就行了。用的虽然少,但几乎每次搭建环境都会用到,这里记录下并分享设置的过程已经发现的更高级的一些使用技巧。注释模版idea默认创建java文件时,是不会生成类注释的,但是......
  • Java 列表元素自定义排序
    在Java开发过程中,有时会遇到需要对列表中元素进行自定义的排序。这样的排序往往不能由元素本身的特性(比如字符串长度、首字母顺序)判断,需要自己指定顺序。比如对汉字的数字进行排序,他们的字符串长度都为1,首字母顺序也不能得到预期的结果,因此需要自定义排序。以下是示例代码:p......
  • Delphi 自定义窗体(最大化、最小化、关闭、窗体的移动)
    UsesShellAPI;1、//最小化procedureTForm1.btn1Click(Sender:TObject);varI,J,X,Y:Word;begin//第一种:最小化在屏幕的左下角,不是常见的最小化//WindowState:=wsMinimized;//第儿种:最小化在任务栏里面,是常见的最小化postmessage(Self.Handle,WM_SYSCOMMAN......
  • 自定义线程池的使用
    现在有一个使用多线程进行调优的案例:模拟使用多线程并发处理数据。1.自定义一个线程池//自定义一个线程池classThreadPoolManger{privatefinalThreadPoolExecutorexecutor;privatefinalAtomicBooleanisShutdown;/***构造方法,用于初始化线程......