.. _section-plot:
Gráficos
========
O Sage pode produzir gráficos bidimensionais e tridimensionais.
Gráficos Bidimensionais
-----------------------
Em duas dimensões, o Sage pode desenhar círculos, linhas, e polígonos;
gráficos de funções em coordenadas retangulares, e também coordenadas
polares; gráficos de contorno e gráficos de campos vetoriais.
Apresentamos alguns exemplos desses gráficos aqui. Para mais exemplos
de gráficos com o Sage, veja :ref:`section-systems` e
:ref:`section-maxima`, e também a documentação `Sage Constructions
`_.
Este comando produz um círculo amarelo de raio 1, centrado na origem.
::
sage: circle((0,0), 1, rgbcolor=(1,1,0))
Graphics object consisting of 1 graphics primitive
Você pode também produzir um círculo preenchido:
::
sage: circle((0,0), 1, rgbcolor=(1,1,0), fill=True)
Graphics object consisting of 1 graphics primitive
Outra possibilidade é criar um círculo atribuindo-o a uma variável;
isso não cria um gráfico:
::
sage: c = circle((0,0), 1, rgbcolor=(1,1,0))
Para criar o gráfico, use ``c.show()`` ou ``show(c)``, da seguinte
forma:
.. link
::
sage: c.show()
Alternativamente, o comando ``c.save('filename.png')`` salva o gráfico
no arquivo citado.
Agora, esses 'círculos' parecem mais elipses porque os eixos estão em
escalas diferentes. Você pode alterar isso:
.. link
::
sage: c.show(aspect_ratio=1)
O comando ``show(c, aspect_ratio=1)`` produz o mesmo resultado, ou
você pode salvar a figura usando ``c.save('filename.png',
aspect_ratio=1)``.
É fácil criar o gráfico de funções simples:
::
sage: plot(cos, (-5,5))
Graphics object consisting of 1 graphics primitive
Após especificar uma variável, você também pode criar gráficos
paramétricos:
::
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
É importante notar que os eixos dos gráficos vão se intersectar apenas
se a origem estiver no escopo do gráfico, e que valores grandes podem
ser representados usando notação científica.
::
sage: plot(x^2,(x,300,500))
Graphics object consisting of 1 graphics primitive
Você pode combinar vários gráficos somando-os:
::
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)
Uma boa forma de produzir figuras preenchidas é criar uma lista de
pontos (``L`` no exemplo abaixo) e então usar o comando ``polygon``
para fazer o gráfico do polígono formado por esses pontos. Por
exemplo, aqui está um "deltoid" verde:
::
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
Digite ``show(p, axes=false)`` para visualizar isso sem os eixos.
Você pode adicionar texto ao gráfico:
::
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)
Professores de cálculo frequentemente desenham o seguinte gráfico na
lousa: não apenas um ramo do arco-seno, mas vários deles: isto é, o
gráfico de :math:`y=\sin(x)` para :math:`x` entre :math:`-2\pi` e
:math:`2\pi`, refletido com respeito a reta :math:`x=y`. Os seguintes
comandos fazem isso:
::
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
Como a função tangente possui imagem maior do que o seno, se você usar
o mesmo método para fazer o gráfico da função inversa da função
tangente, você deve alterar as coordenadas mínima e máxima para o eixo
*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)
O Sage também cria gráficos usando coordenadas polares, gráficos de
contorno e gráficos de campos vetoriais (para tipos especiais de
funções). Aqui está um exemplo de gráfico de contorno:
::
sage: f = lambda x,y: cos(x*y)
sage: contour_plot(f, (-4, 4), (-4, 4))
Graphics object consisting of 1 graphics primitive
Gráficos Tridimensionais
------------------------
O Sage pode ser usado para criar gráficos tridimensionais. Tanto no
Sage Notebook, como no console (linha de comando), esses gráficos serão
exibidos usando o software de código aberto [Jmol]_, que permite girar
e ampliar a figura usando o mouse.
Use ``plot3d`` para criar o gráfico de uma função da forma `f(x, y) =
z`:
::
sage: x, y = var('x,y')
sage: plot3d(x^2 + y^2, (x,-2,2), (y,-2,2))
Graphics3d Object
Alternativamente, você pode usar ``parametric_plot3d`` para criar o
gráfico de uma superfície onde cada coordenada `x, y, z` é determinada
por uma função de uma ou duas variáveis (os parâmetros, tipicamente
`u` e `v`). O gráfico anterior pode ser representado parametricamente
na forma:
::
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
A terceira forma de fazer um gráfico de uma superfície no Sage é
usando o comando ``implicit_plot3d``, que cria um gráfico de uma
superfície definida por uma equação `f(x, y, z) = 0` (isso define um
conjunto de pontos). Vamos fazer o gráfico de uma esfera usando a
expressão usual:
::
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
Aqui estão mais alguns exemplos:
`Yellow Whitney's 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 `__:
::
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
Toro retorcido:
::
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
Lemniscata:
::
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