2012-03-31 17 views
6

¿Cómo puedo calcular el valor máximo del histograma al hacer un trazado?Cálculo del valor máximo del histograma

Quiero colocar una línea en un diagrama con una anotación, y quiero que el texto sea la posición proporcional al valor máximo del eje y. Por ejemplo:

library(ggplot2) 
df <- data.frame(x = runif(1000)) 


p <- ggplot(data=df, aes(x)) + geom_histogram() 
p + geom_vline(aes(xintercept=0.5),color='red') + geom_text(aes(0.55, 10, label='line'), angle = 90, color='red') 

produce lo siguiente:

enter image description here

me gustaría pasar un argumento a geom_text() que es 1/3 del valor del histograma máximo ya que creo que es la mejor manera de posicionamiento el texto consistentemente, pero no sé cómo calcular este valor count.

Respuesta

3

stat_bin utiliza binwidth = gama/30 por defecto. No estoy seguro exactamente cómo se calcula, pero esto debería ser una aproximación bastante razonable:

max(table(cut(df$x,seq(min(df$x),max(df$x),dist(range(df$x))/30)))) 
+0

No te olvides de multiplicar por 1/3 :) –

1

En general, una simple búsqueda de 1 dimensión de búsqueda máxima se implementa de la siguiente manera (en mi caso, en ANSI-C);

#include <stdio.h> 
#include <errno.h> 
int printMaxHistValue(int* yValues, int* xValues, int numPoints) { 
    int i, currentY=0, currentX=0, maxX=0, maxY=0, maxIndex=0; 

    if(numPoints <= 0) { 
    printf("Invalid number of points in histogram! Need at least 1 point! Exiting"); 
    return EINVAL; 
    } 


    // Find the values 
    for(i=0; i<numPoints; i++) { 
    currentX = xValues[i]; 
    currentY = yValues[i]; 
    if(currentY > maxY) { 
     maxY = currentY; 
     maxX = currentX; 
     maxIndex = i; 
    } 
    } 

    // Finished with search 
    printf("Found the maximum histogram value of y=%d at bin/x-value of %d (which corresponds to i=%d)",maxY,maxX,maxIndex); 

    // Done 
    return EOK; 
} 

Esperanza este ejemplo ayude :)

1

usted podría utilizar la función hist, que calcula los recuentos. Solo asegúrate de pasar el mismo contenedor de saltos como geom_histogram. En el caso de no proporcionar un binwidth para geom_histogram, el valor predeterminado es range/30. De su análisis de cómo geom_histogram genera los contenedores Creo que esto debería funcionar:

require(plyr) 
min.brea <- round_any(min(df$x), diff(range(df$x))/30, floor) 
max.brea <- round_any(max(df$x), diff(range(df$x))/30, ceiling) 
breaks <- seq(min.brea, max.brea, diff(range(df$x/30))) 
histdata <- hist(df$x, breaks=breaks, plot=FALSE, right=FALSE) 
max.value <- max(histdata$counts) 

la función round_any es de plyr.

Cuestiones relacionadas