Mudanças entre as edições de "Ipython tutoria 2012"
(→Matplotlib) |
(→Matplotlib) |
||
Linha 43: | Linha 43: | ||
== Matplotlib == | == Matplotlib == | ||
− | Essa biblioteca é usada para construir gráficos em 2D (histogramas, funções em geral, espectros, entre outros). Veremos também como criar | + | Essa biblioteca é usada para construir gráficos em 2D (histogramas, funções em geral, espectros, entre outros). Veremos também como criar e plotar funções com textos em LaTeX nos gráficos. Os módulos básicos são os seguintes: |
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
Linha 49: | Linha 49: | ||
import numpy as np | import numpy as np | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
===== Plotar um conjunto de pontos qualquer ===== | ===== Plotar um conjunto de pontos qualquer ===== | ||
Linha 82: | Linha 56: | ||
Em python, nosso conjunto de pontos serão dados por arrays. Vamos chamá-los de x e y | Em python, nosso conjunto de pontos serão dados por arrays. Vamos chamá-los de x e y | ||
− | < | + | <syntaxhighlight lang="python"> |
− | + | x=np.array([1,2,3,3,7,6,7,8,9]) | |
− | + | y=np.array([9,8,7,6,5,4,3,2,1]) | |
− | </ | + | plt.plot(x,y) # A ordem dos parâmetros é a mesma usada na matemática (abscissa, ordenada) |
− | + | </syntaxhighlight> | |
− | <pre> | + | <pre>[<matplotlib.lines.Line2D at 0x4381ad0>] |
− | + | ||
</pre> | </pre> | ||
Linha 95: | Linha 68: | ||
[[Image:WIKI___MATPLOTLIB_fig_00.png|frame|none]] | [[Image:WIKI___MATPLOTLIB_fig_00.png|frame|none]] | ||
− | Antes de | + | Antes de editar o gráfico vamos aprender a definir funções. |
===== Funções ===== | ===== Funções ===== |
Edição das 16h51min de 8 de janeiro de 2013
Conteúdo[ocultar] |
Introdução
Em abril de 2012, Cleve Moler, recebeu o prêmio Pioneiros da Computação do IEEE. Ele é o criador do programa MATLAB, um ambiente de programação numérica que revolucionou a idéia de programação e simulação, principalmente nas áreas aplicadas de engenharia, biologia e economia. O programa é um produto comercializado pela empresa Mathworks que também é presidida por Cleve Moler, e o pacote completo do software é bastante caro! Existem algumas alternativas similares ao MATLAB com código aberto. Os mais populares são os programas SCILAB e OCTAVE. O objetivo deste texto é apresentar uma outra alternativa interessante que é um ambiente chamado Ipython.
Python é uma linguagem de programação genérica de código livre. Uma das características desta linguagem é que possui um console que executa comandos assim que teclamos ENTER. Este console original do Python tem poucos recursos de edição. Por exemplo, não há histórico dos comandos já digitados. O Ipython é um console do Python enriquecido com muitos novos recursos de edição, além de naturalmente acoplar outros módulos científicos do Python (NumPy, Scipy, SymPy e Matplotlib), o resultado é um ambiente muito parecido com o MATLAB (eventualmente mais lento para programas pesados), com a vantagem de dispor do desenvolvimento de Software Livre. Em particular estamos interessados em mostrar como a utilização deste software pode acompanhar o aprendizado de Cálculo Diferencial e Integral do primeiro ano. (P. A. Tonelli) 18h20min de 24 de julho de 2012 (BRT)
Instalação do Ipython
Em todos os sistemas operacionais a instalação do Ipython depende da instalação do Python. A forma mais fácil é instalar como uma distribuição em pacote. No sistema operacional windows, a forma mais fácil é instalar o Pythonxy. Este pacote vem com um conjunto de aplicativos direcionados à computação científica, inclusive o Ipython. Não é a última versão, mas é uma forma de rápida instalação.
Nos sistemas derivados do Debian linux também existem pacotes para o Ipython (Ipython, Ipython-Qt, Ipython-notebook, pode instalar todos!).
sudo apt-get install ipyhton ipython-qt ipython-notebook
Atualização dos programas
Quer você tenha instalado o Pythonxy, quer os pacotes das distribuições em Linux, é muito difícil que os programas Ipython e outros módulos usados pelo Ipython estejam atualizados. Vamos explicar como atualizar o pythonxy.
Atualização no Windows uma vez instalado o PyhtonXY
1. Na versão mais recente o PythonXY deve ter instalado um módulo chamado distribute. Abra o console do Windows e digite
pip install --upgrade spyder
Isto atualiza o editor Spyder
2. Instale o programa pyzmq deste site do pyzmq
3. Para a nova versão do Ipython digite no console do windows
pip install --upgrade ipython[zmq,qtconsole,notebook,test]
4. Tornado para o notebook
pip install tornado
5. Será bom atualizar também o matplotlib e scipy
pip install --upgrade matplotlib pip install --upgrade scipy
Com isto você terá o seu ambiente de programação. E pode começar a testá-lo digitando no console
ipython notebook --pylab inline
Usando a Biblioteca Matplotlib
Matplotlib
Essa biblioteca é usada para construir gráficos em 2D (histogramas, funções em geral, espectros, entre outros). Veremos também como criar e plotar funções com textos em LaTeX nos gráficos. Os módulos básicos são os seguintes:
import matplotlib.pyplot as pl import numpy as np
Plotar um conjunto de pontos qualquer
Supondo dois conjunto de pontos com a mesma quantidade de elementos. Podemos estabelecer uma relação entre eles construindo um gráfico em um plano cartesiano.
Em python, nosso conjunto de pontos serão dados por arrays. Vamos chamá-los de x e y
x=np.array([1,2,3,3,7,6,7,8,9]) y=np.array([9,8,7,6,5,4,3,2,1]) plt.plot(x,y) # A ordem dos parâmetros é a mesma usada na matemática (abscissa, ordenada)
[<matplotlib.lines.Line2D at 0x4381ad0>]
Antes de editar o gráfico vamos aprender a definir funções.
Funções
Há duas formas de definir uma função:
- comando def
- comando lambda
exemplo - def:
<span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
<span class="sd">"""Calcula o valor de 1/x para x diferente de 0"""</span> <span class="c"># docstring - Explica brevemente o que a função retorna</span>
<span class="k">return</span> <span class="n">x</span><span class="o">*</span><span class="n">x</span>
exemplo - lambda:
<span class="n">g</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span> <span class="p">:</span> <span class="n">x</span><span class="o">**</span><span class="n">x</span> <span class="c"># '**' potência</span>
<span class="n">help</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
Help on function f in module __main__: f(x) Calcula o valor de 1/x para x diferente de 0
Editar gráficos - Títulos / legendas / textos.
Podemos atribuir nomes para o gráfico, ordenada / abscissa ou um ponto qualquer. O LaTeX pode ser usado para os textos.
Vamos usar a função f(x), definida anteriormente, para aprender os próximos passos
<span class="c"># Conjunto de pontos - Podemos criar intervalos com a função linspace()</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">linspace</span><span class="p">(</span><span class="o">-</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">1000</span><span class="p">)</span> <span class="c"># O intervalo [-5,5] foi dividido em 1000 pontos</span>
<span class="c"># Título - Atenção nos parâmetros para ajustar o texto(fonte e posição)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">'$f(x)$'</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">19</span><span class="p">,</span> <span class="n">verticalalignment</span> <span class="o">=</span> <span class="s">'baseline'</span><span class="p">,</span> <span class="n">horizontalalignment</span> <span class="o">=</span> <span class="s">'center'</span><span class="p">)</span>
<span class="c"># Nome nos eixos - Podemos usar os mesmos parâmetros para ajustar os textos nos comandos abaixo</span>
<span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s">'$X$'</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">20</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s">'$Y$'</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">20</span><span class="p">,</span> <span class="n">rotation</span> <span class="o">=</span> <span class="s">'horizontal'</span><span class="p">)</span> <span class="c"># Atenção no parâmetro para rotacionar o texto no eixo Y</span>
<span class="c"># Para plotar texto em pontos específicos do gráfico usamos text().</span>
<span class="n">plt</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="s">'$f(2)$'</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">14</span><span class="p">)</span> <span class="c"># Atenção nas coordenadas!</span>
<span class="c"># Tipo/cor/legenda - A cor e o tipo de linha podem ser alterados. Para ver todas as opções você pode usar o comando 'help(plot)'</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">t</span><span class="p">,</span><span class="n">f</span><span class="p">(</span><span class="n">t</span><span class="p">),</span> <span class="s">'g'</span><span class="p">,</span> <span class="n">label</span> <span class="o">=</span> <span class="s">'f(x)'</span><span class="p">)</span>
<span class="n">legend</span><span class="p">(</span><span class="n">loc</span> <span class="o">=</span> <span class="mi">4</span><span class="p">)</span> <span class="c"># 'loc' muda o local da legenda. Pode variar de 0 à 10</span>
<span class="c"># Para plotar linhas nos eixos podemos usar 'grid()'</span>
<span class="n">grid</span><span class="p">()</span>
<span class="c"># Alterar o tamanho dos eixos</span>
<span class="n">axex</span> <span class="o">=</span> <span class="n">xlim</span><span class="p">(</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
<span class="n">axey</span> <span class="o">=</span> <span class="n">ylim</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span>
Histograma
Para facilitar, usando o comando normal(), vamos criar um conjunto de elementos dristribuídos segundo a distribuição normal.
<span class="n">n</span> <span class="o">=</span> <span class="n">normal</span><span class="p">(</span><span class="n">size</span> <span class="o">=</span> <span class="mi">1000</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">hist</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s">'Valor'</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">17</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s">'Frequencia'</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">17</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">'Histograma'</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">17</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
Podemos alterar o números de intervalos de classe usando o parâmetro 'bins'
<span class="n">plt</span><span class="o">.</span><span class="n">hist</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">bins</span> <span class="o">=</span> <span class="mi">20</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s">'Valor'</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">17</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s">'Frequencia'</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">17</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">'Histograma'</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">17</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
Usando o parâmetro 'alpha' da função 'hist()' podemos sobrepor gráficos. Para exemplificar vamos usar a distribuição uniforme.
<span class="n">u</span> <span class="o">=</span> <span class="n">uniform</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">size</span> <span class="o">=</span> <span class="mi">1000</span><span class="p">)</span>
<span class="c">#Atenção nos parâmetros 'histtype' e 'alpha'. 'histtype' altera o visual do gráfico</span>
<span class="n">plt</span><span class="o">.</span><span class="n">hist</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">bins</span> <span class="o">=</span> <span class="mi">20</span><span class="p">,</span> <span class="n">histtype</span> <span class="o">=</span> <span class="s">'stepfilled'</span><span class="p">,</span> <span class="n">color</span> <span class="o">=</span> <span class="s">'g'</span><span class="p">,</span> <span class="n">label</span> <span class="o">=</span> <span class="s">'normal'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">hist</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">bins</span> <span class="o">=</span> <span class="mi">20</span><span class="p">,</span> <span class="n">histtype</span> <span class="o">=</span> <span class="s">'stepfilled'</span><span class="p">,</span> <span class="n">color</span> <span class="o">=</span> <span class="s">'r'</span><span class="p">,</span> <span class="n">label</span> <span class="o">=</span> <span class="s">'uniforme'</span><span class="p">,</span> <span class="n">alpha</span> <span class="o">=</span> <span class="mf">0.5</span><span class="p">)</span> <span class="c"># Plot com 50% de transparência</span>
<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s">'Normal \ Uniforme'</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">17</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s">'valor'</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">17</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s">'Frequencia'</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">17</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>