Estou tentando plotar um histograma usando a matplotlib.hist()
função, mas não tenho certeza de como fazer isso.
Eu tenho uma lista
probability = [0.3602150537634409, 0.42028985507246375,
0.373117033603708, 0.36813186813186816, 0.32517482517482516,
0.4175257731958763, 0.41025641025641024, 0.39408866995073893,
0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327,
0.35398230088495575]
e uma lista de nomes (strings).
Como faço a probabilidade como meu valor y de cada barra e nomes como valores x?
python
matplotlib
visualization
data-visualization
DataVizGuys
fonte
fonte
Se você ainda não instalou o matplotlib, tente o comando.
Importação de biblioteca
Os dados do histograma:
Exibir histograma
E a saída é como:
fonte
Embora a questão pareça estar exigindo traçar um histograma usando a
matplotlib.hist()
função, pode-se argumentar que não pode ser feito usando o mesmo que a última parte da questão exige o uso das probabilidades fornecidas como os valores y das barras e os nomes dados (strings) como o valores x.Estou assumindo uma lista de exemplos de nomes correspondentes a determinadas probabilidades para desenhar o gráfico. Um gráfico de barra simples serve ao propósito aqui para o problema fornecido. O seguinte código pode ser usado:
fonte
Esta é uma maneira bastante circular de fazer isso, mas se você quiser fazer um histograma onde já conhece os valores bin, mas não tem os dados de origem, você pode usar a
np.random.randint
função para gerar o número correto de valores dentro do intervalo de cada bin para a função hist representar graficamente, por exemplo:quanto aos rótulos, você pode alinhar x ticks com bins para obter algo assim:
fonte
Esta é uma questão antiga, mas nenhuma das respostas anteriores abordou o problema real, ou seja, o fato de que o problema é com a própria questão.
Primeiro, se as probabilidades já foram calculadas, ou seja, os dados agregados do histograma estão disponíveis de forma normalizada, então as probabilidades deveriam somar 1. Elas obviamente não somam e isso significa que algo está errado aqui, seja com a terminologia ou com os dados ou na forma como a pergunta é feita.
Em segundo lugar, o fato de que os rótulos são fornecidos (e não intervalos) normalmente significaria que as probabilidades são de variável de resposta categórica - e o uso de um gráfico de barra para traçar o histograma é o melhor (ou algum hackeamento do método hist do pyplot), A resposta de Shayan Shafiq fornece o código.
No entanto, consulte o problema 1, essas probabilidades não estão corretas e usar o gráfico de barras neste caso como "histograma" seria errado porque não conta a história da distribuição univariada, por algum motivo (talvez as classes estão sobrepostas e as observações são contadas múltiplas vezes?) e esse gráfico não deve ser chamado de histograma neste caso.
O histograma é, por definição, uma representação gráfica da distribuição da variável univariada (consulte https://www.itl.nist.gov/div898/handbook/eda/section3/histogra.htm , https://en.wikipedia.org/wiki / Histograma) e é criado desenhando barras de tamanhos que representam contagens ou frequências de observações em classes selecionadas da variável de interesse. Se a variável for medida em uma escala contínua, essas classes são bins (intervalos). Parte importante do procedimento de criação de histograma é fazer a escolha de como agrupar (ou manter sem agrupar) as categorias de respostas para uma variável categórica, ou como dividir o domínio de valores possíveis em intervalos (onde colocar os limites do compartimento) para contínuos variável de tipo. Todas as observações devem ser representadas, e cada uma apenas uma vez na parcela. Isso significa que a soma dos tamanhos das barras deve ser igual à contagem total de observação (ou suas áreas no caso de larguras variáveis, que é uma abordagem menos comum). Ou, se o histograma for normalizado, todas as probabilidades devem somar 1.
Se os dados em si são uma lista de "probabilidades" como uma resposta, ou seja, as observações são valores de probabilidade (de algo) para cada objeto de estudo, então a melhor resposta é simplesmente
plt.hist(probability)
com a opção talvez binning, e o uso de rótulos x já disponíveis é suspeito.Então o gráfico de barra não deve ser usado como histograma, mas simplesmente
com os resultados
matplotlib, nesse caso, chega por padrão com os seguintes valores de histograma
o resultado é uma tupla de matrizes, a primeira matriz contém contagens de observação, ou seja, o que será mostrado contra o eixo y do gráfico (somam 13, número total de observações) e a segunda matriz são os limites de intervalo para x -eixo.
Pode-se verificar se eles estão igualmente espaçados,
Ou, por exemplo, para 3 bins (minha opinião é de 13 observações), obter-se-ia este histograma
com os dados do gráfico "atrás das barras" sendo
O autor da pergunta precisa esclarecer qual é o significado da lista de valores de "probabilidade" - é a "probabilidade" apenas um nome da variável de resposta (então por que existem rótulos x prontos para o histograma, não faz sentido ), ou os valores da lista são as probabilidades calculadas a partir dos dados (então, o fato de eles não somarem 1 não faz sentido).
fonte