Логарифмические ячейки оси y в python
Я пытаюсь создать гистограмму столбца данных и построить его логарифмически (y-axis
), и я не уверен, почему следующий код не работает:
import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt('foo.bar')
fig = plt.figure()
ax = fig.add_subplot(111)
plt.hist(data, bins=(23.0, 23.5,24.0,24.5,25.0,25.5,26.0,26.5,27.0,27.5,28.0))
ax.set_xlim(23.5, 28)
ax.set_ylim(0, 30)
ax.grid(True)
plt.yscale('log')
plt.show()
Я также попытался вместо plt.yscale('log')
добавить Log=true
в строку plt.hist
, а также попытался ax.set_yscale('log')
, но ничего не работает. Я либо получаю пустой сюжет, либо y-axis
действительно логарифмический (с кодом, как показано выше), но нет данных, построенных (без бункеров).
Ответы
Ответ 1
попробуйте
plt.yscale('log', nonposy='clip')
http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.yscale
Проблема заключается в том, что нижняя часть барин находится в y = 0, а по умолчанию - маскировать допустимые точки (log(0)
→ undefined) при выполнении преобразования журнала (было обсуждение изменения этого параметра, но я не помню, как это происходило), поэтому, когда он пытается нарисовать прямоугольники для экрана штриховки, нижний край маскируется → нет прямоугольников.
Ответ 2
np.logspace возвращает ячейки в [1-10]
, логарифмически разнесенные - в моем случае xx является npvector > 0, поэтому следующий код выполняет трюк
logbins=np.max(xx)*(np.logspace(0, 1, num=1000) - 1)/9
hh,ee=np.histogram(xx, density=True, bins=logbins)