Як мати логарифмічні бункери в гістограмі Пітона


82

Наскільки мені відомо, параметр Log = True у функції гістограми стосується лише осі y.

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

Мені потрібно, щоб бункери були рівномірно розташовані в log10. Чи є щось, що може це зробити?


1
Ви повинні поділити підрахунок у кожному контейнері на ширину кошика, якщо ви це зробите!
Мирний

Відповіді:


129

використовуйте logspace () для створення геометричної послідовності та передайте її параметру bins. І встановіть масштаб осі до часового масштабу.

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()

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


20
зауважимо, що np.logspace(0.1,1.0,...)буде створено діапазон від 10**0.1до 10**1.0, а не від 0.1до1.0
Андре Хольцнер

12
повинно бутиnp.logspace(np.log10(0.1),np.log10(1.0),50)
OrangeSherbet

1
Дивіться мою відповідь щодо використання bins = 'auto'
Н. Мака.

20

Найбільш прямий спосіб - просто обчислити 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 рознесених бункерів


10

Наступний код вказує, як можна використовувати 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")

діаграми


0

На додаток до сказаного, виконуючи це на кадрах даних панд, також працює:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.