用Manim标出在图形上的指定位置
在数据可视化和数学演示中,将数据点与坐标系中的轴连接起来对于理解和分析数据的关系至关重要。通过绘制从坐标轴指向特定点的线,可以直观地展示数据点在二维空间中的位置。这种方法在多种场景下都具有重要意义,如函数图像的分析、几何图形的构造,以及在教育场合中帮助学生理解概念。
使用 Manim 库中的 get_lines_to_point
方法,用户可以轻松地实现这种可视化。这一方法允许从坐标系的 x 轴和 y 轴向指定的点(通常以二维坐标表示)绘制线条。通过此方法,用户不仅能够指定目标点的坐标,还可以调整线条的颜色、粗细以及透明度等属性,以增强视觉效果。
这种连接线的绘制可以帮助观众更好地理解数据的相关性。例如,在函数曲线的旁边绘制指向特定点的线,可以清晰地展示该点的 x 和 y 值,增强信息的传达。同时,这种可视化还可以用于图表的标注、数据的强调,或是演示复杂理论时的辅助工具,增强演示的直观性和吸引力。通过这种方式,数学和科学的概念变得更加生动,易于理解。
1.为传递的图形创建位置正确的标签,并带有一个可选的点
python
get_graph_label(graph, label='f(x)', x_val=None, direction=array([1., 0., 0.]),
buff=0.25, color=None, dot=False, dot_config=None)
get_graph_label
是一个用于在图形中标记函数的图例的函数。其参数含义如下:
-
graph: 需要标记的图形或函数对象,通常是你想要对其添加标签的图形。
-
label : 用于显示的标签字符串,默认为
'f(x)'
,可以修改为所需的任意字符串。 -
x_val: 可选参数,表示在 x 轴上的特定值。如果提供这个值,标签将会在该点处进行标记。
-
direction : 一个数组,指定标签的放置方向。默认值为
[1., 0., 0.]
,表示标签将沿着 x 轴的方向放置。 -
buff : 标签与 graph 之间的缓冲距离,默认为
0.25
。这个参数可以用于调整标签与图形的间距。 -
color : 标签的颜色,可以是任何有效的颜色值(如字符串、RGB 值等)。如果为
None
,则使用默认颜色。 -
dot : 一个布尔值,指示是否在标签旁添加一个小点。默认为
False
。 -
dot_config : 如果
dot
为True
,可以用此参数提供小点的配置(如颜色、大小等)。
这个函数通常用于数据可视化,帮助用户更易于识别和理解图形内容。
示例:
python
from manim import *
class GetGraphLabelExample(Scene):
def construct(self):
ax = Axes(
x_range=[-PI, 3*PI,PI/2],
y_range=[-1, 3],
x_length=4*PI,
y_length=4
)
"""
# 设置 x 轴标签和字体大小
a11=ax.x_axis.set_tick_labels([
MathTex(r"-\pi"),
MathTex(r"\frac{-\pi}{2}"),
MathTex(r"0"),
MathTex(r"\frac{\pi}{2}"),
MathTex(r"{\pi}"),
MathTex(r"\frac{3\pi}{2}"),
MathTex(r"{2\pi}") ,
MathTex(r"\frac{5\pi}{2}"),
MathTex(r"{3\pi}")
])
# 不设置底部默认标签
ax.x_axis.label_font_size = 0.4
"""
sin = ax.plot(lambda x: np.sin(x), color=PURPLE_B)
#.scale(0.95)
label = ax.get_graph_label(
graph=sin,
label= MathTex(r"\frac{\pi}{2}"),
x_val=PI / 2,
dot=True,
direction=UR,
)
self.add(ax,sin, label)
运行结果:
示例2:
以下是一个使用 Manim 的示例程序,绘制函数 的图像,并在 x=2 的位置标记标签。
python
from manim import *
class ParabolaLabelExample(Scene):
def construct(self):
# 创建坐标系
ax = Axes(
x_range=[-3, 3, 1], # x轴范围
y_range=[-1, 10, 1], # y轴范围
x_length=6, # x轴长度
y_length=5, # y轴长度
).add_coordinates()
# 绘制 y = x^2 函数
parabola = ax.plot(lambda x: x**2, color=BLUE)
# 获取图形标签
label = ax.get_graph_label(
graph=parabola,
label=MathTex("y=x^2"), # 标签内容
x_val=2, # x = 2 位置
dot=True, # 在标签位置绘制一个点
direction=UR, # 标签方向
)
# 绘制 y = x^2 在 x = 2 处的点
point = Dot(ax.c2p(2, 4), color=YELLOW) # 点 (2, 4)
# 添加坐标系、抛物线、标签和点到场景中
self.add(ax, parabola, label, point)
在这个代码中:
- 创建了一个坐标系。
- 绘制了函数
- 在 x=2处获取了标签,并在该点绘制了一个点。
运行结果:
2.成水平线
python
get_horizontal_line(point, **kwargs)
get_horizontal_line(point, **kwargs)
是 Manim 中用于生成水平线的函数。具体来说,它绘制一条通过给定点的水平线。以下是对这个函数的详细解释:
参数
-
point:
- 这是一个 2D 坐标(通常使用
c2p(x, y)
生成的),决定了水平线的起始位置。水平线会通过这个点水平延伸。
- 这是一个 2D 坐标(通常使用
-
kwargs:
- 这表示函数接受的其他可选参数。
kwargs
通常用于传递额外的属性,如颜色 (color
)、线宽 (stroke_width
)、透明度 (opacity
)等。例如,你可以设置线的颜色为红色、透明度为0.5等。
- 这表示函数接受的其他可选参数。
返回值
该函数返回一个 Manim 中的 Line
对象,表示生成的水平线。
示例 :
python
from manim import *
class HorizontalLineExample(Scene):
def construct(self):
# 创建坐标系
ax = Axes().add_coordinates()
#ax = Axes(x_range=[-3, 3, 1], y_range=[-2, 2, 1])
# 绘制水平线,通过(1, 1)点
p01=ax.c2p(1, 1)
horizontal_line = ax.get_horizontal_line(p01, color=RED)
d01=Dot(p01)
point = ax.c2p(-4, 1.5)
dot = Dot(point)
line = ax.get_horizontal_line(point, line_func=Line)
self.add(ax, horizontal_line, d01,line, dot)
运行结果:
3.综合实现------坐标系的轴向给定的点绘制线
get_lines_to_point
是 Manim 中 Axes
类的一个方法,用于从坐标系的轴向给定的点绘制线。
函数原型
get_lines_to_point(point, **kwargs)
参数
-
point:
- 类型:
np.ndarray
,tuple
,list
- 描述: 这个参数表示目标点的坐标,你想从坐标轴绘制线到这个点。通常这个点是以二维坐标的形式传递,例如
[x, y]
。
- 类型:
-
kwargs (可选参数):
- 这个参数允许你传递额外的关键字参数,以自定义绘制的线条。这些关键字参数通常是 Matplotlib 画线方法的参数,包括:
color
: 线的颜色。stroke_width
: 线的宽度。opacity
: 线的透明度等属性。
- 这个参数允许你传递额外的关键字参数,以自定义绘制的线条。这些关键字参数通常是 Matplotlib 画线方法的参数,包括:
返回值
- 返回值通常是一个包含线对象的列表,这些线对象是从坐标轴(例如 x 轴和 y 轴)延伸到指定点的。
示例:
python
from manim import *
class GetLinesToPointExample(Scene):
def construct(self):
# 创建坐标系,指定范围
ax = Axes(
x_range=[-3, 3, 1], # x轴范围
y_range=[-1, 10, 1], # y轴范围
x_length=6, # x轴长度
y_length=5, # y轴长度
)
ax.add_coordinates()
# 创建点
dot = Dot(ax.c2p(2, 4), color=YELLOW)
# 获取从坐标系到点的线
lines_1 = ax.get_lines_to_point(dot.get_center(), stroke_width=10 , color=GREEN)
parabola = ax.plot(lambda x: x**2, color=BLUE)
# 获取图形标签
label = ax.get_graph_label(
graph=parabola,
label=MathTex(r"\begin{matrix}x=2\\ y=4\end{matrix}"), # 标签内容
x_val=2, # x = 2 位置
color=RED,
dot=True, # 在标签位置绘制一个点
direction=RIGHT, # 标签方向
)
# 添加坐标系、点和线到场景
self.add(ax,label,parabola, dot, lines_1)
运行结果: