Вычисление максимального значения гистограммы

Как рассчитать максимальное значение гистограммы при построении графика?

Я хочу разместить линию на графике с аннотацией,и я хочу, чтобы текст был пропорционален максимальному значению оси Y. Например:

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

производит следующим образом:

enter image description here

Я хотел бы передать аргумент geom_text() что это 1/3 максимального значения гистограммы, поскольку я думаю, что это лучший способ позиционирования текста последовательно, но я не знаю, как это вычислить count значение.

3 ответов


stat_bin по умолчанию используется binwidth=range/30. Я не уверен точно, как это вычисляется, но это должно быть довольно разумное приближение:

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

В общем случае простой 1-мерный поиск max-finding реализуется следующим образом (в моем случае, в 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;
}

надеюсь, этот пример поможет :)


вы можете использовать функцию hist, которая вычисляет количество. Просто убедитесь, что вы передаете ему те же разрывы Бина, что и geom_histogram. В случае не предоставления binwidth для geom_histogram по умолчанию используется значение range / 30. Глядя на то, как geom_histogram генерирует бункеры, я думаю, что это должно работать:

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)

функция round_any из plyr.