HOWTO · Matplotlib
Como definir manualmente a largura das classes de um histograma no Matplotlib
Para controlar a largura das classes em um histograma unidimensional no Matplotlib, passe os dados e uma sequência de limites para `plt.hist(..., bins=...)`.
Nesta página
Para controlar as larguras das classes em um histograma unidimensional no Matplotlib, passe os dados e uma sequência de limites para plt.hist(..., bins=...). Cada par de limites adjacentes define um intervalo, portanto a sequência pode criar classes de larguras iguais ou diferentes. hist2d() é usado para histogramas bidimensionais; os exemplos aqui usam plt.hist().
Limites das classes como parâmetro da função hist()
Use uma sequência de limites quando quiser escolher onde os intervalos começam e terminam. Por exemplo, [0, 10, 20, 30, 40, 50, 60, 80, 100] cria oito classes: as seis primeiras têm largura 10, e as duas últimas têm largura 20. O número de classes é um a menos que o número de limites. Valores abaixo do primeiro limite ou acima do último não são contabilizados no histograma, então escolha um intervalo que cubra as observações que deseja incluir.
Quando todas as classes devem ter a mesma largura, gere limites igualmente espaçados com np.arange. O exemplo abaixo compara limites escolhidos com limites de largura igual para os mesmos valores. Como np.arange(start, stop, step) inclui start e exclui stop, o valor de parada deve ultrapassar a maior observação para que ela seja incluída.
import matplotlib.pyplot as plt
import numpy as np
values = np.array([3, 8, 12, 18, 24, 31, 37, 43, 52, 61, 74, 88, 96])
width = 10
explicit_edges = [0, 10, 20, 30, 40, 50, 60, 80, 100]
equal_edges = np.arange(0, 101, width)
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
axes[0].hist(values, bins=explicit_edges)
axes[0].set_title("Chosen boundaries")
axes[1].hist(values, bins=equal_edges)
axes[1].set_title("Equal-width bins")
for axis in axes:
axis.set_xlabel("Value")
axis.set_ylabel("Count")
fig.tight_layout()
plt.show()
Para criar classes de largura igual a partir dos dados, uma opção prática é usar max(values) + width como valor de parada. Como np.arange exclui o valor de parada, ele não se torna um limite. Com estes valores, a parada é 106 e o último limite gerado é 100, que ainda abrange a observação máxima, 96. Se o intervalo dos dados ou a largura mudar, calcule os limites com os dados atuais em vez de manter uma lista fixa.
Calcular o número de classes a partir da largura desejada
Se o intervalo dos dados só for conhecido quando o programa executar, derive os primeiros e últimos limites a partir das observações. Este exemplo arredonda o primeiro limite para baixo até um múltiplo da largura solicitada e estende o limite final até um múltiplo igual ou superior ao valor máximo. Ele pressupõe um conjunto de dados numéricos não vazio e uma largura positiva. As classes das extremidades podem ultrapassar o intervalo dos dados; a distância entre cada par de limites adjacentes continua sendo a largura solicitada.
import matplotlib.pyplot as plt
import numpy as np
values = np.array([3, 8, 12, 18, 24, 31, 37, 43, 52, 61, 74, 88, 96])
width = 10.0
first_edge = np.floor(values.min() / width) * width
last_edge = np.ceil(values.max() / width) * width
edges = np.arange(first_edge, last_edge + width, width)
plt.hist(values, bins=edges)
plt.xlabel("Value")
plt.ylabel("Count")
plt.title(f"Histogram with bin width {width:g}")
plt.show()
Neste caso, o mínimo é 3 e o máximo é 96, então os limites gerados vão de 0 a 100, em incrementos de 10. As observações são contabilizadas nesses intervalos, e o histograma usa a largura solicitada. Para usar outra largura, atualize width; o mesmo cálculo gera a sequência de limites correspondente. Se os dados estiverem vazios ou a largura não for positiva, trate essa entrada antes de calcular os limites.