O histograma (também conhecido como distribuição de frequências) é a representação gráfica em colunas ou em barras (retângulos) de um conjunto de dados previamente tabulado e dividido em classes. A base de cada retângulo representa uma classe, enquanto que a altura de cada um representa a quantidade ou a frequência absoluta com que o valor da classe ocorre no conjunto de dados, para classes uniformes, ou a densidade de frequência, para classes não uniformes.
A biblioteca “matplotlib” do python permite montar facilmente um histograma, para imprimir na tela ou salvar como um arquivo de imagem. Ele é chamado pelo método “hist“, que recebe os dados como entrada e outros parâmetros. Para a leitura de dados de um arquivo CSV (colunas separadas por vírgula), a biblioteca “pandas” permite ler e gravar na memória uma planilha com as informações desse arquivo. Para cálculos matemáticos e outras funções, existe a biblioteca “numpy”.
O script a seguir carrega essas bibliotecas, faz a leitura do arquivo e chama a função para fazer o histograma. Como argumentos da função “histogram()”, estão o tipo de histograma, um vetor de dados, o nome da variável (a ser impresso no rótulo do eixo x) e uma variável extra (pode ser o nome do lugar ou outra informação para especificar o conjunto de dados, a ser impressa no título e no nome do arquivo).
Com relação aos tipos do histograma, uma das opções é fixar o tamanho dos bins (‘fixed_bin_size’), por exemplo todos os bins de largura 5 (definido na variável “bin_size = 5”). Outra opção é fixar o número de bins (‘fixed_number_bins’), por exemplo definindo como 30 bins, independente da largura que o algoritmo escolha (definido na variável “n_bins = 30”). No caso de não especificar os bins, ele será definido pelo método de Freedman-Diaconis.
#!/usr/bin/env python3.7.5 # -*- Coding: UTF-8 -*- # Import modules import numpy as np import pandas as pd import matplotlib.pyplot as plt # Define functions def histogram(type_hist, data, varname, place): """ Plot histogram from given list values. Histogram types: fixed_bin_size or fixed_number_bins """ title = 'Histograma - %s' %place figname = 'hist_%s.png' %place text = 'média = %.2f\nmáximo = %.2f' % (data.mean(), max(data)) n_bins = 30 bin_size = 5 if type_hist == 'fixed_bin_size': bins = np.arange(0, 100, bin_size) elif type_hist == 'fixed_number_bins': bins = np.linspace(math.ceil(min(data)), math.floor(max(data)), n_bins) plt.xlim([min(data)-5, max(data)+5]) plt.hist(data, bins=bins) plt.title(title) plt.xlabel(varname) #plt.ylabel('contagens') ax = plt.gca() # Get axis handle for text positioning plt.text(0.95, 0.95, text, horizontalalignment='right', verticalalignment='top', transform=ax.transAxes) plt.savefig(figname) plt.close() # Import CSV file into pandas dataframe df = pd.read_csv('dados.csv') # Call histogram function histogram('fixed_bin_size', df['valor'], 'var', 'lugar')
Na função “histogram”, também são calculadas a média dos dados e seu valor máximo, que são impressos no próprio gráfico. Você também pode alterar o script para que a variável extra seja o tamanho ou o número dos bins, desse modo sendo informado como um parâmetro da função.
Se a variável “density” (ou “normed”, nas versões mais antigas) for definida como True, os pesos serão normalizados, de modo que a integral da densidade na faixa permaneça 1 (o padrão é “None”).