Вычисление максимального значения гистограммы
Как рассчитать максимальное значение гистограммы при построении графика?
Я хочу разместить линию на графике с аннотацией,и я хочу, чтобы текст был пропорционален максимальному значению оси 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')
производит следующим образом:
Я хотел бы передать аргумент 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.