2016-09-23 13 views
5

Bir histogramı (veya stat_bin kullanarak bir adım çizim) görüntülemek ve geom_point kullanarak üzerinde bir kaç nokta kaplamak için ggplot kullanmak wan.Bir geom_histogram veya stat_bin üzerinde geom_points overlaying

library(plotrix) 
set.seed(10) 
df <- data.frame(id=LETTERS,val=rnorm(length(LETTERS))) 
selected.ids <- sample(LETTERS,3,replace=F) 
h <- hist(df$val,plot=F,breaks=10) 
cols <- sapply(rainbow(length(selected.ids)),function(x) color.id(x)[1]) 
selected.df <- data.frame(id=selected.ids,col=cols,stringsAsFactors=F) 
selected.df$x <- df$val[which(df$id %in% selected.ids)] 
selected.df <- selected.df[order(selected.df$x),] 
selected.df$y <- h$counts[findInterval(selected.df$x,h$breaks)] 
selected.df$col <- factor(selected.df$col,levels=cols) 
plot(h) 
segments(x0=selected.df$x,x1=selected.df$x,y0=selected.df$y,y1=selected.df$y,cex=18,lwd=8,col=selected.df$col) 

verir:

enter image description here

Ancak ggplot çalıştığınızda:

ggplot(df,aes(x=val))+geom_histogram(bins=10,colour="black",alpha=0,fill="#FF6666")+geom_point(data=selected.df,aes(x=x,y=y,colour=factor(col)),size=2)+scale_fill_manual(values=levels(selected.df$col),labels=selected.df$id,name="id")+scale_colour_manual(values=levels(selected.df$col),labels=selected.df$id,name="id") 

puan ve histogram yanlış hizalanmış şunlardır: Burada

bir base uygulama varHemen hemen geom_histogram

enter image description here

gibi

ggplot(df,aes(x=val))+stat_bin(geom="step",bins=10)+geom_point(data=selected.df,aes(x=x,y=y,colour=factor(col)),size=2)+scale_fill_manual(values=levels(selected.df$col),labels=selected.df$id,name="id")+scale_colour_manual(values=levels(selected.df$col),labels=selected.df$id,name="id") 

görünüyor ama aynı zamanda ben de almak istiyorum:enter image description here

İdeal bir adım arsa kullanarak çizmek istiyorum satırın uçları y = 0 çizgisine dokunun.

Bu yüzden stat_bin kullanarak bir adım çiziminde doğru şekilde alıyorum?

cevap

2

Kişisel selected.df 'ın y.valuesbreakshist() kullanımları ile yapılmış, ancak geom_histogram() başka breaks kullanır. (geom_histogram(bins), sadece emin olmak için hist(breaks)'a eşdeğer değildir). Ek olarak, adım çiziminde, yukarı aşağı breaks'un orta değerlerinde gerçekleşir. ggplot_build(gg.obj)$data (veya plot(gg.obj)$data) size bazı bilgiler, kesmeler, sayımlar vb. Verir.

geom_histgram
yolu temelde base.plot aynıdır. base.plot ile aynı çıktıyı isterseniz, bars = 10 yerine breaks = h$breaks kullanın.

# (1) make a histogram 
g <- ggplot(df, aes(x = val)) + geom_histogram(bins = 10, colour = "black", alpha = 0, fill = "#FF6666") 
    # base; h <- hist(df$val, plot = F, breaks = 10) 

# (2) get its breaks 
g.data <- ggplot_build(g)$data[[1]] 
g.breaks <- c(g.data$xmin, tail(g.data$xmax, n=1)) 
    # base; h$breaks 

# (3) get counts of specific x values 
selected.df$y <- g.data$count[findInterval(selected.df$x, g.breaks)] 
    # base; selected.df$y <- h$counts[findInterval(selected.df$x,h$breaks)] 

# (4) draw 
g + geom_point(data = selected.df, aes(x = x, y = y, colour = factor(col)), size = 2) + 
    scale_fill_manual(values = levels(selected.df$col), labels = selected.df$id,name = "id") + 
    scale_colour_manual(values = levels(selected.df$col), labels = selected.df$id, name = "id") 

# a common part to base and ggplot2 
library(plotrix) 
set.seed(10) 
df <- data.frame(id = LETTERS, val = rnorm(length(LETTERS))) 
selected.ids <- sample(LETTERS, 3, replace = F) 
cols <- sapply(rainbow(length(selected.ids)), function(x) color.id(x)[1]) 
selected.df <- data.frame(id=selected.ids, col=cols, stringsAsFactors = F) 
selected.df$x <- df$val[which(df$id %in% selected.ids)] 
selected.df <- selected.df[order(selected.df$x),] 
selected.df$col <- factor(selected.df$col, levels=cols) 
enter image description here

Sen geom_histgram aynı şekilde bunu çizebilirsiniz
stat_bin. Önemli nokta yukarı-aşağı kırılma değil orta değerler olur.

selected.df2 <- selected.df 

# (1) make a step plot 
s <- ggplot(df, aes(x = val)) + stat_bin(geom = "step", bins = 10) 

# (2) get breaks and its middle values 
s.data <- ggplot_build(s)$data[[1]] 
s.breaks <- c(s.data$xmin, tail(s.data$xmax, n=1)) 
s.mid.breaks <- s.data$x 

# (3) get counts of specific x values using middle values of breaks. 
selected.df2$y <- s.data$count[findInterval(selected.df2$x, s.mid.breaks)] 

# (4) add a new levels into breaks to start and end at y=0 
s.add.breaks <- c(s.breaks[1] - 1.0E-6, # making lower levels is easy 
        s.breaks, 
        tail(s.breaks, n=1) + diff(s.breaks[1:2])) # upper need the same range 

# (5) draw 
ggplot(df, aes(x = val)) + stat_bin(geom = "step", breaks = s.add.breaks) + 
    geom_point(data = selected.df2, aes(x = x, y = y, colour = factor(col)), size = 2) + 
    scale_fill_manual(values = levels(selected.df2$col), labels = selected.df2$id, name = "id") + 
    scale_colour_manual(values = levels(selected.df2$col), labels = selected.df2$id, name="id") 

enter image description here

İlgili konular