3.1. Plotagem Simples

Home  >>  Disciplinas  >>  Pós-graduação  >>  Introdução à Computação Científica  >>  Introdução  >>  3.1. Plotagem Simples

Nesta seção, queremos chamar a funções seno e co-seno no mesmo gráfico. A partir das configurações padrão, vamos enriquecer a figura passo a passo para torná-lo mais agradável.

O primeiro passo é obter os dados para as funções seno e cosseno:

import numpy as np

X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C, S = np.cos(X), np.sin(X)

x é agora um array numpy com 256 valores variando de -π até +π (inclusos). c é o cosseno (256 valores) e s é o seno (256 valores).

Utilizando os padrões

Documentação utilizada nessa seção:

Matplotlib vem com um conjunto de configurações padrão que permitem a personalização de todos os tipos de propriedades. Você pode controlar os padrões de quase todos as propriedades no matplotlib: Tamanho da figura e dpi, largura de linha, cor e estilo, eixos, propriedades de eixos e grade, texto e fonte e assim por diante.

cosseno

import pylab as pl
import numpy as np

X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C, S = np.cos(X), np.sin(X)

pl.plot(X, C)
pl.plot(X, S)

pl.show()

Instanciando os padrões

Documentação da seção:

No script abaixo, temos instanciado (e comentado) todas as configurações da figura que influenciam o aparecimento do gráfico. As configurações foram explicitamente definidas para seus valores padrão, mas pode-se jogar de forma interativa com os valores para explorar seu efeito (ver propriedades de linha e estilos de linha abaixo).

import pylab as pl
import numpy as np

# Cria uma figura de tamanho 8x6 pontos, 80 pontos por polegada
pl.figure(figsize=(8, 6), dpi=80)

# Cria uma nova subplotagem a partir de um grid de 1x1
pl.subplot(1, 1, 1)

X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C, S = np.cos(X), np.sin(X)

# Plota o cosseno com uma linha azul e contínua de espessura 1 (pixels)
pl.plot(X, C, color="blue", linewidth=1.0, linestyle="-")

# Plota o seno com uma linha verde e contínua de espessura 1 (pixels)
pl.plot(X, S, color="green", linewidth=1.0, linestyle="-")

# Define os limites em x
pl.xlim(-4.0, 4.0)

# Define as marcas em x
pl.xticks(np.linspace(-4, 4, 9, endpoint=True))

# Define os limites em y
pl.ylim(-1.0, 1.0)

# Define as marcas em y
pl.yticks(np.linspace(-1, 1, 5, endpoint=True))

# Salva a figura usando 72 pontos por polegada
# savefig("sencos.png", dpi=72)

# Mostra o resultado na tela
pl.show()

Modificando-se as cores e a espessura das linhas

Documentação dessa seção:

O primeiro, nós queremos ter o cosseno em azul e o seno em vermelho e uma linha um pouco  mais grossa para ambos. Nós vamos também alterar ligeiramente o tamanho da figura para torná-la mais horizontal. Os comandos a serem modificados são:

cosseno1

pl.figure(figsize=(10, 6), dpi=80)
pl.plot(X, C, color="blue", linewidth=2.5, linestyle="-")
pl.plot(X, S, color="red",  linewidth=2.5, linestyle="-")

Definindo os limites

Documentação da seção:

Marcadores atuais não são ideais porque eles não mostram os valores interessantes (+ /-π, + /-π / 2) para o seno e cosseno. Vamos mudá-los de tal forma que eles mostrem apenas esses valores.

cosseno2

pl.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi])
pl.yticks([-1, 0, +1])

Definindo os valores dos marcadores

Documentação:

Marcadores estão agora devidamente colocados, mas os valores não são muito explícitos. Poderíamos supor que 3.142 é π, mas seria melhor torná-lo explícito. Quando colocamos os valores de marcadores, também podemos fornecer um rótulo correspondente na segunda lista de argumentos. Note que vamos usar latex para permitir o bom processamento dos valores.

cosseno3
pl.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
          [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])

pl.yticks([-1, 0, +1],
          [r'$-1$', r'$0$', r'$+1$'])

Movendo os eixos secundários

Documentação:

Eixos secundários (spines) são as linhas que ligam as marcas de escala do eixo principal, observando os limites da área de dados. Eles podem ser colocados em posições arbitrárias e até agora, eles estavam na borda dos eixos. Vamos mudar isso, já que queremos tê-los no meio. Uma vez que existem quatro deles (superior / inferior / esquerda / direita), vamos descartar a cima e à direita, definindo a cor como nenhuma e vamos mover o fundo e esquerdos para a coordenada 0. Acrescente o código abaixo antes de de definir os marcadores.

cosseno4
ax = pl.gca()  # gca significa 'get current axis'
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

Adicionando uma legenda

Documentação:

Vamos adicionar uma legenda no canto superior esquerdo. Isto só requer a adição do argumento palavra chave valores (que será utilizado na caixa de legenda) para os comandos de plotagem. Substitua os pl.plot pelos abaixo e acrescente na sequencia o pl.legend conforme código abaixo:

cosseno5
pl.plot(X, C, color="blue", linewidth=2.5, linestyle="-", label="cosine")
pl.plot(X, S, color="red",  linewidth=2.5, linestyle="-", label="sine")

pl.legend(loc='upper left')

Anotando em alguns pontos

Documentação:

Vamos anotar alguns pontos interessantes usando o comando annotate. Nós escolhemos o valor 2π / 3 e queremos anotar tanto o seno e cosseno. Vamos primeiro desenhar um marcador na curva, bem como uma linha pontilhada em linha reta. Então, vamos usar o comando anotar para exibir um texto com uma seta. Acrescente o código abaixo:

cosseno6
t = 2 * np.pi / 3
pl.plot([t, t], [0, np.cos(t)], color='blue', linewidth=2.5, linestyle="--")
pl.scatter([t, ], [np.cos(t), ], 50, color='blue')

pl.annotate(r'$sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
            xy=(t, np.sin(t)), xycoords='data',
            xytext=(+10, +30), textcoords='offset points', fontsize=16,
            arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

pl.plot([t, t],[0, np.sin(t)], color='red', linewidth=2.5, linestyle="--")
pl.scatter([t, ],[np.sin(t), ], 50, color='red')

pl.annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',
            xy=(t, np.cos(t)), xycoords='data',
            xytext=(-90, -50), textcoords='offset points', fontsize=16,
            arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

Mais detalhes

Documentação:

Os valores dos marcadores são agora pouco visível por causa das linhas azul e vermelha. Podemos torná-los maiores e também podemos ajustar as suas propriedades de tal forma que eles vão ser processados ​​em um fundo branco semi-transparente. Isto irá permitirá vê-los melhor.
cosseno7
for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(16)
    label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65))