<jupyter_start><jupyter_text>Computação Aplicada A Ciência e Engenharia Introdução à Linguagem Python (Aula 04-B) Conteúdo1. Plotagem básica2. Plotagem com múltiplos eixos3. Personalização4. Barras de erros5. Importação de dados6. Histogramas  Plotagem em Múltiplos Eixos<jupyter_code>import numpy as np
import matplotlib.pyplot as plt

def func_1(xis, *arg):
    arg = arg[0:3]
    yps = arg[0]*xis**2 + arg[1]*xis + arg[2]
    return yps

xis = np.linspace(-50,50,15)

yps1 = func_1(xis, 7,8,9)
yps2 = func_1(xis, 1,1,0)

plt.plot(xis,yps1, '-mo',  label ='a=7, b=8, c=9')
plt.plot(xis,yps2, '-cx', label = 'a=1, b=1, c=1')
plt.legend()
plt.xlabel('Eixo X (unidade)')
plt.ylabel('Eixo Y (unidade)')
plt.title('Título do Gráfico')
plt.grid()
plt.show()<jupyter_output><empty_output><jupyter_text>As linhas abaixo promoveram a plotagem em um único eixo o que pode não ser o interesse do usuário.<jupyter_code>plt.plot(xis,yps1, '-o',  label ='a=7, b=8, c=9')
plt.plot(xis,yps2, '-x', label = 'a=1, b=1, c=1')<jupyter_output><empty_output><jupyter_text>Suponhamos que o usuário queira que as cada gráfico esteja plotado em eixos diferentes e que estes estejam organizados lado a lado, então a função `subplot()` do pyplot precisa ser utilizada. A função recebe três parâmetros `plt.subplot(p1, p2, p3)` conforme pode ser visto. Estes parâmetros definem a matriz plotagem dos eixos. A matriz de plotagem é o esquema organizacional da figura que conterá os eixos. No caso de uma plotagem de dois eixos postados lateralmente a matriz deverá ter uma linha e duas colunas, portanto 2 elementos, no caso de uma plotagem de 3 eixos, eles podem estar organizados em uma matriz de três linhas e uma coluna - 3 elemntos - ou em uma matriz do tipo 2x2 que conterá uma célula vazia.Os parâmetros têm as seguintes funções:1. O primeiro parâmetro `p1` determina o número de linhas da matriz de plotagem. 2. Os parâmetros `p2` determina o número de colunas da matriz de plotagem. 3. O parâmetro `p3` determina a posição dos eixos na matriz contanda horizontalmenteObserve o código abaixo.<jupyter_code>import numpy as np
import matplotlib.pyplot as plt

def func_1(xis, *arg):
    arg = arg[0:3]
    yps = arg[0]*xis**2 + arg[1]*xis + arg[2]
    return yps

xis = np.linspace(-50,50,15)

yps1 = func_1(xis, 7,8,9)
yps2 = func_1(xis, -1,1,0)

plt.subplot(1,2,1) #Matriz 1x2 posição 1
plt.plot(xis,yps1, '-go',  label ='a=7, b=8, c=9')
plt.legend()
plt.xlabel('Eixo X (unidade)')
plt.ylabel('Eixo Y (unidade)')
plt.title('Título do Gráfico')
plt.grid()

plt.subplot(1,2,2) #Matriz 1x2 posição 2
plt.plot(xis,yps2, '-x', label = 'a=1, b=1, c=1')
plt.legend()
plt.xlabel('Eixo X (unidade)')
plt.ylabel('Eixo Y (unidade)')
plt.title('Título do Gráfico')
plt.grid()

plt.show()<jupyter_output><empty_output><jupyter_text>Atividade  1Crie quatro gráficos em matrizes de plotagem dos tipo 1x4, 4x1 e 2x2. Os gráficos devem conter funções de grau 3,5,7 e 11, com parâmetros unitários.   Personalização   Para a seleção de marcores basta substituir nas strings de controle de estilo (terceiro parâmetro da função plot) quaisquer um dos marcadores postrados na figura abaixo.<jupyter_code>import numpy as np
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D


points = np.ones(3)  # Draw 3 points for each line
text_style = dict(horizontalalignment='right', verticalalignment='center',
                  fontsize=12, fontdict={'family': 'monospace'})
marker_style = dict(linestyle=':', color='0.8', markersize=10,
                    mfc="C0", mec="C0")


def format_axes(ax):
    ax.margins(0.2)
    ax.set_axis_off()
    ax.invert_yaxis()


def nice_repr(text):
    return repr(text).lstrip('u')


def math_repr(text):
    tx = repr(text).lstrip('u').strip("'").strip("$")
    return r"'\${}\$'".format(tx)


def split_list(a_list):
    i_half = len(a_list) // 2
    return (a_list[:i_half], a_list[i_half:])

fig, axes = plt.subplots(ncols=2)
fig.suptitle('un-filled markers', fontsize=14)

# Filter out filled markers and marker settings that do nothing.
unfilled_markers = [m for m, func in Line2D.markers.items()
                    if func != 'nothing' and m not in Line2D.filled_markers]

for ax, markers in zip(axes, split_list(unfilled_markers)):
    for y, marker in enumerate(markers):
        ax.text(-0.5, y, nice_repr(marker), **text_style)
        ax.plot(y * points, marker=marker, **marker_style)
        format_axes(ax)

plt.show()
fig, axes = plt.subplots(ncols=2)
for ax, markers in zip(axes, split_list(Line2D.filled_markers)):
    for y, marker in enumerate(markers):
        ax.text(-0.5, y, nice_repr(marker), **text_style)
        ax.plot(y * points, marker=marker, **marker_style)
        format_axes(ax)
fig.suptitle('filled markers', fontsize=14)

plt.show()<jupyter_output><empty_output><jupyter_text>Para a seleção de cores dos gráficos basta adicionar na string de controle os caracteres de seleção de cor.- b : blue- g : green- r : red- c : cyan- m : magenta- y : yellow- k : black- w : whiteTodavia o pyplot é capaz de fazer a seleção automática segundo um algorítimo de otimização de contraste. Particularmente recomendo que a seleção de cores seja destinada ao próprio pyplot.<jupyter_code>import numpy as np
import matplotlib.pyplot as plt

def func_1(xis, *arg):
    arg = arg[0:3]
    yps = arg[0]*xis**2 + arg[1]*xis + arg[2]
    return yps

xis = np.linspace(-50,50,15)

yps1 = func_1(xis, 7,8,9)
yps2 = func_1(xis, -1,1,0)

plt.subplot(1,2,1) #Matriz 1x2 posição 1
plt.plot(xis,yps1, '-gv',  label ='a=7, b=8, c=9')
plt.legend()
plt.xlabel('Eixo X (unidade)')
plt.ylabel('Eixo Y (unidade)')
plt.title('Título do Gráfico')
plt.grid()

plt.subplot(1,2,2) #Matriz 1x2 posição 2
plt.plot(xis,yps2, '-rd', label = 'a=1, b=1, c=1')
plt.legend()
plt.xlabel('Eixo X (unidade)')
plt.ylabel('Eixo Y (unidade)')
plt.title('Título do Gráfico')
plt.grid()

plt.show()<jupyter_output><empty_output><jupyter_text>Atividade 2 Personalize os quadros gráficos anteriores modificando suas cores e marcadores, conforme sua preferência.  Inserindo Barras de Erros  Uma barra de erro nada mais é que um gráfico sobreposto à plotagem propriamente dita, portanto, para construí-las, basta utilizar a função `errorbar(xis, yps, xerr=value, yerr = value, capsize = value)`. Vejamos como fica para um dos gráficos mostrados anteriormente.<jupyter_code>import numpy as np
import matplotlib.pyplot as plt

def func_1(xis, *arg):
    arg = arg[0:3]
    yps = arg[0]*xis**2 + arg[1]*xis + arg[2]
    return yps

xis = np.linspace(-50,50,15)

yps1 = func_1(xis, 7,8,9)
yps2 = func_1(xis, -1,1,0)

plt.plot(xis,yps1, '-g.',  label ='a=7, b=8, c=9')
plt.errorbar(xis, yps1, xerr=xis/10, yerr = yps1/10,   capsize=3)
plt.legend()
plt.xlabel('Eixo X (unidade)')
plt.ylabel('Eixo Y (unidade)')
plt.title('Título do Gráfico')
plt.grid()<jupyter_output><empty_output><jupyter_text>O parâmetro `capsize` é opcional e é utilizado para determinar quantos pixels de largura deverá ter o delimitador superior e inferior da barra de erros.  Atividade 3 Crie um único plano que contenha as quatro funções anteriores. Os marcadores de cada curva devem mostrar uma barra de erro na direção de y. Os erros de cada marcador devem ser determinados como a distância absoluta entre o valor de yi do marcador e a média de todos os outros marcoadores que têm o mesmo valor de x. Ou seja, o erro de um valor y1, por exemplo, deve ser determinado por:yerr = y1(x) - ((y1(x) + y2(x) + y3(x) + y4(x))/4)  Abrindo arquivos de Dados e Plotando Histogramas  Suponha que tenha sido feita uma contagem qualquer e que estes valores precisem ser mostrados para se perscrutar o perfil de sua distribuição. Análises desta natureza, permitem que o comportamento global de um fenômeno aleatório seja previsto com base em uma amostra colida aleatoriamente. Para realizar tal análise é necessário que se construa o histograma de tais valores.  Suponha ainda que os dados provenientes da contagem estejam contidos em um arquivo denominado *dados.dat*, este arquivo deve ser endereçado à memória pelo Python e então tratado matematicamente. Vejamos como fazê-lo.<jupyter_code>import numpy as np 

#Abertura do arquivo
dados = np.loadtxt('dados.dat')
print(dados)<jupyter_output>[115.10527924 107.09994642  89.91017284 ...  87.71038701 114.44697529
  89.82476312]<jupyter_text>Agora a variável `dados` contém um vetor do numpy com os dados a serem analizados. Vejamos como manipulá-los:<jupyter_code>media = np.mean(dados) #Determinação da média dos valores
print(media)
des_pad = np.std(dados) #Determinação do desvio padrão
print(des_pad)
import matplotlib.pyplot as plt

plt.hist(dados, bins='auto')
plt.xlabel('Temperatura ºC')
plt.ylabel('Frequência')
plt.show()<jupyter_output><empty_output><jupyter_text>Caso deseje que a frequência seja normalizada, então basta modificar o código acima para a forma:<jupyter_code>plt.hist(dados, density=1, bins='auto')
plt.xlabel('Valor')
plt.ylabel('Frequência Relativa')
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11681828267140004, 'fraction_numerical': 0.0325049922343022, 'mean_word_length': 4.775144138372838, 'pattern_counts': {'":': 0, '<': 36, '<?xml version=': 0, '>': 36, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '111291', 'license': 'MIT', 'n_tokens_mistral': 3704, 'n_tokens_neox': 3567, 'n_words': 1049, 'path': 'Aula04/.ipynb_checkpoints/Aula04B-checkpoint.ipynb', 'repo_name': 'ProfLeao/ProgramacaoParaCienciaEEngenhariaComPython3', 'size': '9014'}