Как иметь логарифмические интервалы в гистограмме Python

Насколько я знаю, опция Log=True в функции гистограммы относится только к оси Y.

P.hist(d,bins=50,log=True,alpha=0.5,color='b',histtype='step')

Мне нужно, чтобы бункеры были равномерно распределены в log10. Есть ли что-то, что может это сделать?


person Brian    schedule 28.07.2011    source источник
comment
Вы должны разделить количество в каждой корзине на ширину корзины, если вы это сделаете!   -  person Peaceful    schedule 28.01.2016


Ответы (4)


используйте logspace() для создания геометрической последовательности и передайте ее параметру bins. И установите масштаб оси x в логарифмический масштаб.

import pylab as pl
import numpy as np

data = np.random.normal(size=10000)
pl.hist(data, bins=np.logspace(np.log10(0.1),np.log10(1.0), 50))
pl.gca().set_xscale("log")
pl.show()

введите здесь описание изображения

person HYRY    schedule 28.07.2011
comment
обратите внимание, что np.logspace(0.1,1.0,...) создаст диапазон от 10**0.1 до 10**1.0, а не от 0.1 до 1.0 - person Andre Holzner; 09.09.2015
comment
должно быть np.logspace(np.log10(0.1),np.log10(1.0),50) - person OrangeSherbet; 04.05.2016
comment
Смотрите мой ответ, как использовать bins='auto' - person N. McA.; 21.04.2018
comment
@AndreHolzner @OrangeSherbet Можно использовать np.geomspace для прямого указания конечных точек. . - person Nicolai Weitkemper; 29.05.2021

Самый прямой способ — просто вычислить log10 пределов, вычислить линейно разнесенные интервалы, а затем преобразовать обратно, возведя в степень 10, как показано ниже:

import pylab as pl
import numpy as np

data = np.random.normal(size=10000)

MIN, MAX = .01, 10.0

pl.figure()
pl.hist(data, bins = 10 ** np.linspace(np.log10(MIN), np.log10(MAX), 50))
pl.gca().set_xscale("log")
pl.show()

бункеры с интервалом log10

person Nimar    schedule 04.08.2014

Следующий код показывает, как вы можете использовать bins='auto' с логарифмической шкалой.

import numpy as np
import matplotlib.pyplot as plt

data = 10**np.random.normal(size=500)

_, bins = np.histogram(np.log10(data + 1), bins='auto')
plt.hist(data, bins=10**bins);
plt.gca().set_xscale("log")

диаграмма

person N. McA.    schedule 21.04.2018

В дополнение к тому, что было сказано, выполнение этого на кадрах данных pandas также работает:

some_column_hist = dataframe['some_column'].plot(bins=np.logspace(-2, np.log10(max_value), 100), kind='hist', loglog=True, xlim=(0,max_value))

Я бы предупредил, что может возникнуть проблема с нормализацией бинов. Каждый бин больше предыдущего, и поэтому его необходимо разделить на его размер, чтобы нормализовать частоты перед построением графика, и кажется, что ни мое решение, ни решение HYRY не учитывают этого.

Источник: https://arxiv.org/pdf/cond-mat/0412004.pdf< /а>

person Alaa Moussawi    schedule 26.10.2016