.. sage-doctest: needs sage.plot sage.symbolic
.. _section-plot:
绘图
====
Sage 可以生成二维和三维图形。
二维图形
--------
在二维中,Sage 可以绘制圆、线和多边形;在直角坐标系中绘制函数图形;
还可以绘制极坐标图、轮廓图和矢量场图。本文档展示了若干这些图形的例子。
有关使用 Sage 绘图的更多例子,请参见 :ref:`section-systems` 和 :ref:`section-maxima`,
以及 `Sage Constructions <http://doc.sagemath.org/html/en/constructions/>`_ 文档。
该命令生成一个位于原点的半径为 1 的黄色圆:
::
sage: circle((0,0), 1, rgbcolor=(1,1,0))
Graphics object consisting of 1 graphics primitive
你还可以生成一个填充的圆:
::
sage: circle((0,0), 1, rgbcolor=(1,1,0), fill=True)
Graphics object consisting of 1 graphics primitive
你还可以通过将圆赋值给变量来创建圆;这样做不会将圆绘制出来:
::
sage: c = circle((0,0), 1, rgbcolor=(1,1,0))
要想绘制它,可以使用 ``c.show()`` 或 ``show(c)``,如下所示:
.. link
::
sage: c.show()
或者,使用 ``c.save('filename.png')`` 将绘图保存到给定文件。
现在,这些“圆”看起来更像椭圆,因为坐标轴的比例不同。你可以这样修复这个问题:
.. link
::
sage: c.show(aspect_ratio=1)
命令 ``show(c, aspect_ratio=1)`` 可以完成同样的事情,
或者你可以使用 ``c.save('filename.png', aspect_ratio=1)`` 保存图片。
绘制基本函数很容易:
::
sage: plot(cos, (-5,5))
Graphics object consisting of 1 graphics primitive
一旦你指定了变量名称,你还可以创建参数化图形:
::
sage: x = var('x')
sage: parametric_plot((cos(x),sin(x)^3),(x,0,2*pi),rgbcolor=hue(0.6))
Graphics object consisting of 1 graphics primitive
一定要注意,只有当原点在图形的视图范围内时,图形的轴才会相交,并且对于非常大的数值可能会使用科学计数法:
::
sage: plot(x^2,(x,300,500))
Graphics object consisting of 1 graphics primitive
你可以通过将多个图形相加来将他们组合在一起:
::
sage: x = var('x')
sage: p1 = parametric_plot((cos(x),sin(x)),(x,0,2*pi),rgbcolor=hue(0.2))
sage: p2 = parametric_plot((cos(x),sin(x)^2),(x,0,2*pi),rgbcolor=hue(0.4))
sage: p3 = parametric_plot((cos(x),sin(x)^3),(x,0,2*pi),rgbcolor=hue(0.6))
sage: show(p1+p2+p3, axes=false)
生成填充形状的一个好方法是生成点列表(示例中的 ``L``),
然后使用 ``polygon`` 命令绘制由这些点构成边界的形状。
例如,下面是一个绿色的三角形:
::
sage: L = [[-1+cos(pi*i/100)*(1+cos(pi*i/100)),
....: 2*sin(pi*i/100)*(1-cos(pi*i/100))] for i in range(200)]
sage: p = polygon(L, rgbcolor=(1/8,3/4,1/2))
sage: p
Graphics object consisting of 1 graphics primitive
输入 ``show(p, axes=false)`` 来查看没有任何坐标轴的图形。
你可以向图形中添加文本:
::
sage: L = [[6*cos(pi*i/100)+5*cos((6/2)*pi*i/100),
....: 6*sin(pi*i/100)-5*sin((6/2)*pi*i/100)] for i in range(200)]
sage: p = polygon(L, rgbcolor=(1/8,1/4,1/2))
sage: t = text("hypotrochoid", (5,4), rgbcolor=(1,0,0))
sage: show(p+t)
微积分老师经常在黑板上绘制以下图形:
arcsin 的多个周期:
即 `y=\sin(x)` 对于 `x` 在 `-2\pi` 和 `2\pi` 区间的图像,
围绕 45 度线翻转。以下 Sage 命令构造此图形:
::
sage: v = [(sin(x),x) for x in srange(-2*float(pi),2*float(pi),0.1)]
sage: line(v)
Graphics object consisting of 1 graphics primitive
由于正切函数的值域比正弦函数大得多,如果你使用相同技巧绘制反正切的图像,你应该更改 *x* 轴的最大和最小坐标:
::
sage: v = [(tan(x),x) for x in srange(-2*float(pi),2*float(pi),0.01)]
sage: show(line(v), xmin=-20, xmax=20)
Sage 还能计算极坐标图、轮廓图和矢量场图(针对特殊类型的函数)。这里是一个轮廓图的例子:
::
sage: f = lambda x,y: cos(x*y)
sage: contour_plot(f, (-4, 4), (-4, 4))
Graphics object consisting of 1 graphics primitive
三维图形
--------
Sage 还可以用于创建三维图形。
在 notebook 和 REPL 中,这些图形将默认使用开源软件包 [ThreeJS]_ 显示,
该软件包支持使用鼠标交互式旋转和缩放图形。
使用 ``plot3d`` 绘制形如 `f(x, y) = z` 的函数图像:
::
sage: x, y = var('x,y')
sage: plot3d(x^2 + y^2, (x,-2,2), (y,-2,2))
Graphics3d Object
或者,你可以使用 ``parametric_plot3d`` 绘制参数曲面,
其中每个 `x, y, z` 由一个或两个变量(通常是 `u` 和 `v`)的函数确定。
前面的图形可以参数化地表达如下:
::
sage: u, v = var('u, v')
sage: f_x(u, v) = u
sage: f_y(u, v) = v
sage: f_z(u, v) = u^2 + v^2
sage: parametric_plot3d([f_x, f_y, f_z], (u, -2, 2), (v, -2, 2))
Graphics3d Object
在 Sage 中绘制 3D 曲面的第三种方法是 `implicit_plot3d``,
它绘制形如 `f(x, y, z) = 0` 的函数的轮廓(这定义了一组点)。
我们使用经典公式绘制一个球体:
::
sage: x, y, z = var('x, y, z')
sage: implicit_plot3d(x^2 + y^2 + z^2 - 4, (x,-2, 2), (y,-2, 2), (z,-2, 2))
Graphics3d Object
下面是更多的例子:
`Yellow Whitney's umbrella <http://en.wikipedia.org/wiki/Whitney_umbrella>`__:
::
sage: u, v = var('u,v')
sage: fx = u*v
sage: fy = u
sage: fz = v^2
sage: parametric_plot3d([fx, fy, fz], (u, -1, 1), (v, -1, 1),
....: frame=False, color="yellow")
Graphics3d Object
`Cross cap <http://en.wikipedia.org/wiki/Cross-cap>`__:
::
sage: u, v = var('u,v')
sage: fx = (1+cos(v))*cos(u)
sage: fy = (1+cos(v))*sin(u)
sage: fz = -tanh((2/3)*(u-pi))*sin(v)
sage: parametric_plot3d([fx, fy, fz], (u, 0, 2*pi), (v, 0, 2*pi),
....: frame=False, color="red")
Graphics3d Object
挠环面:
::
sage: u, v = var('u,v')
sage: fx = (3+sin(v)+cos(u))*cos(2*v)
sage: fy = (3+sin(v)+cos(u))*sin(2*v)
sage: fz = sin(u)+2*cos(v)
sage: parametric_plot3d([fx, fy, fz], (u, 0, 2*pi), (v, 0, 2*pi),
....: frame=False, color="red")
Graphics3d Object
双纽线:
::
sage: x, y, z = var('x,y,z')
sage: f(x, y, z) = 4*x^2 * (x^2 + y^2 + z^2 + z) + y^2 * (y^2 + z^2 - 1)
sage: implicit_plot3d(f, (x, -0.5, 0.5), (y, -1, 1), (z, -1, 1))
Graphics3d Object