Подтвердить что ты не робот

Логарифмические ячейки оси 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 действительно логарифмический (с кодом, как показано выше), но нет данных, построенных (без бункеров).

4b9b3361

Ответ 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)