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?


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í


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


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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.