Matplotlib.pyplot.bar, кажется, дает неправильные результаты - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь сделать небольшую гистограмму в matplotlib, но что-то не так:

import numpy as np
import matplotlib.pyplot as plt

bins = np.linspace(0, 1, 10) 

print(bins) # = [0. 0.11 0.22 0.33 0.44 0.55 0.66 0.77 0.88 1.]

plt.bar(bins, bins)

enter image description here

Я ожидаю лестницу от 0: 1 по обеим осям - я что-то упустил? Любые предложения будут полезны!

Я нахожусь на matplotlib 3.0.3:

pip freeze | grep matplotlib
# returns matplotlib==3.0.3

Ответы [ 2 ]

3 голосов
/ 16 мая 2019

Когда вы делаете plt.bar, ширина полосы по умолчанию составляет 1 0.8 (спасибо @Cohan), поэтому полосы перекрывают друг друга, как вы можете видеть на своем рисунке с помощьюпоследний бар.

Изменение на plt.bar(bins, bins, width=0.1) доходность:

enter image description here

1 голос
/ 16 мая 2019

Хотя другие ответы указывают на проблему, вам может быть интересно узнать, что вы можете регулировать ширину в соответствии с количеством точек данных, как указано ниже, а не указывать ее вручную.

P.S: Формула width = 1.0/(len(bins) + 1) - лучший выбор , особенно , когда ваши данные находятся в диапазоне от 0 до 1. См. Общую формулу ниже.Постоянная +1 в знаменателе при вычислении ширины является вопросом выбора.Вы также можете выбрать 2, 3 и т. Д., Чтобы уменьшить ширину.

import numpy as np
import matplotlib.pyplot as plt

bins = np.linspace(0, 1, 10) 
width = 1.0/(len(bins) + 1)

plt.bar(bins, bins, width=width)
plt.show()

enter image description here

Чтобы сделать это более общим, я пришелс этой формулой.Это будет работать, даже если ваши данные превышают 0 и 1

width = (max(bins) - min(bins)) * 1.0/(len(bins) + 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...