2013-08-21 4 views
3

Как я мог получить кумулятивную гистограмму, как этоНакопительной гистограммы с ggplot2

x <- runif(100,0,10) 
h <- hist(x) 
h[["counts"]] <- cumsum(h[["counts"]]) 
plot(h) 

с ggplot2?

Я хочу также, чтобы нарисовать многоугольник как этого

lines(h[["breaks"]],c(0,h[["counts"]])) 

+0

Как насчет добавления сюжета в качестве изображения? – ziggystar

+0

В моем ответе ниже я дал репликацию выстрела. Вы можете приблизиться к '' theme_bw() '' или '' theme_classic() ''. – PatrickT

ответ

10

Чтобы сделать кумулятивное использование гистограммы geom_histogram(), а затем использовать cumsum(..count..) для y значений. Совокупную строку можно добавить с stat_bin() и geom="line" и y значениями, рассчитанными как cumsum(..count..).

ggplot(NULL,aes(x))+geom_histogram(aes(y=cumsum(..count..)))+ 
     stat_bin(aes(y=cumsum(..count..)),geom="line",color="green") 

enter image description here

+0

Можно ли рисовать многоугольник, как в вопросе? –

+0

Спасибо, что ответили так быстро, но это не совсем то, что мне нужно. Если вы внимательно наблюдаете за полигоном в вопросе, каждый сегмент заканчивается в верхнем правом углу панели, а не посередине. –

+1

Если кто-то задается вопросом, откуда эта магия. .. .. .., см. Здесь: http://stackoverflow.com/questions/14570293/special-variables-in-ggplot-count-density-etc – Mischa

1

Опираясь на ответ Дидзиса, вот способ, чтобы получить (автор: Hadley) ggplot2 данных в geom_line воспроизвести внешний вид base R hist.

Краткое описание: для получения бункеров в положение так же, как основание R, я установил binwidth=1 и boundary=0. Чтобы получить аналогичный вид, я использовал color=black и fill=white. И чтобы получить то же положение сегментов линии, я использовал ggplot_build. Вы найдете другие ответы Дидзиса, которые используют этот трюк.

# make a dataframe for ggplot 
set.seed(1) 
x = runif(100, 0, 10) 
y = cumsum(x) 
df <- data.frame(x = sort(x), y = y) 

# make geom_histogram 
p <- ggplot(data = df, aes(x = x)) + 
    geom_histogram(aes(y = cumsum(..count..)), binwidth = 1, boundary = 0, 
       color = "black", fill = "white") 

# extract ggplot data 
d <- ggplot_build(p)$data[[1]] 

# make a data.frame for geom_line and geom_point 
# add (0,0) to mimick base-R plots 
df2 <- data.frame(x = c(0, d$xmax), y = c(0, d$y)) 

# combine plots: note that geom_line and geom_point use the new data in df2 
p + geom_line(data = df2, aes(x = x, y = y), 
     color = "darkblue", size = 1) + 
    geom_point(data = df2, aes(x = x, y = y), 
     color = "darkred", size = 1) + 
    ylab("Frequency") + 
    scale_x_continuous(breaks = seq(0, 10, 2)) 

# save for posterity 
ggsave("ggplot-histogram-cumulative-2.png") 

Могут быть более легкие пути, которые вас увидят! Так как объект ggplot также сохраняет два других значения x: минимальный и максимальный. Таким образом, вы можете сделать другие многоугольники с помощью этой функции удобства:

# Make polygons: takes a plot object, returns a data.frame 
get_hist <- function(p, pos = 2) { 
    d <- ggplot_build(p)$data[[1]] 
    if (pos == 1) { x = d$xmin; y = d$y; } 
    if (pos == 2) { x = d$x; y = d$y; } 
    if (pos == 3) { x = c(0, d$xmax); y = c(0, d$y); } 
    data.frame(x = x, y = y) 
} 
df2 = get_hist(p, pos = 3) # play around with pos=1, pos=2, pos=3 

enter image description here enter image description here enter image description here

+0

Я знаю, что вопрос 4 года, но я искал способ сделать это и в конечном итоге сам разобрался. Поскольку мне потребовалось немного усилий, я подумал, что поделюсь им здесь. – PatrickT