import matplotlib.pyplot as plt
import numpy as np
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
hist, bins = np.histogram(x, bins=50)
width = 0.7 * (bins[1] - bins[0])
center = (bins[:-1] + bins[1:]) / 2
plt.bar(center, hist, align='center', width=width)
plt.show()
A interface orientada a objetos também é direta:
fig, ax = plt.subplots()
ax.bar(center, hist, align='center', width=width)
fig.savefig("1.png")
Se estiver usando escaninhos personalizados (não constantes), você pode passar calcular as larguras usando np.diff
, passar as larguras para ax.bar
e usar ax.set_xticks
para rotular as bordas do depósito:
import matplotlib.pyplot as plt
import numpy as np
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
bins = [0, 40, 60, 75, 90, 110, 125, 140, 160, 200]
hist, bins = np.histogram(x, bins=bins)
width = np.diff(bins)
center = (bins[:-1] + bins[1:]) / 2
fig, ax = plt.subplots(figsize=(8,3))
ax.bar(center, hist, align='center', width=width)
ax.set_xticks(bins)
fig.savefig("/tmp/out.png")
plt.show()
plt.bar
Owidth
parâmetro de @CMCDragonkai: pode aceitar um objeto do tipo array (em vez de um escalar). Então você pode usar emwidth = np.diff(bins)
vez dewidth = 0.7 * (bins[1] - bins[0])
.width
configuração por si só define a largura da barra, certo? Estou falando sobre os rótulos do eixo x (ou seja, quero ver as bordas reais do compartimento sendo rótulos no eixo x). Deve ser semelhante a comoplt.hist
funciona.ax.set_xticks
para definir os xlabels. Eu adicionei um exemplo acima para mostrar o que quero dizer.Se você não quiser barras, pode representá-lo assim:
fonte
ax.step
.Sei que isso não responde à sua pergunta, mas sempre acabo nesta página, quando procuro a solução matplotlib para histogramas, porque o simples
histogram_demo
foi removido da página da galeria de exemplos matplotlib.Aqui está uma solução, que não precisa
numpy
ser importada. Eu apenas importo numpy para gerar os dadosx
a serem plotados. Ele depende da função emhist
vez da funçãobar
como na resposta de @unutbu.Verifique também a galeria matplotlib e os exemplos matplotlib .
fonte
Se você estiver disposto a usar
pandas
:fonte
pandas
, provavelmente deve incluir um link para o site deles e um exemplo mais abrangente que explica o que está acontecendo.Acho que isso pode ser útil para alguém.
A função de histograma do Numpy, para meu aborrecimento (embora, eu aprecie que haja uma boa razão para isso), retorna as bordas de cada caixa, em vez do valor da caixa. Embora isso faça sentido para números de ponto flutuante, que podem estar dentro de um intervalo (ou seja, o valor central não é super significativo), esta não é a saída desejada ao lidar com valores discretos ou inteiros (0, 1, 2, etc) . Em particular, o comprimento dos bins retornados de np.histograma não é igual ao comprimento das contagens / densidade.
Para contornar isso, usei np.digitize para quantizar a entrada e retornar um número discreto de caixas, junto com a fração de contagens para cada caixa. Você pode editar facilmente para obter o número inteiro de contagens.
Refs:
[1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html
[2] https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html
fonte