高级二维打印教程

这个 Sage 该文件是为MAA预习班“Sage:在本科生中使用开源数学软件”开发的教程之一(NSF提供资金,到期日:0817071)。它是根据Creative Commons Attribution -ShareLiked 3.0许可证授权的 (CC BY-SA

感谢Sage整合了 matplotlib ,Sage具有全面的二维绘图功能。本工作表由以下部分组成:

本教程假设您熟悉Sage的基本知识,例如通过单击“evaluate”链接或按Shift -Enter(按住Shift同时按Enter键)来计算单元格。

绘制函数和绘制曲线

笛卡尔图

简单的二次曲线很容易。

sage: plot(x^2, (x,-2,2))
Graphics object consisting of 1 graphics primitive

您可以通过添加来组合“打印对象”。

sage: regular = plot(x^2, (x,-2,2), color= 'purple')
sage: skinny = plot(4*x^2, (x,-2,2), color = 'green')
sage: regular + skinny
Graphics object consisting of 2 graphics primitives

问题 : Plot a green \(y=\sin(x)\) 和一个红色的 \(y=2\,\cos(x)\) . (提示:您可以使用 pi 作为您产品系列的一部分。)

除总尺寸外,还可以指定绘图的边界。

sage: plot(1+e^(-x^2), xmin=-2, xmax=2, ymin=0, ymax=2.5, figsize=10)
Graphics object consisting of 1 graphics primitive

问题 : Plot \(y=5+3\,\sin(4x)\) 有合适的边界。

你可以添加很多额外的信息。

sage: exponential = plot(1+e^(-x^2), xmin=-2, xmax=2, ymin=0, ymax=2.5)
sage: max_line = plot(2, xmin=-2, xmax=2, linestyle='-.', color = 'red')
sage: min_line = plot(1, xmin=-2, xmax=2, linestyle=':', color = 'red')
sage: exponential + max_line + min_line
Graphics object consisting of 3 graphics primitives

可以使用透明颜色填充区域,并加厚曲线。本例使用几个选项来微调图形。

sage: exponential = plot(1+e^(-x^2), xmin=-2, xmax=2, ymin=0, ymax=2.5, fill=0.5, fillcolor='grey', fillalpha=0.3)
sage: min_line = plot(1, xmin=-2, xmax=2, linestyle='-', thickness= 6, color = 'red')
sage: exponential + min_line
Graphics object consisting of 3 graphics primitives
sage: sum([plot(x^n,(x,0,1),color=rainbow(5)[n]) for n in [0..4]])
Graphics object consisting of 5 graphics primitives

问题 : Create a plot showing the cross-section area for the following solid of revolution problem: Consider the area bounded by \(y=x^2-3x+6\) 还有那条线 \(y=4\) . 找到通过围绕直线旋转此区域创建的体积 \(y=1\) .

参数化绘图

参数绘图需要参数的两个函数的列表;在Sage中,我们使用 广场 用括号分隔列表。请注意,我们必须声明 t 首先作为变量。因为图形略宽于高,我们使用 aspect_ratio 选项(这些选项称为 关键词 )以确保轴对于我们想要查看此对象的方式是正确的。

sage: t = var('t')
sage: parametric_plot([cos(t) + 3 * cos(t/9), sin(t) - 3 * sin(t/9)], (t, 0, 18*pi), fill = True, aspect_ratio=1)
Graphics object consisting of 2 graphics primitives

问题 :这些参数方程将创建一个内摆线。

\[x(t)=17cos(t)+3cos(17t/3)\]
\[y(t)=17sin(t)-3sin(17t/3)\]

将其创建为参数化打印。

Sage自动打印二维或三维打印,以及曲线或曲面,具体取决于指定的变量和坐标的数量。

sage: t = var('t')
sage: parametric_plot((t^2,sin(t)), (t,0,pi))
Graphics object consisting of 1 graphics primitive
sage: parametric_plot((t^2,sin(t),cos(t)), (t,0,pi))
Graphics3d Object
sage: r = var('r')
sage: parametric_plot((t^2,sin(r*t),cos(r*t)), (t,0,pi),(r,-1,1))
Graphics3d Object

极坐标图

Sage也可以做极坐标图。

sage: polar_plot(2 + 2*cos(x), (x, 0, 2*pi), color=hue(0.5), thickness=4)
Graphics object consisting of 1 graphics primitive

尽管它们不是必需的,但这些示例中的许多都试图演示诸如着色、填充和着色之类的内容,以使您对各种可能性有一种感觉。

列表(方括号)中可以指定多条极坐标曲线。请注意填充颜色的自动渐变着色。

sage: t = var('t')
sage: polar_plot([cos(4*t) + 1.5,  0.5 * cos(4*t) + 2.5], (t, 0, 2*pi),
....:            color='black', thickness=2, fill=True, fillcolor='orange')
Graphics object consisting of 4 graphics primitives

问题:为以下问题创建绘图。找出圆圈内的区域 \(r=2\) 但在心形之外 \(2+2\cos(\theta)\) .

交互式演示

这可能是有趣的看到所有这些东西在一个非常好的教学图表。尽管这是相当先进的,因此您可能希望跳过代码,但它并不像您想象的那样困难。

sage: html('<h2>Sine and unit circle (by Jurgis Pralgauskis)</h2> inspired by <a href="http://www.youtube.com/watch?v=Ohp6Okk_tww&feature=related">this video</a>' )
sage: # http://doc.sagemath.org/html/en/reference/sage/plot/plot.html
sage: radius = 100 # scale for radius of "unit" circle
sage: graph_params = dict(xmin = -2*radius,    xmax = 360,
....:                    ymin = -(radius+30), ymax = radius+30,
....:                    aspect_ratio=1,
....:                    axes = False
....:                    )
sage: def sine_and_unit_circle( angle=30, instant_show = True, show_pi=True ):
....:     ccenter_x, ccenter_y = -radius, 0  # center of cirlce on real coords
....:     sine_x = angle # the big magic to sync both graphs :)
....:     current_y = circle_y = sine_y = radius * sin(angle*pi/180)
....:     circle_x = ccenter_x + radius * cos(angle*pi/180)
....:     graph = Graphics()
....:     # we'll put unit circle and sine function on the same graph
....:     # so there will be some coordinate mangling ;)
....:     # CIRCLE
....:     unit_circle = circle((ccenter_x, ccenter_y), radius, color="#ccc")
....:     # SINE
....:     x = var('x')
....:     sine = plot( radius * sin(x*pi/180) , (x, 0, 360), color="#ccc" )
....:     graph += unit_circle + sine
....:     # CIRCLE axis
....:     # x axis
....:     graph +=  arrow( [-2*radius, 0], [0, 0], color = "#666" )
....:     graph += text("$(1, 0)$",  [-16, 16],  color = "#666")
....:     # circle y axis
....:     graph +=  arrow( [ccenter_x,-radius], [ccenter_x, radius], color = "#666" )
....:     graph += text("$(0, 1)$",  [ccenter_x, radius+15],  color = "#666")
....:     # circle center
....:     graph += text("$(0, 0)$",  [ccenter_x, 0],  color = "#666")
....:     # SINE x axis
....:     graph +=  arrow( [0,0], [360, 0], color = "#000" )
....:     # let's set tics
....:     # or http://aghitza.org/posts/tweak_labels_and_ticks_in_2d_plots_using_matplotlib/
....:     # or wayt for http://trac.sagemath.org/sage_trac/ticket/1431
....:     # ['$-\pi/3$', '$2\pi/3$', '$5\pi/3$']
....:     for x in range(0, 361, 30):
....:         graph += point( [x, 0] )
....:         angle_label = ".  $%3d^{\circ}$ " % x
....:         if show_pi: angle_label += " $(%s\pi) $"% x/180
....:         graph += text(angle_label,  [x, 0], rotation=-90,
....:         vertical_alignment='top', fontsize=8, color="#000" )
....:     # CURRENT VALUES
....:     # SINE -- y
....:     graph +=  arrow( [sine_x,0], [sine_x, sine_y], width=1, arrowsize=3)
....:     graph +=  arrow( [circle_x,0], [circle_x, circle_y], width=1, arrowsize=3)
....:     graph +=  line(([circle_x, current_y], [sine_x, current_y]), rgbcolor="#0F0", linestyle = "--", alpha=0.5)
....:     # LABEL on sine
....:     graph += text("$(%d^{\circ}, %3.2f)$"%(sine_x, float(current_y)/radius),  [sine_x+30, current_y],  color = "#0A0")
....:     # ANGLE -- x
....:     # on sine
....:     graph += arrow( [0,0], [sine_x, 0], width=1, arrowsize=1, color='red')
....:     # on circle
....:     graph += disk( (ccenter_x, ccenter_y), float(radius)/4, (0, angle*pi/180), color='red', fill=False, thickness=1)
....:     graph +=  arrow( [ccenter_x, ccenter_y], [circle_x, circle_y],
....:                  rgbcolor="#cccccc", width=1, arrowsize=1)
....:     if instant_show:
....:         show (graph,  **graph_params)
....:     return graph
sage: #####################
sage: # make Interaction
sage: ######################
sage: @interact
sage: def _( angle = slider([0..360], default=30, step_size=5,
....:          label="Pasirinkite kampą:    ", display_value=True) ):
....:     sine_and_unit_circle(angle, show_pi = False)

绘制图形

绘制数据点

有时只需绘制数据。在这里,我们演示了几种绘制点和数据的方法,这些方法是通过对

\[Fn=frac{1}{sqrt{5}}左(frac{1+sqrt{5}}{2}右)^n,\]

这是相当好的后约 \(n=5\) .

首先,我们注意到斐波纳契数是内置的。

sage: fibonacci_sequence(6)
<generator object fibonacci_sequence at ...>
sage: list(fibonacci_sequence(6))
[0, 1, 1, 2, 3, 5]

这个 enumerate 命令对于获取一个列表并将其与计数数字进行协调非常有用。

sage: list(enumerate(fibonacci_sequence(6)))
[(0, 0), (1, 1), (2, 1), (3, 2), (4, 3), (5, 5)]

所以我们只需定义要绘制的数字和坐标对。

sage: fibonacci = list(enumerate(fibonacci_sequence(6)))
sage: f(n)=(1/sqrt(5))*((1+sqrt(5))/2)^n
sage: asymptotic = [(i, f(i)) for i in range(6)]
sage: fibonacci
[(0, 0), (1, 1), (2, 1), (3, 2), (4, 3), (5, 5)]
sage: asymptotic
[(0, 1/5*sqrt(5)), (1, 1/10*sqrt(5)*(sqrt(5) + 1)), (2, 1/20*sqrt(5)*(sqrt(5) + 1)^2), (3, 1/40*sqrt(5)*(sqrt(5) + 1)^3), (4, 1/80*sqrt(5)*(sqrt(5) + 1)^4), (5, 1/160*sqrt(5)*(sqrt(5) + 1)^5)]

现在,我们不仅可以绘制两组点,还可以使用一些记录的选项来绘制点。来自其他系统的人可能更喜欢 list_plot .

sage: fib_plot=list_plot(fibonacci, color='red', pointsize=30)
sage: asy_plot = list_plot(asymptotic, marker='D',color='black',thickness=2,plotjoined=True)
sage: show(fib_plot+asy_plot, aspect_ratio=1)

其他选项包括 linepointsscatter_plot . 为不同的数据选择标记对于生成可发布的图形特别有用。

sage: fib_plot=scatter_plot(fibonacci, facecolor='red', marker='o',markersize=40)
sage: asy_plot = line(asymptotic, marker='D',color='black',thickness=2)
sage: show(fib_plot+asy_plot, aspect_ratio=1)

等高线图

等高线图

当试图处理多变量函数以及建模时,等高线图非常有用。基本语法与3D打印基本相同-只是2D打印语法的扩展。

sage: f(x,y)=y^2+1-x^3-x
sage: contour_plot(f, (x,-pi,pi), (y,-pi,pi))
Graphics object consisting of 1 graphics primitive

我们可以改变颜色,指定轮廓,标记曲线,以及其他许多事情。当有许多级别时 colorbar 关键字对于跟踪它们变得非常有用。请注意,与许多其他选项相反,它只能 TrueFalse (对应于它是否出现)。

sage: contour_plot(f, (x,-pi,pi), (y,-pi,pi),colorbar=True,labels=True)
Graphics object consisting of 1 graphics primitive

这个例子很容易解释,但展示了格式化、标记和各种内置颜色渐变(彩色地图或 cmap ). 与之相对应的奇怪的结构 label_fmt Sage/Python数据类型称为 词典 ,并被证明对更高级的Sage用法是有用的;它由一个冒号连接的对组成,都在大括号内。

sage: contour_plot(f, (x,-pi,pi), (y,-pi,pi), contours=[-4,0,4], fill=False,
....:     cmap='cool', labels=True, label_inline=True,
....:     label_fmt={-4:"low", 0:"medium", 4: "hi"}, label_colors='black')
Graphics object consisting of 1 graphics primitive

隐式曲线图是一种特殊的等高线图(它们只绘制零等高线)。

sage: f(x,y)
-x^3 + y^2 - x + 1
sage: implicit_plot(f(x,y)==0,(x,-pi,pi),(y,-pi,pi))
Graphics object consisting of 1 graphics primitive

密度图类似于等高线图,但没有离散的级别。

sage: density_plot(f, (x, -2, 2), (y, -2, 2))
Graphics object consisting of 1 graphics primitive

有时等高线图可能有点误导(这使得 伟大的 关于盲目依赖技术问题的课堂讨论)。在这里,我们结合了密度图和等高线图,以更好地显示函数发生了什么。

sage: density_plot(f,(x,-2,2),(y,-2,2))+contour_plot(f,(x,-2,2),(y,-2,2),fill=False,labels=True,label_inline=True,cmap='jet')
Graphics object consisting of 2 graphics primitives

熟悉不同情节的各种选择是值得的,尤其是如果你将在给定的工作表或教学情境中做很多的话。

下面是等高线图的选项。

  • 它们以“属性”的形式给出-无括号 contour_plot 对象。

  • 它们是作为字典提供的(参见 the programming tutorial

sage: contour_plot.options
{'aspect_ratio': 1,
 'axes': False,
 'colorbar': False,
 'contours': None,
 'fill': True,
 'frame': True,
 'labels': False,
 'legend_label': None,
 'linestyles': None,
 'linewidths': None,
 'plot_points': 100,
 'region': None}

让我们改变它,使所有未来的等高线图都没有填充。这就是我们中的一些人在课堂上使用它们的方式。我们还将检查是否发生了更改。

sage: contour_plot.options["fill"]=False
sage: contour_plot.options
{'aspect_ratio': 1,
 'axes': False,
 'colorbar': False,
 'contours': None,
 'fill': False,
 'frame': True,
 'labels': False,
 'legend_label': None,
 'linestyles': None,
 'linewidths': None,
 'plot_points': 100,
 'region': None}

而且很管用!

sage: contour_plot(f,(x,-2,2),(y,-2,2))
Graphics object consisting of 1 graphics primitive

当然,我们可以随时访问默认选项来提醒我们。

sage: contour_plot.defaults()
{'aspect_ratio': 1,
 'axes': False,
 'colorbar': False,
 'contours': None,
 'fill': True,
 'frame': True,
 'labels': False,
 'legend_label': None,
 'linestyles': None,
 'linewidths': None,
 'plot_points': 100,
 'region': None}

矢量场

向量场的语法与其他多元结构非常相似。请注意,箭头的比例是适当的,并且在三维情况下按长度着色。

sage: var('x,y')
(x, y)
sage: plot_vector_field((-y+x,y*x),(x,-3,3),(y,-3,3))
Graphics object consisting of 1 graphics primitive
sage: var('x,y,z')
(x, y, z)
sage: plot_vector_field3d((-y,-z,x), (x,-3,3),(y,-3,3),(z,-3,3))
Graphics3d Object

理想情况下,3d矢量场图可以用3d眼镜观看(右键单击绘图并选择“样式”和“赤平极图”)

复杂地块

我们可以绘制复变函数,其中亮度表示幅值(黑色表示零幅值),参数由色调表示(红色为正实数)。

sage: f(z) = exp(z) #z^5 + z - 1 + 1/z
sage: complex_plot(f, (-5,5),(-5,5))
Graphics object consisting of 1 graphics primitive

区域图

这些图在表达式为真的地方绘制,对于绘制不等式很有用。

sage: region_plot(cos(x^2+y^2) <= 0, (x, -3, 3), (y, -3, 3),aspect_ratio=1)
Graphics object consisting of 1 graphics primitive

我们也可以得到更漂亮的选择。

sage: region_plot(sin(x)*sin(y) >= 1/4, (x,-10,10), (y,-10,10), incol='yellow', bordercol='black', borderstyle='dashed', plot_points=250,aspect_ratio=1)
Graphics object consisting of 2 graphics primitives

记住,什么命令可以提供有关语法、选项和示例的完整信息?

其他绘图信息

内置图形对象

Sage包括各种内置图形对象。对于在绘图中添加某些难以用方程描述的对象,但这些对象仍然是基本的几何对象,这些对象特别有用。在这一节中,我们将尝试演示其中一些最有用的语法;对于其中的大多数,上下文(记住,附加 ? )帮助会提供更多细节。

一对坐标就足够了。

sage: point((3,5))
Graphics object consisting of 1 graphics primitive

如何生成多个点并不重要;它们必须作为输入通过列表(方括号)输入。在这里,我们展示了实现这一点的硬(但天真)和简单(但稍微复杂一点)的方法。

sage: f(x)=x^2
sage: points([(0,f(0)), (1,f(1)), (2,f(2)), (3,f(3)), (4,f(4))])
Graphics object consisting of 1 graphics primitive
sage: points([(x,f(x)) for x in range(5)])
Graphics object consisting of 1 graphics primitive

Sage会自动告诉你有多少维度在工作。

sage: f(x,y)=x^2-y^2
sage: points([(x,y,f(x,y)) for x in range(5) for y in range(5)])
Graphics3d Object

线

线的语法和点的语法是一样的,但是你得到。。。好吧,你也有连接线!

sage: f(x)=x^2
sage: line([(x,f(x)) for x in range(5)])
Graphics object consisting of 1 graphics primitive

Sage有各种类型的磁盘和球体。通常只需要中心和半径,但也可以选择其他选项。

sage: circle((0,1),1,aspect_ratio=1)
Graphics object consisting of 1 graphics primitive
sage: disk((0,0), 1, (pi, 3*pi/2), color='yellow',aspect_ratio=1)
Graphics object consisting of 1 graphics primitive

还有椭圆和各种圆弧;请参见 full plot documentation .

箭头

sage: arrow((0,0), (1,1))
Graphics object consisting of 1 graphics primitive

多边形

多边形将试图完成自身并填充内部;否则语法就相当不言而喻了。

sage: polygon([[0,0],[1,1],[1,2]])
Graphics object consisting of 1 graphics primitive

文本

在2d中,可以使用 text 命令。这可以用来微调某些类型的标签。不幸的是,在3D中文本只是文本。

sage: text(r'$\int_0^2 x^2\, dx$', (0.5,2))+plot(x^2,(x,0,2),fill=True)
Graphics object consisting of 3 graphics primitives

保存绘图

我们可以将二维图保存为许多不同的格式。Sage可以根据图像的文件名确定格式。

sage: p=plot(x^2,(x,-1,1))
sage: p
Graphics object consisting of 1 graphics primitive

出于测试目的,我们使用Sage标准临时文件名;但是,您可以使用任何字符串作为您想要的名称,例如 "my_plot.png" .

sage: name = tmp_filename() # this is a string
sage: png_savename = name+'.png'
sage: p.save(png_savename)

在笔记本中,这些通常是准备好下载的小链接细胞。

sage: pdf_savename = name+'.pdf'
sage: p.save(pdf_savename)

值得注意的是,我们可以以可以包含在网页中的格式导出。

sage: svg_savename = name+'.svg'
sage: p.save(svg_savename)