Gráficos - Tutorial Sage

Skip to content
Back to top
View this page
Edit this page

# 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 Resolvendo Equações Diferenciais e Maxima, e também a documentação Sage Constructions.

Este comando produz um círculo amarelo de raio 1, centrado na origem.

Sage

    sage: circle((0,0), 1, rgbcolor=(1,1,0))
    Graphics object consisting of 1 graphics primitive

Python

    >>> from sage.all import *
    >>> circle((Integer(0),Integer(0)), Integer(1), rgbcolor=(Integer(1),Integer(1),Integer(0)))
    Graphics object consisting of 1 graphics primitive

Você pode também produzir um círculo preenchido:

Sage

    sage: circle((0,0), 1, rgbcolor=(1,1,0), fill=True)
    Graphics object consisting of 1 graphics primitive

[Python]

    >>> from sage.all import *
    >>> circle((Integer(0),Integer(0)), Integer(1), rgbcolor=(Integer(1),Integer(1),Integer(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

    sage: c = circle((0,0), 1, rgbcolor=(1,1,0))

Python

    >>> from sage.all import *
    >>> c = circle((Integer(0),Integer(0)), Integer(1), rgbcolor=(Integer(1),Integer(1),Integer(0)))

Para criar o gráfico, use `c.show()` ou `show(c)`, da seguinte forma:

Sage

    sage: c.show()

[Python]

    >>> from sage.all import *
    >>> 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:

Sage

    sage: c.show(aspect_ratio=1)

Python

    >>> from sage.all import *
    >>> c.show(aspect_ratio=Integer(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

    sage: plot(cos, (-5,5))
    Graphics object consisting of 1 graphics primitive

[Python]

    >>> from sage.all import *
    >>> plot(cos, (-Integer(5),Integer(5)))
    Graphics object consisting of 1 graphics primitive

Após especificar uma variável, você também pode criar gráficos paramétricos:

Sage

    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

Python

    >>> from sage.all import *
    >>> x = var('x')
    >>> parametric_plot((cos(x),sin(x)**Integer(3)),(x,Integer(0),Integer(2)*pi),rgbcolor=hue(RealNumber('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

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

[Python]

    >>> from sage.all import *
    >>> plot(x**Integer(2),(x,Integer(300),Integer(500)))
    Graphics object consisting of 1 graphics primitive

Você pode combinar vários gráficos somando-os:

Sage

    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)

Python

    >>> from sage.all import *
    >>> x = var('x')
    >>> p1 = parametric_plot((cos(x),sin(x)),(x,Integer(0),Integer(2)*pi),rgbcolor=hue(RealNumber('0.2')))
    >>> p2 = parametric_plot((cos(x),sin(x)**Integer(2)),(x,Integer(0),Integer(2)*pi),rgbcolor=hue(RealNumber('0.4')))
    >>> p3 = parametric_plot((cos(x),sin(x)**Integer(3)),(x,Integer(0),Integer(2)*pi),rgbcolor=hue(RealNumber('0.6')))
    >>> 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

    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

[Python]

    >>> from sage.all import *
    >>> L = [[-Integer(1)+cos(pi*i/Integer(100))*(Integer(1)+cos(pi*i/Integer(100))),
    ... Integer(2)*sin(pi*i/Integer(100))*(Integer(1)-cos(pi*i/Integer(100)))] for i in range(Integer(200))]
    >>> p = polygon(L, rgbcolor=(Integer(1)/Integer(8),Integer(3)/Integer(4),Integer(1)/Integer(2)))
    >>> 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

    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)

Python

    >>> from sage.all import *
    >>> L = [[Integer(6)*cos(pi*i/Integer(100))+Integer(5)*cos((Integer(6)/Integer(2))*pi*i/Integer(100)),
    ... Integer(6)*sin(pi*i/Integer(100))-Integer(5)*sin((Integer(6)/Integer(2))*pi*i/Integer(100))] for i in range(Integer(200))]
    >>> p = polygon(L, rgbcolor=(Integer(1)/Integer(8),Integer(1)/Integer(4),Integer(1)/Integer(2)))
    >>> t = text("hypotrochoid", (Integer(5),Integer(4)), rgbcolor=(Integer(1),Integer(0),Integer(0)))
    >>> 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 \(y=\sin(x)\) para \(x\) entre \(-2\pi\) e \(2\pi\), refletido com respeito a reta \(x=y\). Os seguintes comandos fazem isso:

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

[Python]

    >>> from sage.all import *
    >>> v = [(sin(x),x) for x in srange(-Integer(2)*float(pi),Integer(2)*float(pi),RealNumber('0.1'))]
    >>> 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

    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)

Python

    >>> from sage.all import *
    >>> v = [(tan(x),x) for x in srange(-Integer(2)*float(pi),Integer(2)*float(pi),RealNumber('0.01'))]
    >>> show(line(v), xmin=-Integer(20), xmax=Integer(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

    sage: f = lambda x,y: cos(x*y)
    sage: contour_plot(f, (-4, 4), (-4, 4))
    Graphics object consisting of 1 graphics primitive

[Python]

    >>> from sage.all import *
    >>> f = lambda x,y: cos(x*y)
    >>> contour_plot(f, (-Integer(4), Integer(4)), (-Integer(4), Integer(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 [ThreeJS], 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

    sage: x, y = var('x,y')
    sage: plot3d(x^2 + y^2, (x,-2,2), (y,-2,2))
    Graphics3d Object

Python

    >>> from sage.all import *
    >>> x, y = var('x,y')
    >>> plot3d(x**Integer(2) + y**Integer(2), (x,-Integer(2),Integer(2)), (y,-Integer(2),Integer(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

    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

[Python]

    >>> from sage.all import *
    >>> u, v = var('u, v')
    >>> __tmp__=var("u,v"); f_x = symbolic_expression(u).function(u,v)
    >>> __tmp__=var("u,v"); f_y = symbolic_expression(v).function(u,v)
    >>> __tmp__=var("u,v"); f_z = symbolic_expression(u**Integer(2) + v**Integer(2)).function(u,v)
    >>> parametric_plot3d([f_x, f_y, f_z], (u, -Integer(2), Integer(2)), (v, -Integer(2), Integer(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

    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

Python

    >>> from sage.all import *
    >>> x, y, z = var('x, y, z')
    >>> implicit_plot3d(x**Integer(2) + y**Integer(2) + z**Integer(2) - Integer(4), (x,-Integer(2), Integer(2)), (y,-Integer(2), Integer(2)), (z,-Integer(2), Integer(2)))
    Graphics3d Object

Aqui estão mais alguns exemplos:

Yellow Whitney’s umbrella:

Sage

    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

[Python]

    >>> from sage.all import *
    >>> u, v = var('u,v')
    >>> fx = u*v
    >>> fy = u
    >>> fz = v**Integer(2)
    >>> parametric_plot3d([fx, fy, fz], (u, -Integer(1), Integer(1)), (v, -Integer(1), Integer(1)),
    ... frame=False, color="yellow")
    Graphics3d Object

Cross cap:

Sage

    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

Python

    >>> from sage.all import *
    >>> u, v = var('u,v')
    >>> fx = (Integer(1)+cos(v))*cos(u)
    >>> fy = (Integer(1)+cos(v))*sin(u)
    >>> fz = -tanh((Integer(2)/Integer(3))*(u-pi))*sin(v)
    >>> parametric_plot3d([fx, fy, fz], (u, Integer(0), Integer(2)*pi), (v, Integer(0), Integer(2)*pi),
    ... frame=False, color="red")
    Graphics3d Object

Toro retorcido:

Sage

    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

[Python]

    >>> from sage.all import *
    >>> u, v = var('u,v')
    >>> fx = (Integer(3)+sin(v)+cos(u))*cos(Integer(2)*v)
    >>> fy = (Integer(3)+sin(v)+cos(u))*sin(Integer(2)*v)
    >>> fz = sin(u)+Integer(2)*cos(v)
    >>> parametric_plot3d([fx, fy, fz], (u, Integer(0), Integer(2)*pi), (v, Integer(0), Integer(2)*pi),
    ... frame=False, color="red")
    Graphics3d Object

Lemniscata:

Sage

    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

Python

    >>> from sage.all import *
    >>> x, y, z = var('x,y,z')
    >>> __tmp__=var("x,y,z"); f = symbolic_expression(Integer(4)*x**Integer(2) * (x**Integer(2) + y**Integer(2) + z**Integer(2) + z) + y**Integer(2) * (y**Integer(2) + z**Integer(2) - Integer(1))).function(x,y,z)
    >>> implicit_plot3d(f, (x, -RealNumber('0.5'), RealNumber('0.5')), (y, -Integer(1), Integer(1)), (z, -Integer(1), Integer(1)))
    Graphics3d Object