Cómo tener contenedores logarítmicos en un histograma de Python

82

Hasta donde yo sé, la opción Log = True en la función de histograma solo se refiere al eje y.

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

Necesito que los contenedores estén igualmente espaciados en log10. ¿Hay algo que pueda hacer esto?

Brian
fuente
1
¡Debe dividir el recuento en cada contenedor por el ancho del contenedor si lo hace!
Pacífico

Respuestas:

129

use logspace () para crear una secuencia geométrica y páselo al parámetro bins. Y establezca la escala del eje x en escala logarítmica.

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

ingrese la descripción de la imagen aquí

HYRY
fuente
20
tenga en cuenta que np.logspace(0.1,1.0,...)creará un rango desde 10**0.1hasta 10**1.0, no desde 0.1hasta1.0
Andre Holzner
12
debería sernp.logspace(np.log10(0.1),np.log10(1.0),50)
OrangeSherbet
1
Vea mi respuesta sobre cómo usar bins = 'auto'
N. McA.
20

La forma más directa es simplemente calcular el log10 de los límites, calcular los bins espaciados linealmente y luego volver a convertir aumentando a la potencia de 10, como se muestra a continuación:

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 contenedores espaciados

Nimar
fuente
10

El siguiente código indica cómo se puede utilizar bins='auto'con la escala logarítmica.

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

gráfico

N. McA.
fuente
0

Además de lo que se dijo, realizar esto en marcos de datos de pandas también funciona:

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

Les advierto que puede haber un problema con la normalización de los contenedores. Cada bin es más grande que el anterior y, por lo tanto, debe dividirse por su tamaño para normalizar las frecuencias antes de graficar, y parece que ni mi solución ni la de HYRY tienen en cuenta esto.

Fuente: https://arxiv.org/pdf/cond-mat/0412004.pdf

Alaa Moussawi
fuente