Sé cómo crear un histograma (solo use "con cuadros") en gnuplot si mi archivo .dat ya tiene datos correctamente agrupados. ¿Hay alguna manera de tomar una lista de números y hacer que gnuplot proporcione un histograma basado en rangos y tamaños de bin que proporciona el usuario?
202
Respuestas:
sí, y es rápido y simple aunque muy oculto:
echa un vistazo
help smooth freq
para ver por qué lo anterior hace un histogramapara lidiar con rangos solo configure la variable xrange.
fuente
set boxwidth binwidth
a lo anterior. Fue realmente útil para mí.Tengo un par de correcciones / adiciones a la muy útil respuesta de Born2Smile:
set boxwidth binwidth
bin
función:bin(x,width)=width*floor(x/width) + width/2.0
fuente
bin(x,width)=width*floor(x/width) + binwidth/2.0
(flotante cálculos de punto)bin(x,width)=width*floor(x/width) + width/2.0
. Si lo estamos pasandowidth
como argumento, úselo. :-)Tenga mucho cuidado: todas las respuestas en esta página están tomando implícitamente la decisión de dónde comienza el binning (el borde izquierdo del bin más a la izquierda, si lo desea) fuera de las manos del usuario. Si el usuario combina cualquiera de estas funciones para agrupar datos con su propia decisión sobre dónde comienza la agrupación (como se hace en el blog que está vinculado a arriba), las funciones anteriores son todas incorrectas. Con un punto de partida arbitrario para binning 'Min', la función correcta es:
Puede ver por qué esto es correcto secuencialmente (ayuda a dibujar algunos contenedores y un punto en algún lugar de uno de ellos). Resta Min de tu punto de datos para ver qué tan lejos está en el rango de binning. Luego divida por ancho de bandeja para que esté trabajando efectivamente en unidades de 'contenedores'. Luego 'piso' el resultado para ir al borde izquierdo de ese contenedor, agregue 0.5 para ir al centro del contenedor, multiplique por el ancho para que ya no trabaje en unidades de contenedores sino en una escala absoluta nuevamente, luego finalmente agregue nuevamente el desplazamiento Mín que resta al principio.
Considere esta función en acción:
Por ejemplo, el valor 1.1 realmente cae en el contenedor izquierdo:
La respuesta de Born2Smile solo es correcta si los límites de bin ocurren en (n + 0.5) * binwidth (donde n se ejecuta sobre enteros). La respuesta de mas90 solo es correcta si los límites de bin ocurren en n * binwidth.
fuente
¿Quieres trazar un gráfico como este? ¿si? Entonces puedes echar un vistazo al artículo de mi blog: http://gnuplot-surprising.blogspot.com/2011/09/statistic-analysis-and-histogram.html
Líneas clave del código:
fuente
Como de costumbre, Gnuplot es una herramienta fantástica para trazar gráficos atractivos y se puede hacer para realizar todo tipo de cálculos. Sin embargo , está destinado a trazar datos en lugar de servir como una calculadora y, a menudo, es más fácil usar un programa externo (por ejemplo, Octave) para hacer los cálculos más "complicados", guardar estos datos en un archivo y luego usar Gnuplot para producir la gráfica. Para el problema anterior, verifique que la función "hist" esté usando Octave
[freq,bins]=hist(data)
, luego trace esto en Gnuplot usandofuente
Esta discusión me ha resultado extremadamente útil, pero he experimentado algunos problemas de "redondeo".
Más precisamente, usando un ancho de bin de 0.05, he notado que, con las técnicas presentadas aquí arriba, los puntos de datos que leen 0.1 y 0.15 caen en el mismo bin. Esto (comportamiento obviamente no deseado) probablemente se deba a la función "piso".
De aquí en adelante es mi pequeña contribución para tratar de eludir esto.
Este método recursivo es para x> = 0; uno podría generalizar esto con declaraciones más condicionales para obtener algo aún más general.
fuente
No necesitamos usar un método recursivo, puede ser lento. Mi solución está utilizando una función definida por el usuario rint en lugar de la función intrínseca int o floor.
Esta función dará
rint(0.0003/0.0001)=3
, mientrasint(0.0003/0.0001)=floor(0.0003/0.0001)=2
.¿Por qué? Mire la función Perl int y los ceros de relleno
fuente
Tengo una pequeña modificación a la solución de Born2Smile.
Sé que eso no tiene mucho sentido, pero es posible que lo desee por si acaso. Si sus datos son enteros y necesita un tamaño de contenedor flotante (tal vez para comparar con otro conjunto de datos, o densidad de trazado en una cuadrícula más fina), deberá agregar un número aleatorio entre 0 y 1 dentro del piso. De lo contrario, habrá picos debido al error de redondeo.
floor(x/width+0.5)
no funcionará porque creará un patrón que no sea fiel a los datos originales.fuente
Con respecto a las funciones de binning, no esperaba el resultado de las funciones ofrecidas hasta ahora. Es decir, si mi ancho de bandeja es 0.001, estas funciones centran las bandejas en 0.0005 puntos, mientras que siento que es más intuitivo tener las bandejas centradas en los límites de 0.001.
En otras palabras, me gustaría tener
La función binning que se me ocurrió es
Aquí hay un script para comparar algunas de las funciones bin ofrecidas con esta:
y aquí está la salida
fuente