2012-03-31 109 views
6

Làm cách nào để tính toán giá trị biểu đồ tối đa khi tạo một ô?Tính giá trị biểu đồ tối đa

Tôi muốn đặt một dòng trên một ô có chú thích và tôi muốn văn bản ở vị trí tỷ lệ thuận với giá trị tối đa trục y. Ví dụ:

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

sản xuất như sau:

enter image description here

Tôi muốn vượt qua một cuộc tranh cãi để geom_text() đó là 1/3 giá trị biểu đồ max như tôi nghĩ rằng đây là cách tốt nhất để định vị văn bản nhất quán, nhưng tôi không biết cách tính giá trị count này.

Trả lời

3

stat_bin sử dụng binwidth = phạm vi/30 theo mặc định. Tôi không chắc chắn chính xác cách tính toán nhưng điều này phải là một xấp xỉ khá hợp lý:

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

Đừng quên nhân với 1/3 :) –

1

Nói chung, tìm kiếm tìm kiếm tối đa 1 chiều đơn giản được thực hiện như sau (trong trường hợp của tôi, trong 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; 
} 

Hope ví dụ này giúp :)

1

Bạn có thể sử dụng hàm lịch sử để tính số lượng. Chỉ cần chắc chắn rằng bạn vượt qua nó cùng một thùng vỡ như geom_histogram. Trong trường hợp không cung cấp một băng thông để geom_histogram nó mặc định phạm vi/30. Từ việc xem cách geom_histogram tạo ra các thùng, tôi nghĩ rằng điều này sẽ hoạt động:

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) 

hàm round_any là từ plyr.

Các vấn đề liên quan