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:
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
import numpy as np
X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C, S = np.cos(X), np.sin(X)
[/pastacode]
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.
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
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()
[/pastacode]
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).
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
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()
[/pastacode]
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:
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
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="-")
[/pastacode]
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.
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
pl.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi])
pl.yticks([-1, 0, +1])
[/pastacode]
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.
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
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$'])
[/pastacode]
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.
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
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))
[/pastacode]
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:
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
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')
[/pastacode]
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:
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]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"))
[/pastacode]
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.[pastacode lang=”python” message=”” highlight=”” provider=”manual”]for label in ax.get_xticklabels() + ax.get_yticklabels(): label.set_fontsize(16) label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65))
[/pastacode]