你想要這樣的東西嗎?
p1 <- ggplot(data = df.v)+
geom_bar(aes(val.clss)) + geom_vline(xintercept = 3.5, col='red', lwd=2)
plot(p1)
更通用的解決方案可能是這樣的:
df.v <- data.frame(val = rnorm(1000, mean=15, sd=4))
df.v$val.clss <- cut(df.v$val, seq(min(df.v$val), max(df.v$val), 1))
lvls <- levels(df.v$val.clss)
lvls
[1] "(2.97,3.97]" "(3.97,4.97]" "(4.97,5.97]" "(5.97,6.97]" "(6.97,7.97]" "(7.97,8.97]" "(8.97,9.97]" "(9.97,11]" "(11,12]" "(12,13]"
[11] "(13,14]" "(14,15]" "(15,16]" "(16,17]" "(17,18]" "(18,19]" "(19,20]" "(20,21]" "(21,22]" "(22,23]"
[21] "(23,24]" "(24,25]" "(25,26]" "(26,27]" "(27,28]" "(28,29]" "(29,30]"
vline.level <- '(18,19]' # you want to draw line here, right before 18
p1 <- ggplot(data = df.v)+
+ geom_bar(aes(val.clss)) + geom_vline(xintercept = which(lvls == vline.level) - 0.5, col='red', lwd=2) +
+ theme(axis.text.x = element_text(angle=90, vjust = 0.5))
plot(p1)
如果您想選擇最中間的水平,
length(lvls)
#[1] 27
# choose the middlemost level, since length(lvls) is odd in this case, the midpoint will be ceiling(length(lvls)/2)
vline.level <- lvls[ceiling(length(lvls)/2)]
p1 <- ggplot(data = df.v)+
geom_bar(aes(val.clss)) + geom_vline(xintercept = which(lvls == vline.level) - 0.5, col='red', lwd=2) +
theme(axis.text.x = element_text(angle=90, vjust = 0.5))
plot(p1)
謝謝,這應該在理論上起作用。但是,當我將上面的示例代碼更改爲 'cut(df.v $ val,seq(min(df.v $ val),max(df.v $ val),0.2))' 因此有34個類,然後選擇16.5作爲xintercept,它離右側太遠了。 我不知道爲什麼,你能幫忙嗎?非常感謝。 那麼,我發現,當我使用'長度(水平(df.v $ val.clss))'它顯示我34,但是當我計算酒吧,我只能達到30酒吧。這似乎是我的問題的根源。 – rashid
這很可能是由沒有值的類別引起的。 'ggplot'會默認放棄這些,這會影響劇情的級別。查看一些可選解決方案的編輯。但是請注意,應該謹慎使用'droplevels',因爲它通常不是連續數據的好主意。 –
謝謝,'scale_x_discrete(drop = FALSE)'做了自動計算的竅門。我非常感謝幫助。 – rashid